2003-08-20 21:12:52 +02:00
|
|
|
|
# -*- coding: iso-8859-15 -*-
|
2003-09-01 18:59:18 +02:00
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
# Glasnost
|
|
|
|
|
# By: Odile B<>nassy <obenassy@entrouvert.com>
|
2003-03-04 01:41:10 +01:00
|
|
|
|
# Romain Chantereau <rchantereau@entrouvert.com>
|
2003-05-13 12:07:32 +02:00
|
|
|
|
# Nicolas Clapi<70>s <nclapies@easter-eggs.org>
|
2003-04-17 01:29:07 +02:00
|
|
|
|
# Pierre-Antoine Dejace <padejace@entrouvert.be>
|
2002-10-19 15:00:35 +02:00
|
|
|
|
# Thierry Dulieu <tdulieu@easter-eggs.com>
|
2003-04-17 01:29:07 +02:00
|
|
|
|
# Florent Monnier <monnier@codelutin.com>
|
2003-05-13 12:07:32 +02:00
|
|
|
|
# C<>dric Musso <cmusso@easter-eggs.org>
|
2003-03-04 01:41:10 +01:00
|
|
|
|
# Fr<46>d<EFBFBD>ric P<>ters <fpeters@entrouvert.be>
|
2002-10-19 15:00:35 +02:00
|
|
|
|
# Benjamin Poussin <poussin@codelutin.com>
|
|
|
|
|
# Emmanuel Raviart <eraviart@entrouvert.com>
|
2003-05-15 18:49:30 +02:00
|
|
|
|
# S<>bastien R<>gnier <regnier@codelutin.com>
|
2002-10-19 15:00:35 +02:00
|
|
|
|
# Emmanuel Saracco <esaracco@easter-eggs.com>
|
|
|
|
|
#
|
|
|
|
|
# Copyright (C) 2000, 2001 Easter-eggs & Emmanuel Raviart
|
2003-01-06 19:49:32 +01:00
|
|
|
|
# Copyright (C) 2002 Odile B<>nassy, Code Lutin, Thierry Dulieu, Easter-eggs,
|
|
|
|
|
# Entr'ouvert, Fr<46>d<EFBFBD>ric P<>ters, Benjamin Poussin, Emmanuel Raviart,
|
|
|
|
|
# Emmanuel Saracco & Th<54>ridion
|
2003-05-13 12:07:32 +02:00
|
|
|
|
# Copyright (C) 2003 Odile B<>nassy, Romain Chantereau, Nicolas Clapi<70>s,
|
2003-04-17 01:29:07 +02:00
|
|
|
|
# Code Lutin, Pierre-Antoine Dejace, Thierry Dulieu, Easter-eggs,
|
2003-05-13 12:07:32 +02:00
|
|
|
|
# Entr'ouvert, Florent Monnier, C<>dric Musso, Ouvaton, Fr<46>d<EFBFBD>ric P<>ters,
|
2003-05-15 18:49:30 +02:00
|
|
|
|
# Benjamin Poussin, Rodolphe Qui<75>deville, Emmanuel Raviart, S<>bastien
|
|
|
|
|
# R<>gnier, Emmanuel Saracco, Th<54>ridion & Vecam
|
2002-10-19 15:00:35 +02:00
|
|
|
|
#
|
|
|
|
|
# This program is free software; you can redistribute it and/or
|
|
|
|
|
# modify it under the terms of the GNU General Public License
|
|
|
|
|
# as published by the Free Software Foundation; either version 2
|
|
|
|
|
# of the License, or (at your option) any later version.
|
|
|
|
|
#
|
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
|
#
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
# along with this program; if not, write to the Free Software
|
|
|
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
|
|
|
2003-03-21 17:01:04 +01:00
|
|
|
|
from __future__ import nested_scopes
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
__doc__ = """Glasnost Common Kinds"""
|
|
|
|
|
|
2002-11-01 15:49:45 +01:00
|
|
|
|
__version__ = '$Revision$'[11:-2]
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import base64
|
2003-08-09 17:36:26 +02:00
|
|
|
|
import copy
|
2003-11-01 01:20:17 +01:00
|
|
|
|
import cStringIO
|
2002-10-19 15:00:35 +02:00
|
|
|
|
import locale
|
2003-05-29 17:46:46 +02:00
|
|
|
|
import marshal
|
2003-10-14 10:38:37 +02:00
|
|
|
|
import re
|
|
|
|
|
import string
|
2003-11-01 01:20:17 +01:00
|
|
|
|
import sys
|
2002-12-24 17:46:09 +01:00
|
|
|
|
import time
|
2003-11-01 01:20:17 +01:00
|
|
|
|
import traceback
|
2002-10-19 15:00:35 +02:00
|
|
|
|
import types
|
|
|
|
|
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
import jails
|
2002-10-19 15:00:35 +02:00
|
|
|
|
import slots
|
|
|
|
|
import translation
|
|
|
|
|
import things
|
2003-08-31 01:13:52 +02:00
|
|
|
|
import system
|
2002-10-19 15:00:35 +02:00
|
|
|
|
from tools import *
|
2002-11-11 21:56:54 +01:00
|
|
|
|
import tools_new as commonTools
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## import connectors # Do not remove!
|
2002-12-05 23:26:43 +01:00
|
|
|
|
import functions # Do not remove!
|
2003-10-08 01:42:15 +02:00
|
|
|
|
import modes # Do not remove!
|
2002-12-23 18:09:14 +01:00
|
|
|
|
import properties # Do not remove!
|
2002-12-05 23:26:43 +01:00
|
|
|
|
import uploads # Do not remove!
|
2003-04-30 18:18:53 +02:00
|
|
|
|
import values # Do not remove!
|
2002-12-05 23:26:43 +01:00
|
|
|
|
import widgets # Do not remove!
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
|
|
|
|
register = things.register
|
|
|
|
|
|
|
|
|
|
|
2003-08-09 17:36:26 +02:00
|
|
|
|
class BaseKind(things.BaseThing):
|
2003-01-06 23:11:07 +01:00
|
|
|
|
balloonHelp = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class balloonHelp_kindClass:
|
|
|
|
|
_kindName = 'String'
|
|
|
|
|
label = N_('Balloon Help')
|
|
|
|
|
stateInViewMode = 'read-only/hidden-if-empty'
|
|
|
|
|
widget_rows = 4
|
|
|
|
|
widgetName = 'TextArea'
|
2003-01-06 23:11:07 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class containerNames_kindClass:
|
|
|
|
|
_kindName = 'Sequence'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
itemKind_valueName = 'KindName'
|
|
|
|
|
label = N_('Containers')
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue = None
|
2003-08-31 22:54:12 +02:00
|
|
|
|
defaultValue_kind_importExport = 'private'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
defaultValue_kind_label = N_('Default Value')
|
2003-09-17 13:02:53 +02:00
|
|
|
|
defaultValue_kind_stateInEditMode = 'hidden'
|
|
|
|
|
defaultValue_kind_stateInViewMode = 'hidden'
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = None # To override
|
|
|
|
|
|
2003-08-11 17:05:58 +02:00
|
|
|
|
## helpAlias = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
## class helpAlias_kindClass:
|
|
|
|
|
## _kindName = 'Alias'
|
|
|
|
|
## label = N_('Help Alias')
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
2003-10-08 12:19:11 +02:00
|
|
|
|
getter = None
|
|
|
|
|
|
2003-08-31 22:54:12 +02:00
|
|
|
|
importExport = 'public'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class importExport_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('Protection')
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
labels = {
|
|
|
|
|
'from-server-only': N_('Read Only'),
|
|
|
|
|
'private': N_('Private'),
|
|
|
|
|
'public': N_('Read/Write'),
|
|
|
|
|
'to-server-only': N_('Write Only'),
|
|
|
|
|
}
|
|
|
|
|
values = [
|
|
|
|
|
'private',
|
|
|
|
|
'to-server-only',
|
|
|
|
|
'from-server-only',
|
|
|
|
|
'public',
|
|
|
|
|
]
|
2003-08-31 22:54:12 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
isAutomaticallyModified = 0
|
|
|
|
|
class isAutomaticallyModified_kindClass:
|
2003-10-14 23:43:07 +02:00
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-09-14 13:21:16 +02:00
|
|
|
|
# When isModifiable is false, the slot can only be set once and not
|
2003-09-10 16:26:39 +02:00
|
|
|
|
# modified.
|
|
|
|
|
isModifiable = 1
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isModifiable_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-09-10 16:26:39 +02:00
|
|
|
|
|
2003-05-19 11:00:03 +02:00
|
|
|
|
# When false, isPractical means that the kind can not be used to describe
|
|
|
|
|
# a real value, but only to describe an expected value.
|
|
|
|
|
isPractical = 1
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isPractical_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-05-19 11:00:03 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
isRequired = 0
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isRequired_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
label = N_('Mandatory')
|
|
|
|
|
## labels = {
|
|
|
|
|
## '0': N_('Optional'),
|
|
|
|
|
## '1': N_('Required'),
|
|
|
|
|
## }
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-09-14 13:21:16 +02:00
|
|
|
|
isRequiredInEditMode = 0
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isRequiredInEditMode_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-09-14 13:21:16 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
isTranslatable = 0
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isTranslatable_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Translatable')
|
|
|
|
|
## labels = {
|
|
|
|
|
## '0': N_('Invariant'),
|
|
|
|
|
## '1': N_('Translatable'),
|
|
|
|
|
## }
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
label = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class label_kindClass:
|
|
|
|
|
_kindName = 'String'
|
|
|
|
|
balloonHelp = N_('Enter a user-friendly field name')
|
|
|
|
|
label = N_('Field Label')
|
|
|
|
|
stateInViewMode = 'read-only/hidden-if-empty'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
|
|
|
|
labelPlural = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class labelPlural_kindClass:
|
|
|
|
|
_kindName = 'String'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Label (plural form)')
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
2002-12-07 18:02:04 +01:00
|
|
|
|
possibleWidgetNames = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class possibleWidgetNames_kindClass:
|
|
|
|
|
_kindName = 'Sequence'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
itemKind_valueName = 'WidgetName'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2002-12-07 18:02:04 +01:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = None
|
|
|
|
|
# not defined as a kind since it would require a new kind PythonType that
|
|
|
|
|
# would only be useful here.
|
|
|
|
|
|
2003-09-10 13:23:05 +02:00
|
|
|
|
stateInCreateMode = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class stateInCreateMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Creation Mode')
|
|
|
|
|
labels = {
|
|
|
|
|
'': N_('Same As Edition Mode'),
|
|
|
|
|
'hidden': N_('Hidden'),
|
|
|
|
|
'read-only': N_('Read Only'),
|
|
|
|
|
'read-only/hidden-if-empty': N_('Read Only / Hidden If Empty'),
|
|
|
|
|
'read-write': N_('Read/Write'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
None,
|
|
|
|
|
'hidden',
|
|
|
|
|
'read-only/hidden-if-empty',
|
|
|
|
|
'read-only',
|
|
|
|
|
'read-write',
|
|
|
|
|
]
|
2003-09-10 13:23:05 +02:00
|
|
|
|
|
2003-09-01 17:36:08 +02:00
|
|
|
|
stateInEditMode = 'read-write'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class stateInEditMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('Edition Mode')
|
|
|
|
|
labels = {
|
|
|
|
|
'hidden': N_('Hidden'),
|
|
|
|
|
'read-only': N_('Read Only'),
|
|
|
|
|
'read-only/hidden-if-empty': N_('Read Only / Hidden If Empty'),
|
|
|
|
|
'read-write': N_('Read/Write'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
'hidden',
|
|
|
|
|
'read-only/hidden-if-empty',
|
|
|
|
|
'read-only',
|
|
|
|
|
'read-write',
|
|
|
|
|
]
|
2003-04-21 09:36:47 +02:00
|
|
|
|
|
2004-02-15 22:54:55 +01:00
|
|
|
|
stateInViewMode = 'read-only/hidden-if-empty'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class stateInViewMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('View Mode')
|
|
|
|
|
labels = {
|
|
|
|
|
'hidden': N_('Hidden'),
|
|
|
|
|
'read-only': N_('Read Only'),
|
|
|
|
|
'read-only/hidden-if-empty': N_('Read Only / Hidden If Empty'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
'hidden',
|
|
|
|
|
'read-only/hidden-if-empty',
|
|
|
|
|
'read-only',
|
|
|
|
|
]
|
2003-09-01 17:36:08 +02:00
|
|
|
|
|
2003-10-04 02:04:11 +02:00
|
|
|
|
tagInCreateMode = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class tagInCreateMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Creation Aspect')
|
|
|
|
|
labels = {
|
|
|
|
|
'': N_('Same As Edition Aspect'),
|
|
|
|
|
'div': N_('Standard Without Label'),
|
|
|
|
|
'div-with-label': N_('Standard With Label'),
|
|
|
|
|
'h1': N_('Header 1'),
|
|
|
|
|
'h2': N_('Header 2'),
|
|
|
|
|
'h3': N_('Header 3'),
|
|
|
|
|
'h4': N_('Header 4'),
|
|
|
|
|
'h5': N_('Header 5'),
|
|
|
|
|
'h6': N_('Header 6'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
None,
|
|
|
|
|
'div-with-label',
|
|
|
|
|
'div',
|
|
|
|
|
'h1',
|
|
|
|
|
'h2',
|
|
|
|
|
'h3',
|
|
|
|
|
'h4',
|
|
|
|
|
'h5',
|
|
|
|
|
'h6',
|
|
|
|
|
]
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
|
|
|
|
tagInEditMode = 'div-with-label'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class tagInEditMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('Edition Aspect')
|
|
|
|
|
labels = {
|
|
|
|
|
'div': N_('Standard Without Label'),
|
|
|
|
|
'div-with-label': N_('Standard With Label'),
|
|
|
|
|
'h1': N_('Header 1'),
|
|
|
|
|
'h2': N_('Header 2'),
|
|
|
|
|
'h3': N_('Header 3'),
|
|
|
|
|
'h4': N_('Header 4'),
|
|
|
|
|
'h5': N_('Header 5'),
|
|
|
|
|
'h6': N_('Header 6'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
'div-with-label',
|
|
|
|
|
'div',
|
|
|
|
|
'h1',
|
|
|
|
|
'h2',
|
|
|
|
|
'h3',
|
|
|
|
|
'h4',
|
|
|
|
|
'h5',
|
|
|
|
|
'h6',
|
|
|
|
|
]
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
|
|
|
|
tagInViewMode = 'div-with-label'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class tagInViewMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('View Aspect')
|
|
|
|
|
labels = {
|
|
|
|
|
'div': N_('Standard Without Label'),
|
|
|
|
|
'div-with-label': N_('Standard With Label'),
|
|
|
|
|
'h1': N_('Header 1'),
|
|
|
|
|
'h2': N_('Header 2'),
|
|
|
|
|
'h3': N_('Header 3'),
|
|
|
|
|
'h4': N_('Header 4'),
|
|
|
|
|
'h5': N_('Header 5'),
|
|
|
|
|
'h6': N_('Header 6'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
'div-with-label',
|
|
|
|
|
'div',
|
|
|
|
|
'h1',
|
|
|
|
|
'h2',
|
|
|
|
|
'h3',
|
|
|
|
|
'h4',
|
|
|
|
|
'h5',
|
|
|
|
|
'h6',
|
|
|
|
|
]
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
2003-09-16 12:13:25 +02:00
|
|
|
|
textFormat = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class textFormat_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Text Format')
|
|
|
|
|
labels = {
|
|
|
|
|
'': N_('Text'),
|
|
|
|
|
'docbook': N_('DocBook'),
|
|
|
|
|
'html': N_('HTML'),
|
|
|
|
|
'rst': N_('reStructuredText'),
|
|
|
|
|
'spip': N_('SPIP'),
|
|
|
|
|
'text': N_('Preformatted Text'),
|
|
|
|
|
}
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
None,
|
|
|
|
|
'docbook',
|
|
|
|
|
'html',
|
|
|
|
|
'rst',
|
|
|
|
|
'spip',
|
|
|
|
|
'text',
|
|
|
|
|
]
|
2003-09-16 12:13:25 +02:00
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
textMaxLength = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class textMaxLength_kindClass:
|
|
|
|
|
_kindName = 'Integer'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Maximum Number of Characters')
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
|
2003-08-09 17:36:26 +02:00
|
|
|
|
thingCategory = 'kind'
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory_kind_stateInEditMode = 'read-only/hidden-if-empty'
|
|
|
|
|
thingPublicCategory_kind_stateInViewMode = 'read-only/hidden-if-empty'
|
|
|
|
|
|
|
|
|
|
thingPublicName_kind_label = N_('Type')
|
|
|
|
|
thingPublicName_kind_stateInEditMode = 'read-only/hidden-if-empty'
|
|
|
|
|
thingPublicName_kind_stateInViewMode = 'read-only/hidden-if-empty'
|
|
|
|
|
|
2002-11-26 10:09:55 +01:00
|
|
|
|
useCustomStorage = 0
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class useCustomStorage_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2002-11-26 10:09:55 +01:00
|
|
|
|
|
|
|
|
|
useFileStorage = 0
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class useFileStorage_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
importExport = 'from-server-only'
|
|
|
|
|
label = N_('Storage')
|
|
|
|
|
labels = {
|
|
|
|
|
'0': N_('Internal'),
|
|
|
|
|
'1': N_('In External File'),
|
|
|
|
|
}
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-10-04 02:04:11 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
widget = None
|
2003-10-08 01:42:15 +02:00
|
|
|
|
class widget_kindClass:
|
|
|
|
|
_kindName = 'Widget'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
isRequired = 1
|
2003-10-08 01:42:15 +02:00
|
|
|
|
label = N_('Widget')
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
2004-02-12 15:38:22 +01:00
|
|
|
|
return None
|
2003-10-08 01:42:15 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
def getter(self, slot):
|
|
|
|
|
return slot.getContainer().getModelWidget(slot.parent)
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
2003-10-14 23:43:07 +02:00
|
|
|
|
values = slot.getContainer().getPossibleWidgetNames()
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if values:
|
|
|
|
|
return values
|
|
|
|
|
else:
|
|
|
|
|
return ['InputText']
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
|
|
|
|
widgetName = 'InputText'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class widgetName_kindClass:
|
|
|
|
|
_kindName = 'WidgetName'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-08-09 17:36:26 +02:00
|
|
|
|
def __init__(self, **attributes):
|
|
|
|
|
things.BaseThing.__init__(self)
|
|
|
|
|
for name, value in attributes.items():
|
|
|
|
|
# Ensure that each argument has been declared as an attribute.
|
|
|
|
|
if not hasattr(self.__class__, name):
|
|
|
|
|
raise Exception('Undeclared attribute %s for %s' % (
|
|
|
|
|
name, self.__class__.__name__))
|
|
|
|
|
if getattr(self, name) == value:
|
|
|
|
|
continue
|
|
|
|
|
setattr(self, name, value)
|
|
|
|
|
|
2003-03-04 17:37:17 +01:00
|
|
|
|
def accepts(self, kind):
|
|
|
|
|
"""Test whether the given kind is always compatible with self.
|
|
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
- Integer accepts Integer.
|
|
|
|
|
- Number accepts Integer.
|
|
|
|
|
- Integer doesn't accept Number.
|
|
|
|
|
"""
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return self.includes(kind)
|
2003-03-04 17:37:17 +01:00
|
|
|
|
|
2002-12-24 03:01:41 +01:00
|
|
|
|
def acquireNonCoreValue(self, slot, objectDirectoryPath):
|
|
|
|
|
pass
|
|
|
|
|
|
2003-08-09 17:36:26 +02:00
|
|
|
|
def buildOptions(self, options):
|
|
|
|
|
for name, value in options.items():
|
|
|
|
|
# Ensure that each option has been declared as an attribute.
|
|
|
|
|
nameBase = name.split('_')[0]
|
|
|
|
|
if not hasattr(self.__class__, nameBase):
|
|
|
|
|
raise Exception('Undeclared attribute %s for %s' % (
|
|
|
|
|
name, self.__class__.__name__))
|
|
|
|
|
if hasattr(self, name) and getattr(self, name) == value:
|
|
|
|
|
continue
|
|
|
|
|
setattr(self, name, value)
|
|
|
|
|
|
2003-04-30 21:28:48 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
assert self.isPractical
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if self.isRequired and value is None:
|
2003-04-30 21:28:48 +02:00
|
|
|
|
raise faults.MissingSlotValue(slot)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
if type(value) is not self.pythonStorageType:
|
2003-12-31 11:21:02 +01:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2003-04-30 21:28:48 +02:00
|
|
|
|
|
2003-05-01 01:09:39 +02:00
|
|
|
|
def checkModelValueHolder(self, slot, valueHolder):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
assert self.isPractical
|
2003-05-01 01:09:39 +02:00
|
|
|
|
if not self.accepts(valueHolder.kind):
|
|
|
|
|
raise faults.KindsIncompatibility(self, valueHolder.kind)
|
|
|
|
|
self.checkModelValue(slot, valueHolder.value)
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if value is None and self.pythonStorageType is types.StringType:
|
|
|
|
|
return ''
|
|
|
|
|
if type(value) is types.InstanceType:
|
|
|
|
|
raise NotImplementedError
|
|
|
|
|
try:
|
|
|
|
|
return self.pythonStorageType(value)
|
|
|
|
|
except:
|
|
|
|
|
raise 'convertValueFrom not implemented for %s' % \
|
|
|
|
|
repr((self, type(value)))
|
2003-10-18 21:30:11 +02:00
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if value is None and otherType is types.StringType:
|
|
|
|
|
return ''
|
2003-10-18 21:30:11 +02:00
|
|
|
|
raise 'convertValueTo not implemented for %s' % \
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
repr((self, otherType))
|
2003-10-09 15:14:20 +02:00
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
2003-05-19 11:00:03 +02:00
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
assert self.isPractical
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return value
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def equals(self, kind):
|
|
|
|
|
"""Test whether two kinds are equal."""
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
return self.getThingName() == kind.getThingName()
|
2003-05-24 15:43:13 +02:00
|
|
|
|
|
2003-10-15 13:17:07 +02:00
|
|
|
|
def executeModel(self, slot, when, command = None):
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
pass
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
assert self.isPractical
|
2002-10-19 15:00:35 +02:00
|
|
|
|
if type(value) in (types.StringType, types.UnicodeType):
|
|
|
|
|
value = utf8(value)
|
|
|
|
|
return value
|
|
|
|
|
|
2003-01-27 20:04:49 +01:00
|
|
|
|
def getBalloonHelp(self):
|
|
|
|
|
return self.balloonHelp
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def getCmpFunction(self):
|
|
|
|
|
return cmp
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def getDefaultValue(self, slot):
|
|
|
|
|
return self.defaultValue
|
|
|
|
|
|
2003-10-04 02:04:11 +02:00
|
|
|
|
def getModelFieldTag(self, slot):
|
|
|
|
|
layoutMode = context.getVar('layoutMode')
|
|
|
|
|
if layoutMode == 'edit':
|
|
|
|
|
isCreateEditMode = context.getVar('isCreateEditMode', default = 0)
|
|
|
|
|
if isCreateEditMode and self.tagInCreateMode is not None:
|
|
|
|
|
return self.tagInCreateMode
|
|
|
|
|
else:
|
|
|
|
|
return self.tagInEditMode
|
|
|
|
|
elif layoutMode == 'use':
|
2003-10-14 23:43:07 +02:00
|
|
|
|
aspect = context.getVar('aspect')
|
|
|
|
|
return aspect.htmlTag
|
2003-10-04 02:04:11 +02:00
|
|
|
|
else:
|
|
|
|
|
return self.tagInViewMode
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getModelLabel(self, slot):
|
|
|
|
|
if self.label:
|
|
|
|
|
return self.label
|
2003-01-04 10:59:39 +01:00
|
|
|
|
return slot.getLabel()
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
|
|
|
|
def getModelLabelPlural(self, slot):
|
|
|
|
|
if self.labelPlural:
|
|
|
|
|
return self.labelPlural
|
|
|
|
|
return self.getModelLabel(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getModelSlotByPath(self, slot, path):
|
2002-12-01 18:40:23 +01:00
|
|
|
|
if path.startswith('self'):
|
|
|
|
|
path = path[len('self'):]
|
|
|
|
|
if not path:
|
|
|
|
|
return slot
|
2003-02-01 21:01:44 +01:00
|
|
|
|
raise Exception('Path "%s" not found' % path)
|
2002-12-01 18:40:23 +01:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
def getModelWidget(self, slot, forceEmbedding = 0):
|
|
|
|
|
if self.widget is None:
|
|
|
|
|
widgetOptionHeader = 'widget_'
|
|
|
|
|
widgetOptionHeaderLen = len(widgetOptionHeader)
|
|
|
|
|
widgetOptionNames = [
|
|
|
|
|
name
|
|
|
|
|
for name in self.__dict__.keys()
|
|
|
|
|
if name.startswith(widgetOptionHeader) \
|
|
|
|
|
and not name.startswith(widgetOptionHeader + 'kind')]
|
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for name in baseClass.__dict__.keys():
|
|
|
|
|
if name.startswith(widgetOptionHeader) \
|
|
|
|
|
and not name.startswith(widgetOptionHeader + 'kind') \
|
|
|
|
|
and name not in widgetOptionNames:
|
|
|
|
|
widgetOptionNames.append(name)
|
|
|
|
|
widgetOptions = {}
|
|
|
|
|
for widgetOptionName in widgetOptionNames:
|
|
|
|
|
widgetOptions[widgetOptionName[widgetOptionHeaderLen:]
|
|
|
|
|
] = getattr(self, widgetOptionName)
|
|
|
|
|
widget = self.newModelWidget(slot)
|
|
|
|
|
widget.buildOptions(widgetOptions)
|
|
|
|
|
self.widget = widget
|
|
|
|
|
return self.widget
|
|
|
|
|
|
2002-12-30 20:09:04 +01:00
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
2003-08-09 17:36:26 +02:00
|
|
|
|
slotNames = things.BaseThing.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
2002-12-30 20:09:04 +01:00
|
|
|
|
slotNames += [
|
2003-10-04 02:04:11 +02:00
|
|
|
|
'label', 'labelPlural', 'widgetName', 'widget', 'textFormat',
|
|
|
|
|
'importExport',
|
2003-10-14 23:43:07 +02:00
|
|
|
|
'tagInCreateMode', 'stateInCreateMode',
|
|
|
|
|
'tagInEditMode', 'stateInEditMode',
|
|
|
|
|
'tagInViewMode', 'stateInViewMode',
|
2003-10-04 02:04:11 +02:00
|
|
|
|
'isRequired', 'defaultValue', 'balloonHelp', 'textMaxLength',
|
2003-08-11 17:05:58 +02:00
|
|
|
|
## 'helpAlias',
|
2004-05-16 19:54:28 +02:00
|
|
|
|
'useFileStorage', 'useCustomStorage']
|
2002-12-30 20:09:04 +01:00
|
|
|
|
return slotNames
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getPossibleWidgetNames(self):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
assert self.isPractical
|
2002-12-29 19:09:10 +01:00
|
|
|
|
if self.possibleWidgetNames is not None:
|
|
|
|
|
return self.possibleWidgetNames
|
|
|
|
|
return [self.widgetName]
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
def getRealKindClass(self):
|
2003-10-08 01:55:02 +02:00
|
|
|
|
return self.__class__.__bases__[-1]
|
2003-10-08 01:42:15 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def getTextFormat(self, slot):
|
|
|
|
|
return self.textFormat
|
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
def getTextMaxLength(self):
|
|
|
|
|
return self.textMaxLength
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def importValueFromXmlRpc(self, slot, value):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
assert self.isPractical
|
2002-10-19 15:00:35 +02:00
|
|
|
|
if type(value) in (types.StringType, types.UnicodeType):
|
|
|
|
|
value = iso8859_15(value)
|
2002-10-31 19:52:17 +01:00
|
|
|
|
value = value.replace('\r\n', '\n') # MS-DOS return character
|
|
|
|
|
value = value.replace('\r', '\n') # MacOS return character
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return value
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def includes(self, kind):
|
|
|
|
|
"""Test whether the given kind is included in self.
|
|
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
- Integer includes Integer.
|
|
|
|
|
- Number includes Integer.
|
|
|
|
|
- Integer doesn't include Number.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if self.equals(kind):
|
2003-03-04 17:37:17 +01:00
|
|
|
|
return 1
|
2003-05-24 15:43:13 +02:00
|
|
|
|
if kind.containerNames is None:
|
2003-03-04 17:37:17 +01:00
|
|
|
|
return 0
|
2003-05-24 15:43:13 +02:00
|
|
|
|
for kindContainerName in kind.containerNames:
|
|
|
|
|
if self.includes(commonTools.newThing(
|
|
|
|
|
'kind', kindContainerName)):
|
2003-03-04 17:37:17 +01:00
|
|
|
|
return 1
|
|
|
|
|
return 0
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def intersects(self, kind):
|
|
|
|
|
"""Test whether the given kind has an intersection with self.
|
|
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
- Integer has an intersection with Integer.
|
|
|
|
|
- Number has an intersection with Integer.
|
|
|
|
|
- Integer has an intersection with Number.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# To override, because the test below is incomplete.
|
|
|
|
|
return self.includes(kind) or kind.includes(self)
|
|
|
|
|
|
2003-09-15 00:52:39 +02:00
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
return value is None
|
|
|
|
|
|
2003-09-01 17:36:08 +02:00
|
|
|
|
def isExportable(self):
|
2003-08-31 22:54:12 +02:00
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
2003-10-04 02:04:11 +02:00
|
|
|
|
def isHidden(self, slot):
|
|
|
|
|
layoutMode = context.getVar('layoutMode')
|
|
|
|
|
if layoutMode == 'edit':
|
|
|
|
|
isCreateEditMode = context.getVar('isCreateEditMode', default = 0)
|
|
|
|
|
if isCreateEditMode:
|
|
|
|
|
return self.stateInCreateMode == 'hidden' \
|
|
|
|
|
or (self.stateInCreateMode == 'read-only/hidden-if-empty'
|
|
|
|
|
and self.modelValueIsEmpty(slot)) \
|
|
|
|
|
or (self.stateInCreateMode is None
|
|
|
|
|
and (self.stateInEditMode == 'hidden'
|
|
|
|
|
or (self.stateInEditMode == 'read-only/hidden-if-empty'
|
|
|
|
|
and self.modelValueIsEmpty(slot))))
|
|
|
|
|
else:
|
|
|
|
|
return self.stateInEditMode == 'hidden' \
|
|
|
|
|
or self.stateInEditMode == 'read-only/hidden-if-empty' \
|
|
|
|
|
and self.modelValueIsEmpty(slot)
|
|
|
|
|
elif layoutMode == 'use':
|
2003-10-14 23:43:07 +02:00
|
|
|
|
aspect = context.getVar('aspect')
|
|
|
|
|
return aspect.state == 'hidden' \
|
|
|
|
|
or aspect.state == 'read-only/hidden-if-empty' \
|
|
|
|
|
and self.modelValueIsEmpty(slot)
|
2003-10-04 02:04:11 +02:00
|
|
|
|
else:
|
|
|
|
|
return self.stateInViewMode == 'hidden' \
|
|
|
|
|
or self.stateInViewMode == 'read-only/hidden-if-empty' \
|
|
|
|
|
and self.modelValueIsEmpty(slot)
|
|
|
|
|
|
2003-09-01 17:36:08 +02:00
|
|
|
|
def isImportable(self):
|
2003-08-31 22:54:12 +02:00
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
2002-11-26 10:09:55 +01:00
|
|
|
|
def isInCore(self, slot):
|
|
|
|
|
return not self.useCustomStorage and not self.useFileStorage
|
|
|
|
|
|
2003-10-04 02:04:11 +02:00
|
|
|
|
def isReadOnly(self, slot):
|
|
|
|
|
layoutMode = context.getVar('layoutMode')
|
|
|
|
|
if layoutMode == 'edit':
|
|
|
|
|
isCreateEditMode = context.getVar('isCreateEditMode', default = 0)
|
|
|
|
|
if isCreateEditMode:
|
|
|
|
|
return self.stateInCreateMode == 'read-only' \
|
|
|
|
|
or (self.stateInCreateMode == 'read-only/hidden-if-empty'
|
|
|
|
|
and not self.modelValueIsEmpty(slot)) \
|
|
|
|
|
or (self.stateInCreateMode is None
|
|
|
|
|
and (self.stateInEditMode == 'read-only'
|
|
|
|
|
or (self.stateInEditMode == 'read-only/hidden-if-empty'
|
|
|
|
|
and not self.modelValueIsEmpty(slot))))
|
|
|
|
|
else:
|
|
|
|
|
return self.stateInEditMode == 'read-only' \
|
|
|
|
|
or self.stateInEditMode == 'read-only/hidden-if-empty' \
|
|
|
|
|
and not self.modelValueIsEmpty(slot)
|
|
|
|
|
elif layoutMode == 'use':
|
2003-10-14 23:43:07 +02:00
|
|
|
|
aspect = context.getVar('aspect')
|
|
|
|
|
return aspect.state == 'read-only' \
|
|
|
|
|
or aspect.state == 'read-only/hidden-if-empty' \
|
|
|
|
|
and not self.modelValueIsEmpty(slot)
|
2003-10-04 02:04:11 +02:00
|
|
|
|
else:
|
|
|
|
|
return self.stateInViewMode == 'read-only' \
|
|
|
|
|
or self.stateInViewMode == 'read-only/hidden-if-empty' \
|
|
|
|
|
and not self.modelValueIsEmpty(slot)
|
|
|
|
|
|
2003-03-04 17:37:17 +01:00
|
|
|
|
def mayAccept(self, kind):
|
|
|
|
|
"""Test whether the given kind may be compatible with self.
|
|
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
- Integer always accepts Integer.
|
|
|
|
|
- Number always accepts Integer.
|
|
|
|
|
- Integer may accept Number, because sometimes a Number is an Integer.
|
|
|
|
|
"""
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return self.intersects(kind)
|
2003-03-04 17:37:17 +01:00
|
|
|
|
|
2003-09-15 00:52:39 +02:00
|
|
|
|
def modelValueIsEmpty(self, slot):
|
|
|
|
|
return self.isEmptyModelValue(slot, slot.getValue())
|
|
|
|
|
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
def newJail(self, slot):
|
2003-09-29 15:46:29 +02:00
|
|
|
|
return jails.Jail(slot)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
|
2002-12-24 03:01:41 +01:00
|
|
|
|
def releaseNonCoreValue(self, slot):
|
|
|
|
|
pass
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
assert self.isPractical
|
2002-10-31 23:24:47 +01:00
|
|
|
|
if toVersion == 5004:
|
|
|
|
|
if type(value) in (types.StringType, types.UnicodeType):
|
|
|
|
|
repairedValue = value.replace('\r\n', '\n')
|
|
|
|
|
repairedValue = repairedValue.replace('\r', '\n')
|
|
|
|
|
if repairedValue != value:
|
|
|
|
|
return repairedValue
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
2002-12-24 03:01:41 +01:00
|
|
|
|
|
|
|
|
|
def saveNonCoreValue(self, slot, objectDirectoryPath):
|
|
|
|
|
pass
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
|
|
|
|
def setAutomaticalValue(self, slot, init = 0):
|
|
|
|
|
raise NotImplementedError
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
def setToDefaultValue(self, slot):
|
|
|
|
|
defaultValue = self.getDefaultValue(slot)
|
|
|
|
|
if defaultValue is not None:
|
|
|
|
|
slot.setValue(defaultValue)
|
2003-12-22 16:55:46 +01:00
|
|
|
|
|
|
|
|
|
def upgradeModel(self, slot, model, toVersion):
|
|
|
|
|
changed = 0
|
|
|
|
|
# Call upgradeModel_xxx methods.
|
|
|
|
|
classes = commonTools.getC3ClassLinearization(self.__class__)
|
|
|
|
|
upgradeMethodNames = []
|
|
|
|
|
for class_ in classes:
|
|
|
|
|
for attributeName in class_.__dict__.keys():
|
|
|
|
|
if attributeName.startswith('upgradeModel_'):
|
|
|
|
|
if not attributeName in upgradeMethodNames:
|
|
|
|
|
upgradeMethodNames.append(attributeName)
|
|
|
|
|
upgradeMethodNames.sort()
|
|
|
|
|
for upgradeMethodName in upgradeMethodNames:
|
2004-01-30 18:50:57 +01:00
|
|
|
|
if upgradeMethodName[len('upgradeModel_'):] < toVersion:
|
2003-12-22 16:55:46 +01:00
|
|
|
|
continue
|
|
|
|
|
modelChanged, model = getattr(self, upgradeMethodName)(slot, model)
|
|
|
|
|
changed = changed or modelChanged
|
|
|
|
|
return changed, model
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(BaseKind)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AbstractSequence(BaseKind):
|
2003-10-01 10:50:12 +02:00
|
|
|
|
canInsertOrDelete = 1
|
|
|
|
|
|
2003-11-23 10:32:37 +01:00
|
|
|
|
minCount = None
|
|
|
|
|
minCount_kind_label = N_('Minimum Number of Items')
|
|
|
|
|
minCount_kindName = 'Integer'
|
|
|
|
|
|
2003-07-05 17:51:28 +02:00
|
|
|
|
maxCount = None
|
2003-09-19 19:48:29 +02:00
|
|
|
|
maxCount_kind_label = N_('Maximum Number of Items')
|
2003-07-05 17:51:28 +02:00
|
|
|
|
maxCount_kindName = 'Integer'
|
|
|
|
|
|
2002-12-07 18:02:04 +01:00
|
|
|
|
widgetName = 'Multi'
|
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
2003-11-23 10:32:37 +01:00
|
|
|
|
if self.minCount and len(value) < self.minCount:
|
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if self.maxCount and len(value) > self.maxCount:
|
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2003-04-14 16:48:56 +02:00
|
|
|
|
def convertValueIds(self, slot, value, sourceDispatcherId,
|
|
|
|
|
destinationDispatcherId):
|
2003-06-18 19:08:43 +02:00
|
|
|
|
try:
|
|
|
|
|
len(value)
|
|
|
|
|
except TypeError:
|
|
|
|
|
raise Exception('Unsized value (= %s) for slot %s' % (value, slot))
|
2002-10-19 15:00:35 +02:00
|
|
|
|
for i in range(len(value)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
newItem = itemSlot.getKind().convertValueIds(
|
2003-05-19 20:46:45 +02:00
|
|
|
|
itemSlot, value[i], sourceDispatcherId,
|
|
|
|
|
destinationDispatcherId)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
if newItem != value[i]:
|
|
|
|
|
value[i] = newItem
|
|
|
|
|
return value
|
|
|
|
|
|
2003-10-15 13:17:07 +02:00
|
|
|
|
def executeModel(self, slot, when, command = None):
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
value = slot.getValue()
|
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
for i in range(len(value)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
2003-10-15 13:17:07 +02:00
|
|
|
|
itemSlot.getKind().executeModel(itemSlot, when, command = command)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
|
|
|
|
if value is None:
|
|
|
|
|
return []
|
|
|
|
|
exportedValue = []
|
|
|
|
|
for i in range(len(value)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
exportedValue.append(itemSlot.getKind().exportValueToXmlRpc(
|
|
|
|
|
itemSlot, value[i]))
|
|
|
|
|
return exportedValue
|
|
|
|
|
|
|
|
|
|
def getItemKind(self, index):
|
2003-02-01 20:17:40 +01:00
|
|
|
|
raise NotImplementedError
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-11-23 10:32:37 +01:00
|
|
|
|
def getMinCount(self, slot):
|
|
|
|
|
return self.minCount
|
|
|
|
|
|
2003-11-08 14:21:05 +01:00
|
|
|
|
def getMaxCount(self, slot):
|
|
|
|
|
return self.maxCount
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def getItemSlot(self, slot, index):
|
|
|
|
|
return slots.Item(index, parent = slot)
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getModelSlotByPath(self, slot, path):
|
2002-12-01 18:40:23 +01:00
|
|
|
|
if path.startswith('self'):
|
|
|
|
|
path = path[len('self'):]
|
|
|
|
|
if not path:
|
|
|
|
|
return slot
|
|
|
|
|
if path[0] != '[' or not ']' in path:
|
2003-02-01 21:01:44 +01:00
|
|
|
|
raise Exception('Path "%s" not found' % path)
|
2002-12-01 18:40:23 +01:00
|
|
|
|
index = int(path[1:path.index(']')])
|
2002-12-29 19:09:10 +01:00
|
|
|
|
return self.getItemKind(index).getModelSlotByPath(
|
2002-12-01 18:40:23 +01:00
|
|
|
|
self.getItemSlot(slot, index), path[path.index(']') + 1:])
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = BaseKind.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
2003-11-08 14:21:05 +01:00
|
|
|
|
slotNames += ['maxCount']
|
2003-09-21 18:50:55 +02:00
|
|
|
|
return slotNames
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def importValueFromXmlRpc(self, slot, importedValue):
|
|
|
|
|
if importedValue is None:
|
|
|
|
|
return []
|
|
|
|
|
value = []
|
2002-12-29 19:09:10 +01:00
|
|
|
|
slot.value = value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
for i in range(len(importedValue)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
value.append(itemSlot.getKind().importValueFromXmlRpc(
|
|
|
|
|
itemSlot, importedValue[i]))
|
2002-12-29 19:09:10 +01:00
|
|
|
|
del slot.value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return value
|
|
|
|
|
|
2003-09-29 15:46:29 +02:00
|
|
|
|
def newJail(self, slot):
|
2003-09-29 23:52:48 +02:00
|
|
|
|
return jails.MutableSequence(slot)
|
2003-09-29 15:46:29 +02:00
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
indexesToDelete = []
|
|
|
|
|
for i in range(len(value)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
newItem = itemSlot.getKind().removeValueIds(
|
|
|
|
|
itemSlot, value[i], rolesToKeep)
|
|
|
|
|
if newItem != value[i]:
|
|
|
|
|
indexesToDelete.append(i)
|
|
|
|
|
indexesToDelete.reverse()
|
|
|
|
|
for i in indexesToDelete:
|
|
|
|
|
del value[i]
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
changed = 0
|
|
|
|
|
for i in range(len(value)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
newItem = itemSlot.getKind().repairValue(
|
|
|
|
|
itemSlot, value[i], toVersion)
|
|
|
|
|
if newItem:
|
|
|
|
|
changed = 1
|
|
|
|
|
value[i] = newItem
|
|
|
|
|
if changed:
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
|
|
|
|
|
2004-01-13 11:45:53 +01:00
|
|
|
|
def setToDefaultValue(self, slot):
|
|
|
|
|
BaseKind.setToDefaultValue(self, slot)
|
|
|
|
|
for i in range(len(slot.getValue() or [])):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
itemKind = itemSlot.getKind()
|
|
|
|
|
itemKind.setToDefaultValue(itemSlot)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
2003-12-22 16:55:46 +01:00
|
|
|
|
def upgradeModel(self, slot, model, toVersion):
|
|
|
|
|
changed, model = BaseKind.upgradeModel(self, slot, model, toVersion)
|
|
|
|
|
# Upgrade each item.
|
|
|
|
|
if model is not None:
|
2004-02-03 11:27:57 +01:00
|
|
|
|
for i, item in zip(range(len(model)), model):
|
2003-12-22 16:55:46 +01:00
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
itemChanged, item = itemSlot.getKind().upgradeModel(
|
|
|
|
|
itemSlot, item, toVersion)
|
|
|
|
|
if itemChanged:
|
|
|
|
|
changed = 1
|
|
|
|
|
model[i] = item
|
|
|
|
|
return changed, model
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2002-11-20 16:18:03 +01:00
|
|
|
|
class Alias(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Alias'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Alias')
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
|
|
|
|
if self.isRequired and value == '':
|
|
|
|
|
raise faults.MissingSlotValue(slot)
|
|
|
|
|
if value:
|
2003-11-02 20:15:02 +01:00
|
|
|
|
if ' ' in value: # or '/' in value:
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2002-11-20 16:18:03 +01:00
|
|
|
|
register(Alias)
|
|
|
|
|
|
|
|
|
|
|
2003-03-04 16:28:05 +01:00
|
|
|
|
class Any(BaseKind):
|
|
|
|
|
defaultValue_kindName = 'Any'
|
2003-05-19 11:00:03 +02:00
|
|
|
|
isPractical = 0
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Any')
|
2003-03-04 16:28:05 +01:00
|
|
|
|
register(Any)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Boolean(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-09-28 22:05:24 +02:00
|
|
|
|
defaultValue = 0
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'Boolean'
|
2003-03-04 17:37:17 +01:00
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
labels = {
|
|
|
|
|
'0': N_('False'),
|
|
|
|
|
'1': N_('True'),
|
|
|
|
|
}
|
2003-09-01 17:36:08 +02:00
|
|
|
|
labels_kind_keyKind_value_stateInEditMode = 'read-only'
|
2002-12-02 01:11:40 +01:00
|
|
|
|
labels_kind_keyKind_valueName = 'String'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
labels_kind_label = N_('Labels')
|
2002-12-02 01:11:40 +01:00
|
|
|
|
labels_kind_valueKind_valueName = 'String'
|
2002-11-24 09:06:20 +01:00
|
|
|
|
labels_kindName = 'Mapping'
|
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
possibleWidgetNames = ['InputCheckBox', 'Select']
|
2002-12-07 18:02:04 +01:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.IntType
|
|
|
|
|
# in Python 2.3 that could have been BooleanType
|
|
|
|
|
|
2003-08-18 00:48:27 +02:00
|
|
|
|
sortLabels = 0
|
2003-09-17 13:02:53 +02:00
|
|
|
|
sortLabels_kind_balloonHelp = N_(
|
|
|
|
|
'Check the box to sort labels alphabetically')
|
|
|
|
|
sortLabels_kind_importExport = 'private'
|
2003-09-14 19:04:40 +02:00
|
|
|
|
sortLabels_kind_label = N_('Sort Labels')
|
2003-09-17 13:02:53 +02:00
|
|
|
|
sortLabels_kind_stateInEditMode = 'hidden'
|
|
|
|
|
sortLabels_kind_stateInViewMode = 'hidden'
|
2003-08-18 00:48:27 +02:00
|
|
|
|
sortLabels_kindName = 'Boolean'
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Numbers')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Boolean')
|
|
|
|
|
|
2003-01-06 14:21:50 +01:00
|
|
|
|
titles = None
|
2003-08-31 22:54:12 +02:00
|
|
|
|
titles_kind_importExport = 'private'
|
2003-09-01 17:36:08 +02:00
|
|
|
|
titles_kind_keyKind_value_stateInEditMode = 'read-only'
|
2003-01-06 14:21:50 +01:00
|
|
|
|
titles_kind_keyKind_valueName = 'String'
|
|
|
|
|
titles_kind_label = N_('Titles')
|
2003-09-17 13:02:53 +02:00
|
|
|
|
titles_kind_stateInEditMode = 'hidden'
|
|
|
|
|
titles_kind_stateInViewMode = 'hidden'
|
2003-01-06 14:21:50 +01:00
|
|
|
|
titles_kind_valueKind_valueName = 'String'
|
|
|
|
|
titles_kindName = 'Mapping'
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
values = [0, 1]
|
2003-08-31 22:54:12 +02:00
|
|
|
|
values_kind_importExport = 'private'
|
2002-12-02 01:11:40 +01:00
|
|
|
|
values_kind_itemKind_valueName = 'Boolean'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
values_kind_stateInEditMode = 'hidden'
|
|
|
|
|
values_kind_stateInViewMode = 'hidden'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
values_kindName = 'Sequence'
|
2002-12-07 18:02:04 +01:00
|
|
|
|
|
|
|
|
|
widgetName = 'InputCheckBox'
|
2002-12-30 20:09:04 +01:00
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value not in (None, 0, 1):
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if type(value) is types.StringType:
|
2003-10-14 10:38:37 +02:00
|
|
|
|
if value in ('0', '1'):
|
|
|
|
|
return int(value)
|
|
|
|
|
raise faults.BadValue()
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
|
|
|
|
|
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
|
|
|
|
return str(value)
|
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
2004-02-12 15:38:22 +01:00
|
|
|
|
return None
|
2003-01-07 01:10:31 +01:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getLabels(self, slot):
|
2003-01-06 14:21:50 +01:00
|
|
|
|
return self.labels
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getSortedValues(self, slot):
|
|
|
|
|
values = self.getValues(slot)
|
2003-08-18 00:48:27 +02:00
|
|
|
|
if values is not None:
|
|
|
|
|
values = values[:]
|
2003-11-20 13:59:16 +01:00
|
|
|
|
labels = self.getLabels(slot)
|
2003-08-18 00:48:27 +02:00
|
|
|
|
values.sort(lambda x, y:
|
|
|
|
|
locale.strcoll(_(labels[x]), _(labels[y])))
|
|
|
|
|
return values
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
2003-08-18 00:48:27 +02:00
|
|
|
|
return self.values
|
|
|
|
|
|
2002-12-30 20:09:04 +01:00
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = BaseKind.getOrderedLayoutSlotNames(
|
2003-09-18 18:26:21 +02:00
|
|
|
|
self, parentSlot = parentSlot)
|
2002-12-30 20:09:04 +01:00
|
|
|
|
slotNames += ['values', 'labels', 'titles']
|
|
|
|
|
return slotNames
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.Numeric(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Boolean)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Choice(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Choice'
|
|
|
|
|
|
2003-03-27 19:45:02 +01:00
|
|
|
|
groupedValues = None
|
2003-08-31 22:54:12 +02:00
|
|
|
|
groupedValues_kind_importExport = 'private'
|
2003-03-27 19:45:02 +01:00
|
|
|
|
groupedValues_kind_keyKind_valueName = 'String'
|
2003-09-18 18:26:21 +02:00
|
|
|
|
groupedValues_kind_stateInEditMode = 'hidden'
|
|
|
|
|
groupedValues_kind_stateInViewMode = 'hidden'
|
2003-03-27 19:45:02 +01:00
|
|
|
|
groupedValues_kind_valueKind_valueName = 'String'
|
|
|
|
|
groupedValues_kindName = 'Mapping'
|
|
|
|
|
|
2003-11-08 14:21:05 +01:00
|
|
|
|
# only use is in Metis; marked with a FIXME to remove it
|
2003-07-05 17:51:28 +02:00
|
|
|
|
groupedValuesGetterName = None
|
2003-09-18 18:26:21 +02:00
|
|
|
|
groupedValuesGetterName_kind_importExport = 'private'
|
|
|
|
|
groupedValuesGetterName_kind_stateInEditMode = 'hidden'
|
|
|
|
|
groupedValuesGetterName_kind_stateInViewMode = 'hidden'
|
2003-07-05 17:51:28 +02:00
|
|
|
|
groupedValuesGetterName_kindName = 'PythonIdentifier'
|
|
|
|
|
|
2003-03-27 19:45:02 +01:00
|
|
|
|
groupNames = None
|
2003-08-31 22:54:12 +02:00
|
|
|
|
groupNames_kind_importExport = 'private'
|
2003-03-27 19:45:02 +01:00
|
|
|
|
groupNames_kind_itemKind_valueName = 'String'
|
2003-09-18 18:26:21 +02:00
|
|
|
|
groupNames_kind_stateInEditMode = 'hidden'
|
|
|
|
|
groupNames_kind_stateInViewMode = 'hidden'
|
2003-03-27 19:45:02 +01:00
|
|
|
|
groupNames_kindName = 'Sequence'
|
|
|
|
|
|
2003-11-08 14:21:05 +01:00
|
|
|
|
# only use is in Metis; marked with a FIXME to remove it
|
2003-07-05 17:51:28 +02:00
|
|
|
|
groupNamesGetterName = None
|
2003-09-18 18:26:21 +02:00
|
|
|
|
groupNamesGetterName_kind_importExport = 'private'
|
|
|
|
|
groupNamesGetterName_kind_stateInEditMode = 'hidden'
|
|
|
|
|
groupNamesGetterName_kind_stateInViewMode = 'hidden'
|
2003-07-05 17:51:28 +02:00
|
|
|
|
groupNamesGetterName_kindName = 'PythonIdentifier'
|
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
labels = None
|
2003-09-18 18:26:21 +02:00
|
|
|
|
labels_kind_importExport = 'private'
|
2002-12-02 01:11:40 +01:00
|
|
|
|
labels_kind_keyKind_valueName = 'String'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
labels_kind_label = N_('Labels')
|
2003-09-18 18:26:21 +02:00
|
|
|
|
labels_kind_stateInEditMode = 'hidden'
|
|
|
|
|
labels_kind_stateInViewMode = 'hidden'
|
2002-12-02 01:11:40 +01:00
|
|
|
|
labels_kind_valueKind_valueName = 'String'
|
2002-11-24 09:06:20 +01:00
|
|
|
|
labels_kindName = 'Mapping'
|
|
|
|
|
|
2003-11-01 01:20:17 +01:00
|
|
|
|
possibleWidgetNames = ['Select', 'RadioButtons']
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
pythonStorageType = types.StringType
|
2003-07-06 23:50:47 +02:00
|
|
|
|
|
2003-08-18 00:48:27 +02:00
|
|
|
|
sortLabels = 1
|
2003-09-18 18:26:21 +02:00
|
|
|
|
sortLabels_kind_importExport = 'private'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
sortLabels_kind_balloonHelp = N_(
|
|
|
|
|
'Check the box to sort labels alphabetically')
|
2003-09-14 19:04:40 +02:00
|
|
|
|
sortLabels_kind_label = N_('Sort Labels')
|
2003-09-18 18:26:21 +02:00
|
|
|
|
sortLabels_kind_stateInEditMode = 'hidden'
|
|
|
|
|
sortLabels_kind_stateInViewMode = 'hidden'
|
2003-08-18 00:48:27 +02:00
|
|
|
|
sortLabels_kindName = 'Boolean'
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-10-25 15:57:33 +02:00
|
|
|
|
thingPublicName = N_('Exclusive Choice')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-01-06 14:21:50 +01:00
|
|
|
|
titles = None
|
2003-08-31 22:54:12 +02:00
|
|
|
|
titles_kind_importExport = 'private'
|
2003-09-01 17:36:08 +02:00
|
|
|
|
titles_kind_keyKind_value_stateInEditMode = 'read-only'
|
2003-01-06 14:21:50 +01:00
|
|
|
|
titles_kind_keyKind_valueName = 'String'
|
|
|
|
|
titles_kind_label = N_('Titles')
|
2003-09-17 13:02:53 +02:00
|
|
|
|
titles_kind_stateInEditMode = 'hidden'
|
|
|
|
|
titles_kind_stateInViewMode = 'hidden'
|
2003-01-06 14:21:50 +01:00
|
|
|
|
titles_kind_valueKind_valueName = 'String'
|
|
|
|
|
titles_kindName = 'Mapping'
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
values = None
|
2002-12-02 01:11:40 +01:00
|
|
|
|
values_kind_itemKind_valueName = 'String'
|
2003-09-18 18:26:21 +02:00
|
|
|
|
values_kind_label = N_('Values')
|
2002-10-19 15:00:35 +02:00
|
|
|
|
values_kindName = 'Sequence'
|
|
|
|
|
|
2002-12-07 18:02:04 +01:00
|
|
|
|
widgetName = 'Select'
|
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-11-20 13:59:16 +01:00
|
|
|
|
if value and self.values and value not in self.getValues(slot):
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
2004-02-12 15:38:22 +01:00
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def getGroupLabels(self, slot):
|
|
|
|
|
return None
|
2003-01-07 01:10:31 +01:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getLabels(self, slot):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
if self.labels:
|
|
|
|
|
return self.labels
|
|
|
|
|
labels = {}
|
2003-11-20 13:59:16 +01:00
|
|
|
|
values = self.getValues(slot)
|
2002-12-29 19:09:10 +01:00
|
|
|
|
if values is not None:
|
|
|
|
|
for value in values:
|
|
|
|
|
labels[str(value)] = str(value)
|
2002-11-24 09:06:20 +01:00
|
|
|
|
return labels
|
|
|
|
|
|
2003-09-18 18:26:21 +02:00
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = BaseKind.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
|
|
|
|
slotNames += ['values', 'labels', 'titles']
|
|
|
|
|
return slotNames
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getSortedValues(self, slot):
|
|
|
|
|
values = self.getValues(slot)
|
2003-08-18 00:48:27 +02:00
|
|
|
|
if values is None:
|
|
|
|
|
return None
|
|
|
|
|
values = values[:]
|
|
|
|
|
sortedValues = []
|
|
|
|
|
if None in values:
|
|
|
|
|
sortedValues.append(None)
|
|
|
|
|
values.remove(None)
|
|
|
|
|
if '__all__' in values:
|
|
|
|
|
sortedValues.append('__all__')
|
|
|
|
|
values.remove('__all__')
|
2003-11-20 13:59:16 +01:00
|
|
|
|
labels = self.getLabels(slot)
|
2003-08-18 00:48:27 +02:00
|
|
|
|
values.sort(lambda x, y: locale.strcoll(_(labels[x]), _(labels[y])))
|
|
|
|
|
sortedValues += values
|
|
|
|
|
return sortedValues
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
2003-07-05 17:51:28 +02:00
|
|
|
|
groupedValuesGetterName = self.groupedValuesGetterName
|
|
|
|
|
if groupedValuesGetterName is not None:
|
|
|
|
|
currentSlot = slot
|
|
|
|
|
while currentSlot is not None:
|
|
|
|
|
container = currentSlot.getContainer()
|
|
|
|
|
try:
|
|
|
|
|
groupedValuesGetter = getattr(container,
|
|
|
|
|
groupedValuesGetterName)
|
|
|
|
|
except AttributeError:
|
|
|
|
|
currentSlot = currentSlot.parent
|
|
|
|
|
continue
|
2003-11-20 13:59:16 +01:00
|
|
|
|
groupedValues = groupedValuesGetter(slot)
|
2003-07-05 17:51:28 +02:00
|
|
|
|
assert type(groupedValues) is type({})
|
|
|
|
|
values = []
|
|
|
|
|
for group in groupedValues.keys():
|
|
|
|
|
assert type(groupedValues[group]) is type([])
|
|
|
|
|
values += groupedValues[group]
|
|
|
|
|
return values
|
|
|
|
|
return []
|
2003-03-27 19:45:02 +01:00
|
|
|
|
if self.groupedValues:
|
|
|
|
|
result = []
|
|
|
|
|
assert type(self.groupedValues) is type({})
|
|
|
|
|
for key in self.groupedValues.keys():
|
|
|
|
|
assert type(self.groupedValues[key]) is type([])
|
|
|
|
|
for value in self.groupedValues[key]:
|
|
|
|
|
result.append(value)
|
|
|
|
|
return result
|
2003-01-08 11:47:44 +01:00
|
|
|
|
if self.values:
|
2003-01-08 12:11:23 +01:00
|
|
|
|
return self.values
|
2002-11-28 15:40:37 +01:00
|
|
|
|
else:
|
|
|
|
|
return []
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Choice)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Data(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Data'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if type(value) is types.InstanceType and \
|
|
|
|
|
value.getThingName() == 'Upload':
|
|
|
|
|
return value.data
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
|
|
|
|
if value:
|
|
|
|
|
value = base64.encodestring(value)
|
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
|
def importValueFromXmlRpc(self, slot, value):
|
|
|
|
|
if value:
|
|
|
|
|
value = base64.decodestring(value)
|
|
|
|
|
return value
|
|
|
|
|
register(Data)
|
|
|
|
|
|
|
|
|
|
|
2003-05-05 20:28:36 +02:00
|
|
|
|
class Time(BaseKind):
|
|
|
|
|
defaultValue_kindName = 'Time'
|
|
|
|
|
|
|
|
|
|
formatString = '%Y-%m-%d %H:%M:%S'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
formatString_kind_label = N_('Date & Time Format')
|
2003-05-05 20:28:36 +02:00
|
|
|
|
formatString_kindName = 'String'
|
2003-01-07 01:10:31 +01:00
|
|
|
|
|
2004-01-18 20:53:56 +01:00
|
|
|
|
formatStringDay = '%Y-%m-%d'
|
|
|
|
|
formatStringDay_kind_label = N_('Date Format')
|
|
|
|
|
formatStringDay_kindName = 'String'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.FloatType # seconds since epoch
|
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
textMaxLength = 19
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Date & Time')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Date & Time')
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
widget_size = 19
|
2003-05-05 20:28:36 +02:00
|
|
|
|
widgetName = 'Time'
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if type(value) is types.IntType:
|
|
|
|
|
return float(value)
|
|
|
|
|
if type(value) is types.StringType:
|
2003-10-14 10:38:37 +02:00
|
|
|
|
if value == '':
|
|
|
|
|
return None
|
|
|
|
|
|
2004-02-11 13:26:38 +01:00
|
|
|
|
formatDate = ( self.formatStringDay, '%Y-%m-%d', '%y-%m-%d',
|
|
|
|
|
'%d/%m/%Y', '%d/%m/%y' )
|
2003-10-14 10:38:37 +02:00
|
|
|
|
formatTime = ( '%H:%M:%S', '%H:%M', '' )
|
|
|
|
|
for format in [x + ' ' + y
|
|
|
|
|
for x in formatDate for y in formatTime]:
|
|
|
|
|
try:
|
|
|
|
|
t = time.strptime(value, format)
|
|
|
|
|
except ValueError:
|
|
|
|
|
continue
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
raise faults.BadValue()
|
|
|
|
|
# Set Daylight Saving Time to -1, so that it is handled
|
|
|
|
|
# correctly by mktime.
|
|
|
|
|
t = tuple(list(t[0:-1]) + [-1])
|
don't overflow time value (would happen with excessive years)
>>> t
[20004, 6, 2, 0, 17, 3, 2, 154, 1]
>>> time.mktime(t)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
OverflowError: mktime argument out of range
2004-06-02 00:22:39 +02:00
|
|
|
|
try:
|
|
|
|
|
value = time.mktime(t)
|
|
|
|
|
except OverflowError:
|
|
|
|
|
raise faults.BadValue()
|
2003-10-14 10:38:37 +02:00
|
|
|
|
return value
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
2003-10-18 21:30:11 +02:00
|
|
|
|
if not value:
|
|
|
|
|
return ''
|
2004-01-18 20:53:56 +01:00
|
|
|
|
tupleTime = time.localtime(value)
|
|
|
|
|
if tuple(tupleTime[3:6]) == (0, 0, 0):
|
|
|
|
|
formatString = self.formatStringDay
|
|
|
|
|
else:
|
|
|
|
|
formatString = self.formatString
|
|
|
|
|
return time.strftime(formatString, time.localtime(value))
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
2003-05-05 20:28:36 +02:00
|
|
|
|
register(Time)
|
|
|
|
|
|
|
|
|
|
|
2003-05-20 20:43:39 +02:00
|
|
|
|
class DispatcherId(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
2003-05-20 20:43:39 +02:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'DispatcherId'
|
2003-05-20 20:43:39 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Glasnost Dispatcher ID')
|
2003-05-20 20:43:39 +02:00
|
|
|
|
|
|
|
|
|
widget_size = 40
|
|
|
|
|
widgetName = 'InputText'
|
|
|
|
|
|
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
return value.replace(sourceDispatcherId, destinationDispatcherId)
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2003-05-20 20:43:39 +02:00
|
|
|
|
register(DispatcherId)
|
|
|
|
|
|
|
|
|
|
|
2003-01-22 14:25:38 +01:00
|
|
|
|
class Duration(BaseKind):
|
|
|
|
|
defaultValue_kindName = 'Duration'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.FloatType # number of seconds
|
|
|
|
|
|
2003-02-02 22:18:26 +01:00
|
|
|
|
requiredParts = ['day', 'hour', 'minute', 'second']
|
2003-01-22 14:25:38 +01:00
|
|
|
|
requiredParts_kind_itemKind_valueName = 'String'
|
|
|
|
|
requiredParts_kindName = 'Sequence'
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Date & Time')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Duration')
|
2003-05-19 20:46:45 +02:00
|
|
|
|
|
2003-01-22 14:25:38 +01:00
|
|
|
|
widgetName = 'Duration'
|
|
|
|
|
register(Duration)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Email(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
|
|
|
|
defaultValue_kindName = 'Email'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Text')
|
|
|
|
|
thingPublicName = N_('Email Address')
|
2003-01-22 20:22:56 +01:00
|
|
|
|
widgetName = 'Email'
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-10-17 23:32:11 +02:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
if value == '':
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if self.isRequired:
|
|
|
|
|
raise faults.MissingSlotValue(slot)
|
2003-10-17 23:32:11 +02:00
|
|
|
|
return
|
|
|
|
|
if not re.match(r'^\S+@\S+$', value):
|
2003-07-07 13:44:50 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Email)
|
|
|
|
|
|
|
|
|
|
|
2003-05-29 17:46:46 +02:00
|
|
|
|
class Fields(BaseKind):
|
|
|
|
|
containerNames = ['Any']
|
|
|
|
|
defaultValue_kindName = 'Fields'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType # ~
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Fields')
|
2003-05-29 17:46:46 +02:00
|
|
|
|
|
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
|
|
|
|
return base64.encodestring(marshal.dumps(value))
|
|
|
|
|
|
|
|
|
|
def importValueFromXmlRpc(self, slot, valueImport):
|
|
|
|
|
return marshal.loads(base64.decodestring(valueImport))
|
|
|
|
|
register(Fields)
|
|
|
|
|
|
|
|
|
|
|
2002-10-21 13:18:00 +02:00
|
|
|
|
class Path(BaseKind):
|
2002-11-11 18:26:42 +01:00
|
|
|
|
checkFilePath = 1
|
|
|
|
|
checkFilePath_kindName = 'Boolean'
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'Path'
|
2003-05-19 20:46:45 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Text')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Path')
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
if self.checkFilePath:
|
|
|
|
|
from glasnost.proxy.tools import getProxyForServerRole
|
|
|
|
|
systemFilesProxy = getProxyForServerRole('systemfiles')
|
|
|
|
|
systemFilesProxy.checkFilePath(value)
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-21 13:18:00 +02:00
|
|
|
|
register(Path)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FilePath(Path):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'FilePath'
|
2003-05-19 20:46:45 +02:00
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Text')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('File Path')
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2003-09-29 23:52:48 +02:00
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(FilePath)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Fingerprint(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
|
|
|
|
defaultValue_kindName = 'Fingerprint'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-19 16:35:51 +02:00
|
|
|
|
textMaxLength = 50
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Text')
|
|
|
|
|
thingPublicName = N_('OpenPGP Fingerprint')
|
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None or value == '':
|
|
|
|
|
return
|
|
|
|
|
value = value.replace(' ', '')
|
|
|
|
|
if len(value) != 40:
|
2003-12-31 11:21:02 +01:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
for char in value:
|
|
|
|
|
if char not in string.hexdigits:
|
2003-12-31 11:21:02 +01:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
|
|
|
|
if value is None:
|
|
|
|
|
return ''
|
2003-10-14 10:38:37 +02:00
|
|
|
|
value = value.replace(' ', '')
|
|
|
|
|
return '%s %s %s %s %s %s %s %s %s %s' % (
|
|
|
|
|
value[ 0: 4], value[ 4: 8], value[ 8:12], value[12:16],
|
|
|
|
|
value[16:20], value[20:24], value[24:28], value[28:32],
|
|
|
|
|
value[32:36], value[36:40])
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
2003-09-29 23:52:48 +02:00
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Fingerprint)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Float(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Float'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.FloatType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Numbers')
|
|
|
|
|
thingPublicName = N_('Float Number')
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueFromOtherType(self, value):
|
2004-02-23 19:36:28 +01:00
|
|
|
|
if type(value) in (types.IntType, types.StringType):
|
|
|
|
|
try:
|
|
|
|
|
return float(value)
|
|
|
|
|
except ValueError:
|
|
|
|
|
pass
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
|
|
|
|
|
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
|
|
|
|
if value is None:
|
|
|
|
|
return ''
|
|
|
|
|
return str(value)
|
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.Numeric(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Float)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Id(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'Id'
|
2003-04-25 01:56:09 +02:00
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
permanentIds = None
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
|
|
|
|
|
2004-03-03 14:54:55 +01:00
|
|
|
|
rememberedIds = 0
|
|
|
|
|
rememberedIds_kindName = 'Boolean'
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
serverRoles = None
|
2003-09-22 01:26:12 +02:00
|
|
|
|
serverRoles_kindName = 'AcceptedRoles'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
thingPublicCategory = N_('Links')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
thingPublicName = N_('Object')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2004-03-03 00:39:31 +01:00
|
|
|
|
widgetName = 'SelectId'
|
2002-12-07 18:02:04 +01:00
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-07-05 17:51:28 +02:00
|
|
|
|
if value:
|
|
|
|
|
try:
|
|
|
|
|
commonTools.extractDispatcherId(value)
|
|
|
|
|
except:
|
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
2003-05-19 09:53:37 +02:00
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
2003-10-02 18:17:17 +02:00
|
|
|
|
if value is None:
|
2003-10-14 10:38:37 +02:00
|
|
|
|
return None
|
|
|
|
|
return value.replace(sourceDispatcherId, destinationDispatcherId)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def equals(self, kind):
|
|
|
|
|
if not BaseKind.equals(self, kind):
|
|
|
|
|
return 0
|
2004-04-04 13:35:54 +02:00
|
|
|
|
if self.getServerRoles(None) is None:
|
2003-09-22 01:26:12 +02:00
|
|
|
|
serverRoles = None
|
|
|
|
|
else:
|
2004-04-04 13:35:54 +02:00
|
|
|
|
serverRoles = self.getServerRoles(None)[:]
|
2003-09-22 01:26:12 +02:00
|
|
|
|
serverRoles.sort()
|
|
|
|
|
if kind.serverRoles is None:
|
|
|
|
|
kindServerRoles = None
|
|
|
|
|
else:
|
2004-04-04 13:35:54 +02:00
|
|
|
|
kindServerRoles = kind.getServerRoles(None)[:]
|
2003-09-22 01:26:12 +02:00
|
|
|
|
kindServerRoles.sort()
|
|
|
|
|
return serverRoles == kindServerRoles
|
2003-05-24 15:43:13 +02:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getLabels(self, slot):
|
|
|
|
|
values = self.getValues(slot)
|
2003-10-14 10:38:37 +02:00
|
|
|
|
from glasnost.proxy.tools import getObjectLabelsTranslated
|
|
|
|
|
labels = getObjectLabelsTranslated(values,
|
|
|
|
|
context.getVar('readLanguages'))
|
|
|
|
|
return labels
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def getServerRoles(self, slot):
|
2002-12-15 17:16:04 +01:00
|
|
|
|
return self.serverRoles
|
|
|
|
|
|
2004-02-12 15:38:22 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
|
|
|
|
values = self.getValues(slot)
|
|
|
|
|
groupedValues = {}
|
|
|
|
|
for v in values:
|
|
|
|
|
if v in (self.permanentIds or []):
|
|
|
|
|
role = None
|
|
|
|
|
else:
|
|
|
|
|
role = commonTools.extractRole(v)
|
|
|
|
|
if not groupedValues.has_key(role):
|
|
|
|
|
groupedValues[role] = []
|
|
|
|
|
groupedValues[role].append(v)
|
|
|
|
|
return groupedValues
|
|
|
|
|
|
|
|
|
|
def getGroupLabels(self, slot):
|
|
|
|
|
groupNames = self.getGroupedValues(slot).keys()
|
|
|
|
|
d = {}
|
|
|
|
|
for role in groupNames:
|
|
|
|
|
if not role:
|
|
|
|
|
d[''] = None
|
|
|
|
|
continue
|
|
|
|
|
common = getCommonForServerRole(role)
|
|
|
|
|
d[common.getTranslatedObjectsNameCapitalized()] = role
|
|
|
|
|
return d
|
2003-05-02 16:42:27 +02:00
|
|
|
|
|
2004-02-12 15:38:22 +01:00
|
|
|
|
def getValues(self, slot):
|
|
|
|
|
from glasnost.proxy.tools import getProxyForServerRole
|
|
|
|
|
result = []
|
|
|
|
|
result.extend(self.permanentIds or [])
|
2004-03-03 14:54:55 +01:00
|
|
|
|
currentValue = slot.getValue()
|
2004-04-04 13:35:54 +02:00
|
|
|
|
serverRoles = self.getServerRoles(slot) or context.getVar('knownRoles')
|
|
|
|
|
for role in serverRoles:
|
2004-02-12 15:38:22 +01:00
|
|
|
|
proxy = getProxyForServerRole(role)
|
|
|
|
|
if not hasattr(proxy, 'getObjectIds'):
|
|
|
|
|
continue
|
|
|
|
|
try:
|
2004-03-03 14:54:55 +01:00
|
|
|
|
objectIds = None
|
|
|
|
|
if self.rememberedIds:
|
|
|
|
|
user = context.getVar('user')
|
|
|
|
|
if user and user.objectsMemory and \
|
|
|
|
|
user.objectsMemory.has_key(role) and \
|
|
|
|
|
user.objectsMemory[role]:
|
|
|
|
|
objectIds = user.objectsMemory[role]
|
|
|
|
|
if currentValue and \
|
|
|
|
|
commonTools.extractRole(currentValue) == role:
|
|
|
|
|
objectIds.append(currentValue)
|
|
|
|
|
if not objectIds:
|
|
|
|
|
objectIds = proxy.getObjectIds()
|
2004-02-12 15:38:22 +01:00
|
|
|
|
except faults.UserAccessDenied:
|
|
|
|
|
continue
|
2004-04-19 11:58:53 +02:00
|
|
|
|
if role == 'groups' and serverRoles and serverRoles != ['groups']:
|
2004-03-03 00:39:31 +01:00
|
|
|
|
objectIds = proxy.getObjectIdsWithCriteria(
|
|
|
|
|
'not object.acceptedRoles or '\
|
|
|
|
|
' [x for x in object.acceptedRoles if x in %r]' % (
|
2004-04-04 13:35:54 +02:00
|
|
|
|
serverRoles))
|
2004-02-12 15:38:22 +01:00
|
|
|
|
result.extend(objectIds)
|
|
|
|
|
return result
|
2003-05-02 16:42:27 +02:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def includes(self, kind):
|
|
|
|
|
if BaseKind.includes(self, kind):
|
|
|
|
|
return 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.getThingName() != kind.getThingName():
|
2003-04-24 12:03:18 +02:00
|
|
|
|
return 0
|
2004-04-04 13:35:54 +02:00
|
|
|
|
if not self.getServerRoles(None):
|
2003-04-24 12:03:18 +02:00
|
|
|
|
return 1
|
2004-04-04 13:35:54 +02:00
|
|
|
|
if not kind.getServerRoles(None):
|
2003-05-19 20:46:45 +02:00
|
|
|
|
return 0
|
2003-05-24 15:43:13 +02:00
|
|
|
|
for kindServerRole in kind.serverRoles:
|
2004-04-04 13:35:54 +02:00
|
|
|
|
if not kindServerRole in self.getServerRoles(None):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 0
|
2003-05-19 20:46:45 +02:00
|
|
|
|
return 1
|
2003-04-24 12:03:18 +02:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def intersects(self, kind):
|
|
|
|
|
if BaseKind.intersects(self, kind):
|
|
|
|
|
return 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.getThingName() != kind.getThingName():
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 0
|
2004-04-04 13:35:54 +02:00
|
|
|
|
if not self.getServerRoles(None) or not kind.getServerRoles(None):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 1
|
|
|
|
|
for kindServerRole in kind.serverRoles:
|
2004-04-04 13:35:54 +02:00
|
|
|
|
if kindServerRole in self.getServerRoles(None):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 1
|
|
|
|
|
return 0
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
return not value
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
if not commonTools.extractRole(value) in rolesToKeep:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
return repairId(value)
|
|
|
|
|
return None
|
2003-12-22 16:55:46 +01:00
|
|
|
|
|
|
|
|
|
def upgradeModel_0001_0028(self, slot, model):
|
|
|
|
|
"""Convert user ids from "people" to "identities"."""
|
|
|
|
|
|
|
|
|
|
changed = 0
|
2004-01-30 18:50:57 +01:00
|
|
|
|
if self.serverRoles is not None and 'identities' in self.serverRoles \
|
|
|
|
|
and not 'people' in self.serverRoles \
|
2003-12-22 16:55:46 +01:00
|
|
|
|
and commonTools.extractRole(model) == 'people':
|
|
|
|
|
changed = 1
|
|
|
|
|
model = '%s/%s' % (
|
|
|
|
|
commonTools.makeApplicationId(model, 'identities'),
|
|
|
|
|
commonTools.extractLocalId(model))
|
|
|
|
|
return changed, model
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Id)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Integer(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'Integer'
|
2003-03-04 17:37:17 +01:00
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
max = None
|
2003-09-14 19:04:40 +02:00
|
|
|
|
max_kind_label = N_('Maximum Value')
|
2002-11-24 09:06:20 +01:00
|
|
|
|
max_kindName = 'Integer'
|
|
|
|
|
|
|
|
|
|
min = None
|
2003-09-14 19:04:40 +02:00
|
|
|
|
min_kind_label = N_('Minimum Value')
|
2002-11-24 09:06:20 +01:00
|
|
|
|
min_kindName = 'Integer'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.IntType
|
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
textMaxLength = 10
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Numbers')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Integer Number')
|
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
if self.min is not None and value < self.min:
|
2003-11-08 14:21:05 +01:00
|
|
|
|
raise faults.ValueTooSmall(slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if self.max is not None and value > self.max:
|
2003-11-08 14:21:05 +01:00
|
|
|
|
raise faults.ValueTooBig(slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if type(value) is types.FloatType:
|
|
|
|
|
return int(value)
|
|
|
|
|
if type(value) is types.StringType:
|
2003-10-09 15:14:20 +02:00
|
|
|
|
try:
|
|
|
|
|
return int(value)
|
|
|
|
|
except ValueError:
|
|
|
|
|
raise faults.BadValue()
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
2003-10-18 21:30:11 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
|
|
|
|
if value is None:
|
|
|
|
|
return ''
|
2003-10-18 21:30:11 +02:00
|
|
|
|
return str(value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if otherType is types.FloatType:
|
|
|
|
|
return float(value)
|
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
2003-10-18 21:30:11 +02:00
|
|
|
|
|
2003-10-09 15:14:20 +02:00
|
|
|
|
|
2002-12-30 20:09:04 +01:00
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = BaseKind.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
|
|
|
|
slotNames = slotNames[:]
|
|
|
|
|
i = slotNames.index('defaultValue')
|
|
|
|
|
slotNames[i:i] = ['min', 'max']
|
|
|
|
|
return slotNames
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2003-09-17 13:02:53 +02:00
|
|
|
|
def getTextMaxLength(self):
|
|
|
|
|
if self.min is not None and self.max is not None:
|
|
|
|
|
textMaxLength = max(len(str(self.min)), len(str(self.max)))
|
|
|
|
|
else:
|
|
|
|
|
textMaxLength = BaseKind.getTextMaxLength(self)
|
|
|
|
|
return textMaxLength
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.Numeric(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Integer)
|
|
|
|
|
|
|
|
|
|
|
2003-02-14 19:34:16 +01:00
|
|
|
|
class IntegerChoice(Choice):
|
|
|
|
|
defaultValue_kindName = 'IntegerChoice'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.IntType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Choice')
|
|
|
|
|
thingPublicName = N_('Integer Choice')
|
2003-02-14 19:34:16 +01:00
|
|
|
|
titles_kind_keyKind_valueName = 'Integer'
|
|
|
|
|
values_kind_itemKind_valueName = 'Integer'
|
|
|
|
|
register(IntegerChoice)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class LanguageChoice(Choice):
|
2004-01-03 15:56:47 +01:00
|
|
|
|
balloonHelp = N_('Select the [language->language] of '\
|
|
|
|
|
'this [object->objects].')
|
2003-09-19 19:48:29 +02:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'LanguageChoice'
|
2003-05-23 10:15:14 +02:00
|
|
|
|
|
2003-09-19 19:48:29 +02:00
|
|
|
|
label = N_('Language')
|
|
|
|
|
|
|
|
|
|
labels = translation.languageLabels
|
|
|
|
|
|
|
|
|
|
isRequired = 1
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Language')
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
values = translation.languageKeys
|
2003-09-19 19:48:29 +02:00
|
|
|
|
values_kind_importExport = 'private'
|
|
|
|
|
values_kind_stateInEditMode = 'hidden'
|
|
|
|
|
values_kind_stateInViewMode = 'hidden'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
2004-02-12 15:38:22 +01:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
|
|
|
|
return 1
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def getDefaultValue(self, slot):
|
|
|
|
|
languages = context.getVar('readLanguages')
|
|
|
|
|
if languages and languages[0] in self.values:
|
|
|
|
|
return languages[0]
|
|
|
|
|
else:
|
|
|
|
|
return 'en'
|
2004-01-18 20:53:56 +01:00
|
|
|
|
|
|
|
|
|
def getValues(self, slot):
|
|
|
|
|
from glasnost.proxy.tools import getProxyForServerRole
|
|
|
|
|
translationsProxy = getProxyForServerRole('translations')
|
|
|
|
|
if translationsProxy:
|
2004-01-21 12:25:51 +01:00
|
|
|
|
try:
|
|
|
|
|
return translationsProxy.getPossibleLanguages()
|
|
|
|
|
except faults.UnknownServerId:
|
|
|
|
|
return self.values
|
2004-01-18 20:53:56 +01:00
|
|
|
|
return self.values
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(LanguageChoice)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Link(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Link'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.TupleType # (name, url)
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Link')
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
if len(value) != 2:
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
name, url = value
|
|
|
|
|
if url.startswith('id:'):
|
|
|
|
|
url = url.replace(sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
return (name, url)
|
|
|
|
|
|
2003-09-15 00:52:39 +02:00
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
return value is None or not value[0] and not value[1]
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
name, url = value
|
|
|
|
|
if url.startswith('id:') \
|
|
|
|
|
and not commonTools.extractRole(url[3:]) in rolesToKeep:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
name, url = value
|
|
|
|
|
if url.startswith('id:'):
|
|
|
|
|
newId = repairId(url[3:])
|
|
|
|
|
if newId:
|
|
|
|
|
return (name, 'id:' + newId)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
|
|
|
|
register(Link)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Mapping(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Mapping'
|
|
|
|
|
|
2003-02-04 18:32:42 +01:00
|
|
|
|
deleteNullValues = 0
|
|
|
|
|
deleteNullValues_kindName = 'Boolean'
|
2003-04-16 18:19:10 +02:00
|
|
|
|
|
2002-12-02 01:11:40 +01:00
|
|
|
|
keyKind = None
|
|
|
|
|
keyKind_kind_isRequired = 1
|
|
|
|
|
keyKind_kindName = 'Kind'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.DictType
|
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
requiredCount = 0
|
|
|
|
|
requiredCount_kindName = 'Integer'
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Mapping')
|
|
|
|
|
|
2002-12-02 01:11:40 +01:00
|
|
|
|
valueKind = None
|
|
|
|
|
valueKind_kind_isRequired = 1
|
|
|
|
|
valueKind_kindName = 'Kind'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2002-12-07 18:02:04 +01:00
|
|
|
|
widgetName = 'Mapping'
|
|
|
|
|
|
2003-01-05 17:52:55 +01:00
|
|
|
|
def buildKinds(self):
|
|
|
|
|
# Should be converted to a class method, when porting Glasnost to
|
|
|
|
|
# Python 2.2.
|
|
|
|
|
BaseKind.buildKinds(self)
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
# Build keyKind from keyKind_valueName attributes.
|
2003-04-28 21:07:45 +02:00
|
|
|
|
if hasattr(self, 'keyKind_valueName') \
|
|
|
|
|
and self.keyKind_valueName is not None:
|
2003-01-05 17:52:55 +01:00
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
|
|
|
|
keyKindOptionNames = [key
|
|
|
|
|
for key in self.__dict__.keys()
|
|
|
|
|
if key.startswith('keyKind_value_')]
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for key in baseClass.__dict__.keys():
|
|
|
|
|
if key.startswith('keyKind_value_') \
|
|
|
|
|
and not key in keyKindOptionNames:
|
|
|
|
|
keyKindOptionNames.append(key)
|
|
|
|
|
keyKindOptions = {}
|
|
|
|
|
for keyKindOptionName in keyKindOptionNames:
|
|
|
|
|
keyKindOptions[keyKindOptionName[len('keyKind_value_'):]
|
|
|
|
|
] = getattr(self, keyKindOptionName)
|
2003-05-02 00:37:19 +02:00
|
|
|
|
keyKind = commonTools.newThing('kind', self.keyKind_valueName)
|
2003-01-05 17:52:55 +01:00
|
|
|
|
keyKind.buildOptions(keyKindOptions)
|
|
|
|
|
self.__class__.keyKind = keyKind
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
# Build valueKind from valueKind_valueName attributes.
|
2003-04-28 21:07:45 +02:00
|
|
|
|
if hasattr(self, 'valueKind_valueName') \
|
|
|
|
|
and self.valueKind_valueName is not None:
|
2003-01-05 17:52:55 +01:00
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
|
|
|
|
valueKindOptionNames = [key
|
|
|
|
|
for key in self.__dict__.keys()
|
|
|
|
|
if key.startswith('valueKind_value_')]
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for key in baseClass.__dict__.keys():
|
|
|
|
|
if key.startswith('valueKind_value_') \
|
|
|
|
|
and not key in valueKindOptionNames:
|
|
|
|
|
valueKindOptionNames.append(key)
|
|
|
|
|
valueKindOptions = {}
|
|
|
|
|
for valueKindOptionName in valueKindOptionNames:
|
|
|
|
|
valueKindOptions[valueKindOptionName[len('valueKind_value_'):]
|
|
|
|
|
] = getattr(self, valueKindOptionName)
|
2003-05-02 00:37:19 +02:00
|
|
|
|
valueKind = commonTools.newThing('kind', self.valueKind_valueName)
|
2003-01-05 17:52:55 +01:00
|
|
|
|
valueKind.buildOptions(valueKindOptions)
|
|
|
|
|
self.__class__.valueKind = valueKind
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
# Build keyKind from keyKind_valueClass attributes.
|
|
|
|
|
if hasattr(self, 'keyKind_valueClass') \
|
|
|
|
|
and self.keyKind_valueClass is not None:
|
|
|
|
|
realKindClass = commonTools.getThingClass(
|
|
|
|
|
'kind', self.keyKind_valueClass._kindName)
|
|
|
|
|
class class_(self.keyKind_valueClass, realKindClass):
|
|
|
|
|
pass
|
|
|
|
|
kind = class_()
|
|
|
|
|
kind.buildOptions({})
|
|
|
|
|
self.__class__.keyKind = kind
|
|
|
|
|
|
|
|
|
|
# Build valueKind from valueKind_valueClass attributes.
|
|
|
|
|
if hasattr(self, 'valueKind_valueClass') \
|
|
|
|
|
and self.valueKind_valueClass is not None:
|
|
|
|
|
realKindClass = commonTools.getThingClass(
|
|
|
|
|
'kind', self.valueKind_valueClass._kindName)
|
|
|
|
|
class class_(self.valueKind_valueClass, realKindClass):
|
|
|
|
|
pass
|
|
|
|
|
kind = class_()
|
|
|
|
|
kind.buildOptions({})
|
|
|
|
|
self.__class__.valueKind = kind
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def buildOptions(self, options):
|
2002-12-20 13:40:19 +01:00
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
2002-12-02 01:11:40 +01:00
|
|
|
|
keyKindOptionNames = [key
|
|
|
|
|
for key in self.__dict__.keys()
|
|
|
|
|
if key.startswith('keyKind_value_')]
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for key in baseClass.__dict__.keys():
|
|
|
|
|
if key.startswith('keyKind_value_') \
|
|
|
|
|
and not key in keyKindOptionNames:
|
|
|
|
|
keyKindOptionNames.append(key)
|
|
|
|
|
keyKindOptions = {}
|
|
|
|
|
for keyKindOptionName in keyKindOptionNames:
|
|
|
|
|
keyKindOptions[keyKindOptionName[len('keyKind_value_'):]
|
|
|
|
|
] = getattr(self, keyKindOptionName)
|
|
|
|
|
keyKindOptionNames = [key
|
|
|
|
|
for key in options.keys()
|
|
|
|
|
if key.startswith('keyKind_value_')]
|
|
|
|
|
for keyKindOptionName in keyKindOptionNames:
|
|
|
|
|
keyKindOptions[keyKindOptionName[len('keyKind_value_'):]
|
|
|
|
|
] = options[keyKindOptionName]
|
|
|
|
|
del options[keyKindOptionName]
|
|
|
|
|
if options.has_key('keyKind_valueName'):
|
|
|
|
|
keyKindName = options['keyKind_valueName']
|
|
|
|
|
del options['keyKind_valueName']
|
2003-04-28 21:07:45 +02:00
|
|
|
|
elif hasattr(self, 'keyKind_valueName'):
|
2002-12-02 01:11:40 +01:00
|
|
|
|
keyKindName = self.keyKind_valueName
|
2003-04-28 21:07:45 +02:00
|
|
|
|
else:
|
|
|
|
|
keyKindName = None
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if options.has_key('keyKind_valueClass'):
|
|
|
|
|
keyKindClass = options['keyKind_valueClass']
|
|
|
|
|
del options['keyKind_valueClass']
|
|
|
|
|
elif hasattr(self, 'keyKind_valueClass'):
|
|
|
|
|
keyKindClass = self.keyKind_valueClass
|
|
|
|
|
else:
|
|
|
|
|
keyKindClass = None
|
2002-12-02 01:11:40 +01:00
|
|
|
|
|
|
|
|
|
valueKindOptionNames = [key
|
|
|
|
|
for key in self.__dict__.keys()
|
|
|
|
|
if key.startswith('valueKind_value_')]
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for key in baseClass.__dict__.keys():
|
|
|
|
|
if key.startswith('valueKind_value_') \
|
|
|
|
|
and not key in valueKindOptionNames:
|
|
|
|
|
valueKindOptionNames.append(key)
|
|
|
|
|
valueKindOptions = {}
|
|
|
|
|
for valueKindOptionName in valueKindOptionNames:
|
|
|
|
|
valueKindOptions[valueKindOptionName[len('valueKind_value_'):]
|
|
|
|
|
] = getattr(self, valueKindOptionName)
|
|
|
|
|
valueKindOptionNames = [key
|
|
|
|
|
for key in options.keys()
|
|
|
|
|
if key.startswith('valueKind_value_')]
|
|
|
|
|
for valueKindOptionName in valueKindOptionNames:
|
|
|
|
|
valueKindOptions[valueKindOptionName[len('valueKind_value_'):]
|
|
|
|
|
] = options[valueKindOptionName]
|
|
|
|
|
del options[valueKindOptionName]
|
|
|
|
|
if options.has_key('valueKind_valueName'):
|
|
|
|
|
valueKindName = options['valueKind_valueName']
|
|
|
|
|
del options['valueKind_valueName']
|
2003-04-28 21:07:45 +02:00
|
|
|
|
elif hasattr(self, 'valueKind_valueName'):
|
2002-12-02 01:11:40 +01:00
|
|
|
|
valueKindName = self.valueKind_valueName
|
2003-04-28 21:07:45 +02:00
|
|
|
|
else:
|
|
|
|
|
valueKindName = None
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if options.has_key('valueKind_valueClass'):
|
|
|
|
|
valueKindClass = options['valueKind_valueClass']
|
|
|
|
|
del options['valueKind_valueClass']
|
|
|
|
|
elif hasattr(self, 'valueKind_valueClass'):
|
|
|
|
|
valueKindClass = self.valueKind_valueClass
|
|
|
|
|
else:
|
|
|
|
|
valueKindClass = None
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
|
|
|
|
BaseKind.buildOptions(self, options)
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if keyKindClass is not None:
|
|
|
|
|
realKindClass = commonTools.getThingClass(
|
|
|
|
|
'kind', keyKindClass._kindName)
|
|
|
|
|
class class_(keyKindClass, realKindClass):
|
|
|
|
|
pass
|
|
|
|
|
keyKind = class_()
|
|
|
|
|
keyKind.buildOptions(keyKindOptions)
|
|
|
|
|
self.keyKind = keyKind
|
|
|
|
|
elif keyKindName is not None:
|
2003-05-02 00:37:19 +02:00
|
|
|
|
keyKind = commonTools.newThing('kind', keyKindName)
|
2002-12-29 19:09:10 +01:00
|
|
|
|
keyKind.buildOptions(keyKindOptions)
|
|
|
|
|
self.keyKind = keyKind
|
2002-12-02 01:11:40 +01:00
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if valueKindClass is not None:
|
|
|
|
|
realKindClass = commonTools.getThingClass(
|
|
|
|
|
'kind', valueKindClass._kindName)
|
|
|
|
|
class class_(valueKindClass, realKindClass):
|
|
|
|
|
pass
|
|
|
|
|
valueKind = class_()
|
|
|
|
|
valueKind.buildOptions(valueKindOptions)
|
|
|
|
|
self.valueKind = valueKind
|
|
|
|
|
elif valueKindName is not None:
|
2003-05-02 00:37:19 +02:00
|
|
|
|
valueKind = commonTools.newThing('kind', valueKindName)
|
2002-12-29 19:09:10 +01:00
|
|
|
|
valueKind.buildOptions(valueKindOptions)
|
|
|
|
|
self.valueKind = valueKind
|
2002-12-02 01:11:40 +01:00
|
|
|
|
|
2003-04-30 21:28:48 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
|
|
|
|
if self.requiredCount > 0:
|
2003-05-11 21:57:57 +02:00
|
|
|
|
if value is None:
|
2003-04-30 21:28:48 +02:00
|
|
|
|
raise faults.MissingSlotValue(slot)
|
|
|
|
|
if len(value) < self.requiredCount:
|
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
2002-11-27 00:44:20 +01:00
|
|
|
|
keyIndex = 0
|
2002-10-19 15:00:35 +02:00
|
|
|
|
for key, val in value.items():
|
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
|
|
|
|
newKey = keySlot.getKind().convertValueIds(
|
|
|
|
|
keySlot, key, sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newKey != key:
|
|
|
|
|
del value[key]
|
|
|
|
|
value[newKey] = val
|
|
|
|
|
keyIndex += 1
|
|
|
|
|
for key, val in value.items():
|
2002-12-25 21:41:27 +01:00
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
newVal = valueSlot.getKind().convertValueIds(
|
|
|
|
|
valueSlot, val, sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newVal != val:
|
|
|
|
|
value[key] = newVal
|
|
|
|
|
return value
|
|
|
|
|
|
2003-10-15 13:17:07 +02:00
|
|
|
|
def executeModel(self, slot, when, command = None):
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
value = slot.getValue()
|
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
keyIndex = 0
|
|
|
|
|
for key, itemValue in value.items():
|
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
2003-10-15 13:17:07 +02:00
|
|
|
|
keySlot.getKind().executeModel(keySlot, when, command = command)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
2003-10-15 13:17:07 +02:00
|
|
|
|
valueSlot.getKind().executeModel(
|
|
|
|
|
valueSlot, when, command = command)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
keyIndex += 1
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
|
|
|
|
if value is None:
|
|
|
|
|
return {}
|
|
|
|
|
exportedValue = {}
|
|
|
|
|
keyIndex = 0
|
2003-04-28 21:07:45 +02:00
|
|
|
|
try:
|
|
|
|
|
value.items()
|
|
|
|
|
except:
|
|
|
|
|
raise str((self, slot, value))
|
2002-10-19 15:00:35 +02:00
|
|
|
|
for key, itemValue in value.items():
|
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
|
|
|
|
exportedKey = keySlot.getKind().exportValueToXmlRpc(keySlot, key)
|
2002-12-25 21:41:27 +01:00
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
exportedItemValue = valueSlot.getKind().exportValueToXmlRpc(
|
|
|
|
|
valueSlot, itemValue)
|
|
|
|
|
exportedValue[exportedKey] = exportedItemValue
|
|
|
|
|
keyIndex += 1
|
|
|
|
|
return exportedValue
|
|
|
|
|
|
|
|
|
|
def getItemKeyKind(self, index):
|
2002-12-02 01:11:40 +01:00
|
|
|
|
return self.keyKind
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
|
|
|
|
def getItemKeySlot(self, slot, index):
|
|
|
|
|
return slots.ItemKey(index, parent = slot)
|
|
|
|
|
|
2002-12-25 21:41:27 +01:00
|
|
|
|
def getItemKeyValueKind(self, key):
|
|
|
|
|
return self.valueKind
|
|
|
|
|
|
|
|
|
|
def getItemKeyValueSlot(self, slot):
|
|
|
|
|
return slots.ItemKeyValue(parent = slot)
|
|
|
|
|
|
|
|
|
|
def getItemValueKind(self, key):
|
2002-12-02 01:11:40 +01:00
|
|
|
|
return self.valueKind
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2002-12-25 21:41:27 +01:00
|
|
|
|
def getItemValueSlot(self, slot, key):
|
|
|
|
|
return slots.ItemValue(key, parent = slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getModelSlotByPath(self, slot, path):
|
2002-12-01 18:40:23 +01:00
|
|
|
|
if path.startswith('self'):
|
|
|
|
|
path = path[len('self'):]
|
|
|
|
|
if not path:
|
|
|
|
|
return slot
|
|
|
|
|
if path.startswith('.keys()[') and ']' in path:
|
|
|
|
|
index = int(path[len('.keys()['):path.index(']')])
|
2002-12-29 19:09:10 +01:00
|
|
|
|
return self.getItemKeyKind(index).getModelSlotByPath(
|
2002-12-01 18:40:23 +01:00
|
|
|
|
self.getItemKeySlot(slot, index), path[path.index(']') + 1:])
|
|
|
|
|
if path[0] != '[' or not ']' in path:
|
2003-02-01 21:01:44 +01:00
|
|
|
|
raise Exception('Path "%s" not found' % path)
|
2002-12-01 18:40:23 +01:00
|
|
|
|
key = eval(path[1:path.index(']')], {})
|
2002-12-29 19:09:10 +01:00
|
|
|
|
return self.getItemValueKind(key).getModelSlotByPath(
|
2002-12-25 21:41:27 +01:00
|
|
|
|
self.getItemValueSlot(slot, key), path[path.index(']') + 1:])
|
2002-12-01 18:40:23 +01:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def importValueFromXmlRpc(self, slot, importedValue):
|
|
|
|
|
if importedValue is None:
|
|
|
|
|
return {}
|
|
|
|
|
value = {}
|
2002-12-29 19:09:10 +01:00
|
|
|
|
slot.value = value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
keyIndex = 0
|
|
|
|
|
for importedKey, importedItemValue in importedValue.items():
|
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
|
|
|
|
key = keySlot.getKind().importValueFromXmlRpc(keySlot, importedKey)
|
2002-12-25 21:41:27 +01:00
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
itemValue = valueSlot.getKind().importValueFromXmlRpc(
|
|
|
|
|
valueSlot, importedItemValue)
|
|
|
|
|
value[key] = itemValue
|
|
|
|
|
keyIndex += 1
|
2002-12-29 19:09:10 +01:00
|
|
|
|
del slot.value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return value
|
|
|
|
|
|
2003-09-15 00:52:39 +02:00
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
return not value
|
|
|
|
|
|
2003-09-29 23:52:48 +02:00
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.Mapping(slot)
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
keyIndex = 0
|
|
|
|
|
for key, val in value.items():
|
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
|
|
|
|
newKey = keySlot.getKind().removeValueIds(
|
|
|
|
|
keySlot, key, rolesToKeep)
|
|
|
|
|
if newKey != key:
|
|
|
|
|
del value[key]
|
|
|
|
|
keyIndex += 1
|
|
|
|
|
for key, val in value.items():
|
2002-12-25 21:41:27 +01:00
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
2002-11-11 21:56:54 +01:00
|
|
|
|
newVal = valueSlot.getKind().removeValueIds(
|
|
|
|
|
valueSlot, val, rolesToKeep)
|
|
|
|
|
if newVal != val:
|
|
|
|
|
del value[key]
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
changed = 0
|
|
|
|
|
keyIndex = 0
|
|
|
|
|
for key, val in value.items():
|
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
|
|
|
|
newKey = keySlot.getKind().repairValue(keySlot, key, toVersion)
|
|
|
|
|
if newKey:
|
|
|
|
|
changed = 1
|
|
|
|
|
del value[key]
|
|
|
|
|
value[newKey] = val
|
|
|
|
|
keyIndex += 1
|
|
|
|
|
for key, val in value.items():
|
2002-12-25 21:41:27 +01:00
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
2002-10-31 23:24:47 +01:00
|
|
|
|
newVal = valueSlot.getKind().repairValue(
|
|
|
|
|
valueSlot, val, toVersion)
|
|
|
|
|
if newVal:
|
|
|
|
|
changed = 1
|
|
|
|
|
value[key] = newVal
|
|
|
|
|
if changed:
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
2003-12-22 16:55:46 +01:00
|
|
|
|
|
|
|
|
|
def upgradeModel(self, slot, model, toVersion):
|
|
|
|
|
changed, model = BaseKind.upgradeModel(self, slot, model, toVersion)
|
|
|
|
|
# Upgrade each key and value.
|
|
|
|
|
if model is not None:
|
2004-02-03 11:27:57 +01:00
|
|
|
|
for keyIndex, key in zip(range(len(model.keys())), model.keys()):
|
2003-12-22 16:55:46 +01:00
|
|
|
|
keySlot = self.getItemKeySlot(slot, keyIndex)
|
|
|
|
|
keyChanged, upgradedKey = keySlot.getKind().upgradeModel(
|
|
|
|
|
keySlot, key, toVersion)
|
|
|
|
|
if keyChanged:
|
|
|
|
|
changed = 1
|
|
|
|
|
model[upgradedKey] = model.pop(key)
|
|
|
|
|
for key, value in model.items():
|
|
|
|
|
valueSlot = self.getItemValueSlot(slot, key)
|
|
|
|
|
valueChanged, value = valueSlot.getKind().upgradeModel(
|
|
|
|
|
valueSlot, value, toVersion)
|
|
|
|
|
if valueChanged:
|
|
|
|
|
changed = 1
|
|
|
|
|
model[key] = value
|
|
|
|
|
return changed, model
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Mapping)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Marks(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Marks'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.DictType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
## thingPublicCategory = N_('Other')
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
for id, mark in value.items():
|
|
|
|
|
newId = id.replace(sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newId != id:
|
|
|
|
|
del value[id]
|
|
|
|
|
value[newId] = mark
|
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
|
|
|
|
exportedValue = {}
|
|
|
|
|
if value is not None:
|
|
|
|
|
for objectId, mark in value.items():
|
|
|
|
|
if mark is None:
|
|
|
|
|
exportedMark = -1
|
|
|
|
|
else:
|
|
|
|
|
exportedMark = mark
|
|
|
|
|
exportedValue[objectId] = exportedMark
|
|
|
|
|
return exportedValue
|
|
|
|
|
|
|
|
|
|
def importValueFromXmlRpc(self, slot, importedValue):
|
|
|
|
|
value = {}
|
2002-12-29 19:09:10 +01:00
|
|
|
|
slot.value = value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
for objectId, importedMark in importedValue.items():
|
|
|
|
|
if importedMark == -1:
|
|
|
|
|
mark = None
|
|
|
|
|
else:
|
|
|
|
|
mark = importedMark
|
|
|
|
|
value[objectId] = mark
|
|
|
|
|
if not value:
|
|
|
|
|
value = None
|
2002-12-29 19:09:10 +01:00
|
|
|
|
del slot.value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return value
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
for id in value.keys():
|
|
|
|
|
if not commonTools.extractRole(id) in rolesToKeep:
|
|
|
|
|
del value[id]
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
changed = 0
|
|
|
|
|
for id, mark in value.items():
|
|
|
|
|
newId = repairId(id)
|
|
|
|
|
if newId:
|
|
|
|
|
changed = 1
|
|
|
|
|
del value[id]
|
|
|
|
|
value[newId] = mark
|
|
|
|
|
if changed:
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
|
|
|
|
register(Marks)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Memory(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Memory'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.DictType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
## thingPublicCategory = N_('Other')
|
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-05-11 22:41:17 +02:00
|
|
|
|
if value and type(value) is not types.DictType:
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
for serverId, serverMemory in value.items():
|
|
|
|
|
newServerId = serverId.replace(
|
|
|
|
|
sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newServerId != serverId:
|
|
|
|
|
del value[serverId]
|
|
|
|
|
value[newServerId] = serverMemory
|
|
|
|
|
for i in range(len(serverMemory)):
|
|
|
|
|
itemId = serverMemory[i]
|
|
|
|
|
newItemId = itemId.replace(
|
|
|
|
|
sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newItemId != itemId:
|
|
|
|
|
serverMemory[i] = newItemId
|
|
|
|
|
return value
|
2002-11-11 21:56:54 +01:00
|
|
|
|
|
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
for serverId, serverMemory in value.items():
|
|
|
|
|
if not commonTools.extractRole(serverId) in rolesToKeep:
|
|
|
|
|
del value[serverId]
|
|
|
|
|
continue
|
|
|
|
|
indexesToDelete = []
|
|
|
|
|
for i in range(len(serverMemory)):
|
|
|
|
|
itemId = serverMemory[i]
|
|
|
|
|
if not commonTools.extractRole(itemId) in rolesToKeep:
|
|
|
|
|
indexesToDelete.append(i)
|
|
|
|
|
indexesToDelete.reverse()
|
|
|
|
|
for i in indexesToDelete:
|
|
|
|
|
del serverMemory[i]
|
|
|
|
|
if not serverMemory:
|
|
|
|
|
del value[serverId]
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Memory)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PairwiseMatrix(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'PairwiseMatrix'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.DictType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
## thingPublicCategory = N_('Other')
|
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-05-11 22:41:17 +02:00
|
|
|
|
if value and type(value) is not types.DictType:
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
for id1, row in value.items():
|
|
|
|
|
newId1 = id1.replace(sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newId1 != id1:
|
|
|
|
|
del value[id1]
|
|
|
|
|
value[newId1] = row
|
|
|
|
|
for id2, score in row.items():
|
|
|
|
|
newId2 = id2.replace(
|
|
|
|
|
sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newId2 != id2:
|
|
|
|
|
del row[id2]
|
|
|
|
|
row[newId2] = score
|
|
|
|
|
return value
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
for id1, row in value.items():
|
|
|
|
|
if not commonTools.extractRole(id1) in rolesToKeep:
|
|
|
|
|
del value[id1]
|
|
|
|
|
continue
|
|
|
|
|
for id2, score in row.items():
|
|
|
|
|
if not commonTools.extractRole(id2) in rolesToKeep:
|
|
|
|
|
del row[id2]
|
|
|
|
|
if not row:
|
|
|
|
|
del value[id1]
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
changed = 0
|
|
|
|
|
for id1, row in value.items():
|
|
|
|
|
newId1 = repairId(id1)
|
|
|
|
|
if newId1:
|
2002-10-19 15:00:35 +02:00
|
|
|
|
changed = 1
|
2002-10-31 23:24:47 +01:00
|
|
|
|
del value[id1]
|
|
|
|
|
value[newId1] = row
|
|
|
|
|
for id2, score in row.items():
|
|
|
|
|
newId2 = repairId(id2)
|
|
|
|
|
if newId2:
|
|
|
|
|
changed = 1
|
|
|
|
|
del row[id2]
|
|
|
|
|
row[newId2] = score
|
|
|
|
|
if changed:
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
|
|
|
|
register(PairwiseMatrix)
|
|
|
|
|
|
|
|
|
|
|
2002-11-05 10:26:13 +01:00
|
|
|
|
class Password(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Password'
|
|
|
|
|
|
2003-09-19 16:26:32 +02:00
|
|
|
|
# enterTwice is not used anymore, but should be...
|
|
|
|
|
enterTwice = 0
|
|
|
|
|
enterTwice_kind_importExport = 'private'
|
|
|
|
|
enterTwice_kind_label = N_('Enter Twice')
|
|
|
|
|
enterTwice_kind_stateInEditMode = 'hidden'
|
|
|
|
|
enterTwice_kind_stateInViewMode = 'hidden'
|
|
|
|
|
enterTwice_kindName = 'Boolean'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
thingPublicCategory = N_('Text')
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Password')
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2003-08-11 12:02:31 +02:00
|
|
|
|
widgetName = 'InputPassword'
|
2002-11-05 10:26:13 +01:00
|
|
|
|
register(Password)
|
|
|
|
|
|
|
|
|
|
|
2002-11-24 16:03:49 +01:00
|
|
|
|
class PythonIdentifier(BaseKind):
|
|
|
|
|
defaultValue_kindName = 'PythonIdentifier'
|
|
|
|
|
|
2003-09-26 10:00:43 +02:00
|
|
|
|
invalidValues = None
|
|
|
|
|
invalidValues_kind_itemKind_valueName = 'PythonIdentifier'
|
|
|
|
|
invalidValues_kind_label = N_('Invalid values')
|
|
|
|
|
invalidValues_kindName = 'Sequence'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Text')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Python Identifier')
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return
|
|
|
|
|
if self.invalidValues and value in self.invalidValues:
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if re.match('[a-zA-Z_][a-zA-Z0-9_]*$', value) is None:
|
2003-09-26 10:00:43 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2002-11-24 16:03:49 +01:00
|
|
|
|
register(PythonIdentifier)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Rating(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Rating'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.DictType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
## thingPublicCategory = N_('Other')
|
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-05-11 22:41:17 +02:00
|
|
|
|
if value and type(value) is not types.DictType:
|
2003-05-11 21:57:57 +02:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
for k in ['wins', 'losses', 'ties']:
|
|
|
|
|
v = value[k]
|
|
|
|
|
for i in range(len(v)):
|
|
|
|
|
id = v[i]
|
|
|
|
|
newId = id.replace(sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newId != id:
|
|
|
|
|
v[i] = newId
|
|
|
|
|
return value
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
for k in ['wins', 'losses', 'ties']:
|
|
|
|
|
v = value[k]
|
|
|
|
|
r = range(len(v))
|
|
|
|
|
r.reverse()
|
|
|
|
|
for i in r:
|
|
|
|
|
id = v[i]
|
|
|
|
|
if not commonTools.extractRole(id) in rolesToKeep:
|
|
|
|
|
del v[i]
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
changed = 0
|
|
|
|
|
for k in ['wins', 'losses', 'ties']:
|
|
|
|
|
v = value[k]
|
|
|
|
|
for i in range(len(v)):
|
|
|
|
|
id = v[i]
|
|
|
|
|
newId = repairId(id)
|
|
|
|
|
if newId:
|
|
|
|
|
changed = 1
|
|
|
|
|
v[i] = newId
|
|
|
|
|
if changed:
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
|
|
|
|
register(Rating)
|
|
|
|
|
|
|
|
|
|
|
2003-11-01 01:20:17 +01:00
|
|
|
|
class Script(BaseKind):
|
|
|
|
|
builtins = {
|
|
|
|
|
'abs': abs,
|
|
|
|
|
'cmp': cmp,
|
|
|
|
|
'complex': complex,
|
|
|
|
|
'divmod': divmod,
|
|
|
|
|
'float': float,
|
|
|
|
|
'hash': hash,
|
|
|
|
|
'hex': hex,
|
|
|
|
|
'int': int,
|
|
|
|
|
'len': len,
|
|
|
|
|
'long': long,
|
|
|
|
|
'None': None,
|
|
|
|
|
'oct': oct,
|
|
|
|
|
'pow': pow,
|
|
|
|
|
'repr': repr,
|
|
|
|
|
'str': str,
|
|
|
|
|
'unicode': unicode,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
containerNames = ['Any', 'String']
|
|
|
|
|
|
|
|
|
|
defaultValue_kindName = 'Script'
|
|
|
|
|
|
|
|
|
|
executeOnDisplay = 0
|
|
|
|
|
class executeOnDisplay_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
label = N_('Execute On Display')
|
|
|
|
|
|
|
|
|
|
executeOnSubmit = 0
|
|
|
|
|
class executeOnSubmit_kindClass:
|
|
|
|
|
_kindName = 'Boolean'
|
|
|
|
|
label = N_('Execute On Submit')
|
|
|
|
|
|
|
|
|
|
sourceCode = None
|
|
|
|
|
class sourceCode_kindClass:
|
|
|
|
|
_kindName = 'ScriptSourceCode'
|
|
|
|
|
label = N_('Source Code')
|
|
|
|
|
#tagInEditMode = 'div'
|
|
|
|
|
#tagInViewMode = 'div'
|
|
|
|
|
|
|
|
|
|
stateInEditMode = 'read-only'
|
|
|
|
|
|
|
|
|
|
stateInViewMode = 'read-only'
|
|
|
|
|
|
|
|
|
|
textFormat = 'text'
|
|
|
|
|
|
|
|
|
|
thingPublicCategory = N_('Data')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Script')
|
|
|
|
|
|
|
|
|
|
widgetName = 'TextArea'
|
|
|
|
|
|
|
|
|
|
def executeModel(self, slot, when, command = None):
|
|
|
|
|
if not (when == 'onDisplay' and self.executeOnDisplay) \
|
|
|
|
|
and not (when == 'onSubmit' and self.executeOnSubmit):
|
|
|
|
|
return
|
|
|
|
|
if not self.sourceCode:
|
|
|
|
|
return
|
|
|
|
|
objectSlot = slots.Root(slot.getObject())
|
|
|
|
|
objectJail = objectSlot.newJail()
|
|
|
|
|
globals_ = {
|
|
|
|
|
'__builtins__': self.builtins,
|
|
|
|
|
'command': command,
|
|
|
|
|
'self': objectJail,
|
|
|
|
|
}
|
|
|
|
|
locals_ = {}
|
|
|
|
|
# stdin = sys.stdin
|
|
|
|
|
stdout = sys.stdout
|
|
|
|
|
stderr = sys.stderr
|
|
|
|
|
sys.stdout = sys.stderr = executionOutputIO = cStringIO.StringIO()
|
|
|
|
|
try:
|
|
|
|
|
exec '%s\n' % self.sourceCode in globals_, locals_
|
|
|
|
|
except:
|
|
|
|
|
## traceback.print_exception(sys.exc_type, sys.exc_value, None)
|
|
|
|
|
traceback.print_exc()
|
|
|
|
|
# sys.stdin = stdin
|
|
|
|
|
sys.stdout = stdout
|
|
|
|
|
sys.stderr = stderr
|
|
|
|
|
slot.setValue(executionOutputIO.getvalue())
|
|
|
|
|
|
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = BaseKind.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
|
|
|
|
slotNames += ['sourceCode', 'executeOnDisplay', 'executeOnSubmit']
|
|
|
|
|
return slotNames
|
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
|
|
|
|
register(Script)
|
|
|
|
|
|
|
|
|
|
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
class ScriptSourceCode(BaseKind):
|
|
|
|
|
containerNames = ['Any', 'String']
|
|
|
|
|
|
|
|
|
|
defaultValue_kindName = 'ScriptSourceCode'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
|
|
|
|
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Script Source Code')
|
|
|
|
|
|
2003-09-27 18:07:26 +02:00
|
|
|
|
widget_rows = 10
|
|
|
|
|
widget_viewInTextArea = 1
|
|
|
|
|
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
widgetName = 'TextArea'
|
|
|
|
|
|
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
|
|
|
|
if value and type(value) is not types.StringType:
|
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
|
|
|
|
if value and (
|
|
|
|
|
value.find ('__') >= 0
|
|
|
|
|
or value.find ('_model') >= 0):
|
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
register(ScriptSourceCode)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Sequence(AbstractSequence):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'Sequence'
|
2003-04-28 21:07:45 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isRequired_kindClass(AbstractSequence.isRequired_kindClass):
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2002-12-02 01:11:40 +01:00
|
|
|
|
itemKind = None
|
|
|
|
|
itemKind_kind_isRequired = 1
|
2003-09-19 19:48:29 +02:00
|
|
|
|
itemKind_kind_label = N_('Item Type')
|
2002-12-02 01:11:40 +01:00
|
|
|
|
itemKind_kindName = 'Kind'
|
2003-09-18 21:41:28 +02:00
|
|
|
|
itemKind_valueName = 'String'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.ListType
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Sequence')
|
|
|
|
|
|
2003-01-05 17:52:55 +01:00
|
|
|
|
def buildKinds(self):
|
|
|
|
|
# Should be converted to a class method, when porting Glasnost to
|
|
|
|
|
# Python 2.2.
|
|
|
|
|
AbstractSequence.buildKinds(self)
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
# Build itemKind from itemKind_valueName attributes.
|
2003-04-28 21:07:45 +02:00
|
|
|
|
if hasattr(self, 'itemKind_valueName') \
|
|
|
|
|
and self.itemKind_valueName is not None:
|
2003-01-05 17:52:55 +01:00
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
|
|
|
|
itemKindOptionNames = [key
|
|
|
|
|
for key in self.__dict__.keys()
|
|
|
|
|
if key.startswith('itemKind_value_')]
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for key in baseClass.__dict__.keys():
|
|
|
|
|
if key.startswith('itemKind_value_') \
|
|
|
|
|
and not key in itemKindOptionNames:
|
|
|
|
|
itemKindOptionNames.append(key)
|
|
|
|
|
itemKindOptions = {}
|
|
|
|
|
for itemKindOptionName in itemKindOptionNames:
|
|
|
|
|
itemKindOptions[itemKindOptionName[len('itemKind_value_'):]
|
|
|
|
|
] = getattr(self, itemKindOptionName)
|
2003-05-02 00:37:19 +02:00
|
|
|
|
itemKind = commonTools.newThing('kind', self.itemKind_valueName)
|
2003-01-05 17:52:55 +01:00
|
|
|
|
itemKind.buildOptions(itemKindOptions)
|
|
|
|
|
self.__class__.itemKind = itemKind
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
# Build itemKind from itemKind_valueClass attributes.
|
|
|
|
|
if hasattr(self, 'itemKind_valueClass') \
|
|
|
|
|
and self.itemKind_valueClass is not None:
|
|
|
|
|
realKindClass = commonTools.getThingClass(
|
|
|
|
|
'kind', self.itemKind_valueClass._kindName)
|
|
|
|
|
class class_(self.itemKind_valueClass, realKindClass):
|
|
|
|
|
pass
|
|
|
|
|
kind = class_()
|
|
|
|
|
kind.buildOptions({})
|
|
|
|
|
self.__class__.itemKind = kind
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def buildOptions(self, options):
|
2002-12-20 13:40:19 +01:00
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
2002-12-02 01:11:40 +01:00
|
|
|
|
itemKindOptionNames = [key
|
|
|
|
|
for key in self.__dict__.keys()
|
|
|
|
|
if key.startswith('itemKind_value_')]
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for key in baseClass.__dict__.keys():
|
|
|
|
|
if key.startswith('itemKind_value_') \
|
|
|
|
|
and not key in itemKindOptionNames:
|
|
|
|
|
itemKindOptionNames.append(key)
|
|
|
|
|
itemKindOptions = {}
|
|
|
|
|
for itemKindOptionName in itemKindOptionNames:
|
|
|
|
|
itemKindOptions[itemKindOptionName[len('itemKind_value_'):]
|
|
|
|
|
] = getattr(self, itemKindOptionName)
|
|
|
|
|
itemKindOptionNames = [key
|
|
|
|
|
for key in options.keys()
|
|
|
|
|
if key.startswith('itemKind_value_')]
|
|
|
|
|
for itemKindOptionName in itemKindOptionNames:
|
|
|
|
|
itemKindOptions[itemKindOptionName[len('itemKind_value_'):]
|
|
|
|
|
] = options[itemKindOptionName]
|
|
|
|
|
del options[itemKindOptionName]
|
2003-10-08 01:42:15 +02:00
|
|
|
|
|
2002-12-02 01:11:40 +01:00
|
|
|
|
if options.has_key('itemKind_valueName'):
|
|
|
|
|
itemKindName = options['itemKind_valueName']
|
|
|
|
|
del options['itemKind_valueName']
|
|
|
|
|
else:
|
|
|
|
|
itemKindName = self.itemKind_valueName
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if options.has_key('itemKind_valueClass'):
|
|
|
|
|
itemKindClass = options['itemKind_valueClass']
|
|
|
|
|
del options['itemKind_valueClass']
|
|
|
|
|
elif hasattr(self, 'itemKind_valueClass'):
|
|
|
|
|
itemKindClass = self.itemKind_valueClass
|
|
|
|
|
else:
|
|
|
|
|
itemKindClass = None
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
AbstractSequence.buildOptions(self, options)
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
if itemKindClass is not None:
|
|
|
|
|
realKindClass = commonTools.getThingClass(
|
|
|
|
|
'kind', itemKindClass._kindName)
|
|
|
|
|
class class_(itemKindClass, realKindClass):
|
|
|
|
|
pass
|
|
|
|
|
itemKind = class_()
|
|
|
|
|
itemKind.buildOptions(itemKindOptions)
|
|
|
|
|
self.itemKind = itemKind
|
|
|
|
|
elif itemKindName is not None:
|
2003-05-02 00:37:19 +02:00
|
|
|
|
itemKind = commonTools.newThing('kind', itemKindName)
|
2002-12-29 19:09:10 +01:00
|
|
|
|
itemKind.buildOptions(itemKindOptions)
|
|
|
|
|
self.itemKind = itemKind
|
2002-12-02 01:11:40 +01:00
|
|
|
|
|
2003-11-23 10:32:37 +01:00
|
|
|
|
#def checkModelValue(self, slot, value):
|
|
|
|
|
# AbstractSequence.checkModelValue(self, slot, value)
|
|
|
|
|
# if len(value or []) < self.requiredCount:
|
|
|
|
|
# raise faults.MissingSlotValue(slot)
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
2004-01-13 11:45:53 +01:00
|
|
|
|
#def getDefaultValue(self, slot):
|
|
|
|
|
# if self.defaultValue:
|
|
|
|
|
# return self.defaultValue
|
|
|
|
|
# return [self.itemKind.getDefaultValue(slot) \
|
|
|
|
|
# for i in range(self.minCount or 1)]
|
2004-01-12 19:03:10 +01:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def getItemKind(self, index):
|
2002-12-02 01:11:40 +01:00
|
|
|
|
return self.itemKind
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-09-18 18:26:21 +02:00
|
|
|
|
## def getModelLabel(self, slot):
|
|
|
|
|
## if self.label:
|
|
|
|
|
## return self.label
|
|
|
|
|
## return self.itemKind.getModelLabelPlural(self.getItemSlot(slot, 0))
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-09-18 18:26:21 +02:00
|
|
|
|
## def getModelLabelPlural(self, slot):
|
|
|
|
|
## if self.labelPlural:
|
|
|
|
|
## return self.labelPlural
|
|
|
|
|
## return self.itemKind.getModelLabelPlural(self.getItemSlot(slot, 0))
|
2003-05-25 22:56:10 +02:00
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = AbstractSequence.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
|
|
|
|
slotNames = slotNames[:]
|
|
|
|
|
i = slotNames.index('maxCount')
|
2003-11-23 10:32:37 +01:00
|
|
|
|
slotNames[i:i] = ['itemKind']
|
2003-09-21 18:50:55 +02:00
|
|
|
|
return slotNames
|
|
|
|
|
|
2003-05-25 22:56:10 +02:00
|
|
|
|
def includes(self, kind):
|
|
|
|
|
if AbstractSequence.includes(self, kind):
|
|
|
|
|
return 1
|
|
|
|
|
if not isinstance(kind, Sequence):
|
|
|
|
|
return 0
|
2003-08-27 22:32:57 +02:00
|
|
|
|
if self.itemKind is None:
|
2003-05-25 22:56:10 +02:00
|
|
|
|
return 1
|
|
|
|
|
if kind.itemKind is None:
|
|
|
|
|
return 0
|
|
|
|
|
return self.itemKind.includes(kind.itemKind)
|
|
|
|
|
|
|
|
|
|
def intersects(self, kind):
|
|
|
|
|
if AbstractSequence.intersects(self, kind):
|
|
|
|
|
return 1
|
|
|
|
|
if not isinstance(kind, Sequence):
|
|
|
|
|
return 0
|
|
|
|
|
if self.itemKind is None or kind.itemKind is None:
|
|
|
|
|
return 1
|
|
|
|
|
return self.itemKind.intersects(kind.itemKind)
|
2003-09-15 00:52:39 +02:00
|
|
|
|
|
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
return not value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Sequence)
|
|
|
|
|
|
|
|
|
|
|
2003-08-18 00:48:27 +02:00
|
|
|
|
class AcceptedRoles(Sequence):
|
2003-12-27 17:17:56 +01:00
|
|
|
|
balloonHelp = N_('Select accepted Glasnost objects types. '\
|
|
|
|
|
'Click on "Apply" to update the list proposed below.')
|
2003-08-18 00:48:27 +02:00
|
|
|
|
|
|
|
|
|
containerNames = ['Any', 'Sequence']
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
defaultValue = [ '__all__' ]
|
2003-08-18 00:48:27 +02:00
|
|
|
|
defaultValue_kindName = 'AcceptedRoles'
|
|
|
|
|
|
2003-09-19 19:48:29 +02:00
|
|
|
|
itemKind_kind_importExport = 'private'
|
|
|
|
|
itemKind_kind_stateInEditMode = 'hidden'
|
|
|
|
|
itemKind_kind_stateInViewMode = 'hidden'
|
2003-08-18 00:48:27 +02:00
|
|
|
|
itemKind_value_allowAll = 1
|
|
|
|
|
itemKind_value_allowNone = 1
|
|
|
|
|
itemKind_valueName = 'ServerRole'
|
|
|
|
|
|
|
|
|
|
label = N_('Accepted Types')
|
|
|
|
|
|
2003-11-23 10:32:37 +01:00
|
|
|
|
minCount = 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Accepted Roles')
|
2003-08-18 00:48:27 +02:00
|
|
|
|
register(AcceptedRoles)
|
|
|
|
|
|
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
class UsersSet(Sequence):
|
2003-05-25 20:46:37 +02:00
|
|
|
|
containerNames = ['Any', 'Sequence']
|
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
defaultValue_kindName = 'UsersSet'
|
2003-01-05 12:29:18 +01:00
|
|
|
|
|
2003-09-19 19:48:29 +02:00
|
|
|
|
itemKind_kind_importExport = 'private'
|
|
|
|
|
itemKind_kind_stateInEditMode = 'hidden'
|
|
|
|
|
itemKind_kind_stateInViewMode = 'hidden'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
itemKind_value_permanentIds = [system.generalPublicId,
|
|
|
|
|
system.loggedUsersGroupId]
|
2003-12-22 16:55:46 +01:00
|
|
|
|
itemKind_value_serverRoles = ['groups', 'identities']
|
2002-12-02 01:11:40 +01:00
|
|
|
|
itemKind_valueName = 'Id'
|
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
label = N_('Users')
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-11-23 10:32:37 +01:00
|
|
|
|
minCount = 0
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = N_('People Set')
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Users')
|
2003-10-14 10:38:37 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def getDefaultValue(self, slot):
|
2003-12-22 16:55:46 +01:00
|
|
|
|
userId = context.getVar('userId')
|
|
|
|
|
if userId:
|
|
|
|
|
return [userId]
|
|
|
|
|
else:
|
|
|
|
|
return None
|
2003-08-31 01:13:52 +02:00
|
|
|
|
register(UsersSet)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AuthorsSet(UsersSet):
|
|
|
|
|
balloonHelp = N_('Choose the author(s) for this object.')
|
|
|
|
|
|
2003-12-22 16:55:46 +01:00
|
|
|
|
containerNames = ['Any', 'Sequence']
|
2003-08-31 01:13:52 +02:00
|
|
|
|
|
|
|
|
|
defaultValue_kindName = 'AuthorsSet'
|
|
|
|
|
|
2003-09-03 13:15:07 +02:00
|
|
|
|
# Remove generelPublic from the menu, because the authorsSet must be
|
|
|
|
|
# countable.
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
# FIXME: that's useless since the user may "visit" the group and it will
|
2003-11-23 10:32:37 +01:00
|
|
|
|
# be shown nevertheless
|
2003-09-03 13:15:07 +02:00
|
|
|
|
itemKind_value_permanentIds = None
|
2003-12-22 16:55:46 +01:00
|
|
|
|
itemKind_value_serverRoles = ['groups', 'people']
|
2003-09-03 13:15:07 +02:00
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
label = N_('Authors')
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Authors')
|
2003-12-22 16:55:46 +01:00
|
|
|
|
|
|
|
|
|
def getDefaultValue(self, slot):
|
|
|
|
|
user = context.getVar('user')
|
|
|
|
|
if user is not None and user.personId is not None:
|
|
|
|
|
return [user.personId]
|
|
|
|
|
else:
|
|
|
|
|
return None
|
2002-12-02 01:11:40 +01:00
|
|
|
|
register(AuthorsSet)
|
|
|
|
|
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
class Properties(Sequence):
|
2003-09-19 19:48:29 +02:00
|
|
|
|
itemKind_kind_importExport = 'private'
|
|
|
|
|
itemKind_kind_stateInEditMode = 'hidden'
|
|
|
|
|
itemKind_kind_stateInViewMode = 'hidden'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
itemKind_value_valueThingCategory = 'other'
|
|
|
|
|
itemKind_value_valueThingName = 'Property'
|
|
|
|
|
itemKind_valueName = 'Thing'
|
|
|
|
|
|
|
|
|
|
label = N_('Properties')
|
|
|
|
|
|
2003-09-26 10:00:43 +02:00
|
|
|
|
stateInViewMode = 'read-only/hidden-if-empty'
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Properties')
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2004-02-12 11:19:10 +01:00
|
|
|
|
widget_reorderingButtons = 0
|
|
|
|
|
widgetName = 'Multi'
|
|
|
|
|
|
2003-01-19 23:10:47 +01:00
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
|
|
|
|
if value is None:
|
|
|
|
|
return []
|
|
|
|
|
exportedValue = []
|
|
|
|
|
for i in range(len(value)):
|
|
|
|
|
property = value[i]
|
|
|
|
|
propertySlot = self.getPropertySlot(slot, property.name)
|
|
|
|
|
exportedProperty = propertySlot.getKind().exportValueToXmlRpc(
|
|
|
|
|
propertySlot, property)
|
|
|
|
|
exportedValue.append(exportedProperty)
|
|
|
|
|
return exportedValue
|
|
|
|
|
|
|
|
|
|
def getItemSlot(self, slot, index):
|
|
|
|
|
return slots.PropertiesItem(index, parent = slot)
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getModelSlotByPath(self, slot, path):
|
|
|
|
|
if path.startswith('self'):
|
|
|
|
|
path = path[len('self'):]
|
|
|
|
|
if not path:
|
|
|
|
|
return slot
|
|
|
|
|
if path[0] != '[' or not ']' in path:
|
2003-02-01 21:01:44 +01:00
|
|
|
|
raise Exception('Path "%s" not found' % path)
|
2002-12-29 19:09:10 +01:00
|
|
|
|
key = eval(path[1:path.index(']')], {})
|
|
|
|
|
if type(key) in (types.StringType, types.UnicodeType):
|
|
|
|
|
# Key is a property name.
|
2003-02-01 21:01:44 +01:00
|
|
|
|
# FIXME: We should raise Exception('Path "%s" not found' % path),
|
|
|
|
|
# when there is no property named key.
|
2003-08-09 17:36:26 +02:00
|
|
|
|
kind = slot.getContainer().getDirectPropertyValueKind(key)
|
2002-12-31 15:46:36 +01:00
|
|
|
|
if kind is None:
|
2003-08-09 17:36:26 +02:00
|
|
|
|
kind = slot.getContainer().getPropertyValueKind(key)
|
|
|
|
|
kind = copy.deepcopy(kind)
|
2003-05-02 00:37:19 +02:00
|
|
|
|
property = commonTools.newThing('other', 'Property')
|
2002-12-30 18:53:06 +01:00
|
|
|
|
property.kind = kind
|
|
|
|
|
property.name = key
|
2002-12-29 19:09:10 +01:00
|
|
|
|
return property.getSlotByPath(
|
2003-08-09 17:36:26 +02:00
|
|
|
|
path[path.index(']') + 1:],
|
|
|
|
|
parentSlot = slot.getContainer().getPropertySlot(
|
|
|
|
|
key, parentSlot = slot.parent))
|
2002-12-29 19:09:10 +01:00
|
|
|
|
else:
|
|
|
|
|
# Key is an integer index.
|
|
|
|
|
return self.getItemKind(key).getModelSlotByPath(
|
2003-08-09 17:36:26 +02:00
|
|
|
|
self.getItemSlot(slot, key), path[path.index(']') + 1:])
|
2003-01-19 23:10:47 +01:00
|
|
|
|
|
|
|
|
|
def getPropertySlot(self, slot, name):
|
|
|
|
|
return slots.Property(name, parent = slot)
|
|
|
|
|
|
|
|
|
|
def importValueFromXmlRpc(self, slot, importedValue):
|
|
|
|
|
if importedValue is None:
|
|
|
|
|
return []
|
|
|
|
|
value = []
|
|
|
|
|
slot.value = value
|
|
|
|
|
for i in range(len(importedValue)):
|
|
|
|
|
importedProperty = importedValue[i]
|
|
|
|
|
propertyName = importedProperty['name']
|
|
|
|
|
propertySlot = self.getPropertySlot(slot, propertyName)
|
|
|
|
|
value.append(propertySlot.getKind().importValueFromXmlRpc(
|
|
|
|
|
propertySlot, importedProperty))
|
|
|
|
|
del slot.value
|
|
|
|
|
return value
|
2002-12-29 19:09:10 +01:00
|
|
|
|
register(Properties)
|
|
|
|
|
|
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
class ReadersSet(UsersSet):
|
2003-01-06 23:11:07 +01:00
|
|
|
|
balloonHelp = N_(
|
2003-12-27 17:17:56 +01:00
|
|
|
|
'Select one or more [readers->readers-and-editors] or groups of readers for '\
|
|
|
|
|
'this [object->objects] (Readers are allowed to view objects, they have '\
|
|
|
|
|
'read access to them). '\
|
|
|
|
|
'Click on "[Others->buttons-others]" if your choice is not proposed in the '\
|
|
|
|
|
'list. Click on "Add" to add another one. '\
|
|
|
|
|
'Select "None" to remove one.')
|
2003-01-06 23:11:07 +01:00
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
containerNames = ['Any', 'Sequence', 'UsersSet']
|
2003-05-25 20:46:37 +02:00
|
|
|
|
|
2003-01-05 12:29:18 +01:00
|
|
|
|
defaultValue_kindName = 'ReadersSet'
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
label = N_('Readers')
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Readers')
|
2002-12-02 01:44:03 +01:00
|
|
|
|
register(ReadersSet)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class ServerId(Id):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'ServerId'
|
2003-05-20 19:24:43 +02:00
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Glasnost Server ID')
|
2002-12-07 18:02:04 +01:00
|
|
|
|
|
|
|
|
|
## widgetName = 'SelectServerId'
|
2003-01-14 15:08:44 +01:00
|
|
|
|
widget_size = 40
|
|
|
|
|
widgetName = 'InputText'
|
Surcharge de la méthode isAdmin dans les Cards, afin qu'un utilisateur non
logué puisse créer et modifier des fiches, quand il n'y a aucun
administrateur.
Ajout des instructions ApplicationToken, ClientToken, ExtractDispatcherId,
MakeApplicationId & UserToken
Plus diverses corrections, afin que le script dataflow de création d'un
utilisateur fonctionne.
# #
# # # #### ##### #### # ##### ######
# # # # # # # # # # # #
# # # # # # # # # # #####
# # # # # # # # ##### #
# # # # # # # # # # # #
# # #### # #### # # # ######
Pour utiliser ce premier script dataflow, assurez vous que le CardsServer et
le DataflowsServer ne sont pas désactivés et faire :
make system
make install
glasnost-devel start
puis aller à l'URL http://localhost/init
C'est lent, c'est incomplet, c'est livré en retard, etc, mais cela marche.
2003-05-21 17:52:32 +02:00
|
|
|
|
|
2003-09-29 23:52:48 +02:00
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
|
|
|
|
|
Surcharge de la méthode isAdmin dans les Cards, afin qu'un utilisateur non
logué puisse créer et modifier des fiches, quand il n'y a aucun
administrateur.
Ajout des instructions ApplicationToken, ClientToken, ExtractDispatcherId,
MakeApplicationId & UserToken
Plus diverses corrections, afin que le script dataflow de création d'un
utilisateur fonctionne.
# #
# # # #### ##### #### # ##### ######
# # # # # # # # # # # #
# # # # # # # # # # #####
# # # # # # # # ##### #
# # # # # # # # # # # #
# # #### # #### # # # ######
Pour utiliser ce premier script dataflow, assurez vous que le CardsServer et
le DataflowsServer ne sont pas désactivés et faire :
make system
make install
glasnost-devel start
puis aller à l'URL http://localhost/init
C'est lent, c'est incomplet, c'est livré en retard, etc, mais cela marche.
2003-05-21 17:52:32 +02:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(ServerId)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ServerRole(Choice):
|
2003-03-21 15:47:12 +01:00
|
|
|
|
allowAll = 0
|
|
|
|
|
allowAll_kindName = 'Boolean'
|
|
|
|
|
|
2003-08-18 00:48:27 +02:00
|
|
|
|
allowNone = 0
|
|
|
|
|
allowNone_kindName = 'Boolean'
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'ServerRole'
|
Surcharge de la méthode isAdmin dans les Cards, afin qu'un utilisateur non
logué puisse créer et modifier des fiches, quand il n'y a aucun
administrateur.
Ajout des instructions ApplicationToken, ClientToken, ExtractDispatcherId,
MakeApplicationId & UserToken
Plus diverses corrections, afin que le script dataflow de création d'un
utilisateur fonctionne.
# #
# # # #### ##### #### # ##### ######
# # # # # # # # # # # #
# # # # # # # # # # #####
# # # # # # # # ##### #
# # # # # # # # # # # #
# # #### # #### # # # ######
Pour utiliser ce premier script dataflow, assurez vous que le CardsServer et
le DataflowsServer ne sont pas désactivés et faire :
make system
make install
glasnost-devel start
puis aller à l'URL http://localhost/init
C'est lent, c'est incomplet, c'est livré en retard, etc, mais cela marche.
2003-05-21 17:52:32 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Server Role')
|
2003-08-18 00:48:27 +02:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getLabels(self, slot):
|
|
|
|
|
roles = self.getValues(slot)
|
2003-08-18 00:48:27 +02:00
|
|
|
|
labels = {}
|
|
|
|
|
for role in roles:
|
|
|
|
|
if role in [None, '__all__']:
|
|
|
|
|
continue
|
|
|
|
|
common = getCommonForServerRole(role)
|
|
|
|
|
if common is None:
|
|
|
|
|
label = role
|
|
|
|
|
else:
|
|
|
|
|
label = common.objectsNameCapitalized
|
|
|
|
|
labels[role] = label
|
|
|
|
|
return labels
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
2003-03-04 01:14:07 +01:00
|
|
|
|
from glasnost.proxy.DispatcherProxy import getRegisteredRoles
|
2003-08-18 00:48:27 +02:00
|
|
|
|
values = []
|
|
|
|
|
if self.allowNone:
|
|
|
|
|
values.append(None)
|
2003-03-21 15:47:12 +01:00
|
|
|
|
if self.allowAll:
|
2003-08-18 00:48:27 +02:00
|
|
|
|
values.append('__all__')
|
2003-10-14 23:43:07 +02:00
|
|
|
|
registeredRoles = getRegisteredRoles(context.getVar('dispatcherId'))
|
|
|
|
|
for role in registeredRoles:
|
|
|
|
|
common = getCommonForServerRole(role)
|
|
|
|
|
if common is None:
|
|
|
|
|
continue
|
|
|
|
|
if not hasattr(common, 'useObjectIds') or not common.useObjectIds:
|
|
|
|
|
continue
|
|
|
|
|
values.append(role)
|
2003-08-18 00:48:27 +02:00
|
|
|
|
return values
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(ServerRole)
|
|
|
|
|
|
|
|
|
|
|
2002-12-07 18:02:04 +01:00
|
|
|
|
class SlotName(Choice):
|
|
|
|
|
defaultValue_kindName = 'SlotName'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Slot Name')
|
2002-12-07 18:02:04 +01:00
|
|
|
|
register(SlotName)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Source(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Source'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
return value.replace(sourceDispatcherId, destinationDispatcherId)
|
2002-11-11 21:56:54 +01:00
|
|
|
|
|
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
if not commonTools.extractRole(value) in rolesToKeep:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Source)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class String(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any']
|
2002-11-24 09:06:20 +01:00
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
defaultValue_kindName = 'String'
|
2003-04-27 19:10:31 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
isTranslatable = 1
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isTranslatable_kindClass(BaseKind.isTranslatable_kindClass):
|
|
|
|
|
importExport = 'public'
|
|
|
|
|
stateInEditMode = 'read-write'
|
|
|
|
|
stateInViewMode = 'read-only'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2002-12-07 18:02:04 +01:00
|
|
|
|
possibleWidgetNames = ['InputText', 'TextArea']
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class textFormat_kindClass(BaseKind.textFormat_kindClass):
|
|
|
|
|
importExport = 'public'
|
|
|
|
|
stateInEditMode = 'read-write'
|
|
|
|
|
stateInViewMode = 'read-only/hidden-if-empty'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class textMaxLength_kindClass(BaseKind.textMaxLength_kindClass):
|
|
|
|
|
importExport = 'public'
|
|
|
|
|
stateInEditMode = 'read-write'
|
|
|
|
|
stateInViewMode = 'read-only/hidden-if-empty'
|
2003-09-16 12:13:25 +02:00
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = N_('Text')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Text')
|
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class useFileStorage_kindClass(BaseKind.useFileStorage_kindClass):
|
|
|
|
|
importExport = 'public'
|
|
|
|
|
stateInEditMode = 'read-write'
|
|
|
|
|
stateInViewMode = 'read-only'
|
2003-08-31 22:54:12 +02:00
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
2003-10-09 15:14:20 +02:00
|
|
|
|
if self.isRequired and value == '':
|
|
|
|
|
raise faults.MissingSlotValue(slot)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
if self.getTextFormat(slot) == 'html':
|
|
|
|
|
from xml.dom.minidom import parseString
|
|
|
|
|
import xml
|
|
|
|
|
try:
|
2007-12-18 21:04:56 +01:00
|
|
|
|
value = unicode(value,'iso-8859-15')
|
|
|
|
|
import codecs
|
|
|
|
|
value = codecs.utf_8_encode(value)[0]
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
parseString(value)
|
|
|
|
|
except xml.parsers.expat.ExpatError:
|
2003-11-08 14:21:05 +01:00
|
|
|
|
raise faults.BadSlotValue(slot, value)
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2004-01-31 23:17:38 +01:00
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
|
|
|
|
return value
|
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def getCmpFunction(self):
|
|
|
|
|
return locale.strcoll
|
2003-09-15 00:52:39 +02:00
|
|
|
|
|
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
return not value
|
2003-09-29 23:52:48 +02:00
|
|
|
|
|
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(String)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Structure(AbstractSequence):
|
2003-10-01 10:50:12 +02:00
|
|
|
|
canInsertOrDelete = 0
|
|
|
|
|
|
2003-05-31 09:20:05 +02:00
|
|
|
|
containerNames = ['Any']
|
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Structure'
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
parameters = None
|
2002-12-02 01:11:40 +01:00
|
|
|
|
parameters_kind_itemKind_value_valueThingCategory = 'other'
|
|
|
|
|
parameters_kind_itemKind_value_valueThingName = 'Parameter'
|
|
|
|
|
parameters_kind_itemKind_valueName = 'Thing'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
parameters_kindName = 'Sequence'
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Structure')
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def getItemKind(self, index):
|
|
|
|
|
if self.parameters is None or index >= len(self.parameters):
|
|
|
|
|
return None
|
|
|
|
|
return self.parameters[index].kind
|
2003-09-15 00:52:39 +02:00
|
|
|
|
|
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
if value is None:
|
|
|
|
|
return 1
|
|
|
|
|
for i in range(len(self.parameters)):
|
|
|
|
|
itemSlot = self.getItemSlot(slot, i)
|
|
|
|
|
if not itemSlot.getKind().isEmptyModelValue(itemSlot, value[i]):
|
|
|
|
|
return 0
|
|
|
|
|
return 1
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Structure)
|
|
|
|
|
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
class Thing(Choice):
|
|
|
|
|
accessInCreateMode = None
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class accessInCreateMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
label = N_('Access in Creation Mode')
|
|
|
|
|
labels = {
|
|
|
|
|
'': N_('Same As Edition Mode'),
|
|
|
|
|
'embedded': N_('Embedded'),
|
|
|
|
|
'pointed': N_('Link'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
None,
|
|
|
|
|
'embedded',
|
|
|
|
|
'pointed',
|
|
|
|
|
]
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
accessInEditMode = 'embedded'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class accessInEditMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('Access in Edition Mode')
|
|
|
|
|
labels = {
|
|
|
|
|
'embedded': N_('Embedded'),
|
|
|
|
|
'pointed': N_('Link'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
'embedded',
|
|
|
|
|
'pointed',
|
|
|
|
|
]
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
accessInViewMode = 'embedded'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class accessInViewMode_kindClass:
|
|
|
|
|
_kindName = 'Choice'
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
isRequired = 1
|
|
|
|
|
label = N_('Access in View Mode')
|
|
|
|
|
labels = {
|
|
|
|
|
'embedded': N_('Embedded'),
|
|
|
|
|
'pointed': N_('Link'),
|
|
|
|
|
}
|
|
|
|
|
sortLabels = 0
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
|
|
|
|
values = [
|
|
|
|
|
'embedded',
|
|
|
|
|
'pointed',
|
|
|
|
|
]
|
2003-01-07 01:10:31 +01:00
|
|
|
|
|
2003-06-08 16:16:33 +02:00
|
|
|
|
containerNames = ['Any']
|
|
|
|
|
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Thing'
|
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
possibleWidgetNames = ['Thing']
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.InstanceType
|
|
|
|
|
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Thing')
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
valueThingCategory = None
|
2003-09-18 22:53:23 +02:00
|
|
|
|
valueThingCategory_kind_stateInEditMode = 'hidden'
|
|
|
|
|
valueThingCategory_kind_stateInViewMode = 'hidden'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
valueThingCategory_kindName = 'String'
|
|
|
|
|
|
|
|
|
|
valueThingName = None
|
2003-09-18 22:53:23 +02:00
|
|
|
|
valueThingName_kind_stateInEditMode = 'hidden'
|
|
|
|
|
valueThingName_kind_stateInViewMode = 'hidden'
|
2002-10-19 15:00:35 +02:00
|
|
|
|
valueThingName_kindName = 'String'
|
|
|
|
|
|
2003-09-22 20:21:18 +02:00
|
|
|
|
values_kind_importExport = 'private'
|
|
|
|
|
values_kind_stateInEditMode = 'hidden'
|
|
|
|
|
values_kind_stateInViewMode = 'hidden'
|
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
widgetName = 'Thing'
|
|
|
|
|
class widgetName_kindClass(Choice.widgetName_kindClass):
|
|
|
|
|
importExport = 'private'
|
2003-09-18 22:53:23 +02:00
|
|
|
|
|
2003-05-11 21:57:57 +02:00
|
|
|
|
def checkModelValue(self, slot, value):
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
# Pay attention: Use BaseKind instead of Choice.
|
2003-05-11 21:57:57 +02:00
|
|
|
|
BaseKind.checkModelValue(self, slot, value)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
# TODO: check value is an instance of the appropriate class
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2003-04-14 16:48:56 +02:00
|
|
|
|
def convertValueIds(self, slot, value, sourceDispatcherId,
|
|
|
|
|
destinationDispatcherId):
|
2003-05-19 20:46:45 +02:00
|
|
|
|
if value is None:
|
|
|
|
|
return None
|
2002-12-29 19:09:10 +01:00
|
|
|
|
value.convertIds(
|
2003-09-21 18:50:55 +02:00
|
|
|
|
sourceDispatcherId, destinationDispatcherId, parentSlot = slot)
|
2002-11-28 23:37:07 +01:00
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-10-30 10:45:53 +01:00
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType:
|
|
|
|
|
return value.getThingName()
|
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def equals(self, kind):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if not Choice.equals(self, kind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 0
|
|
|
|
|
return self.valueThingCategory == kind.valueThingCategory \
|
|
|
|
|
and self.valueThingName == kind.valueThingName
|
|
|
|
|
|
2003-10-15 13:17:07 +02:00
|
|
|
|
def executeModel(self, slot, when, command = None):
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
value = slot.getValue()
|
|
|
|
|
if value is None:
|
|
|
|
|
return
|
2003-10-15 13:17:07 +02:00
|
|
|
|
value.execute(when, parentSlot = slot, command = command)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def exportValueToXmlRpc(self, slot, value):
|
2003-01-01 22:12:19 +01:00
|
|
|
|
if value is None:
|
|
|
|
|
return None
|
2002-12-29 19:09:10 +01:00
|
|
|
|
return value.exportToXmlRpc(parentSlot = slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
categories = []
|
|
|
|
|
groupedValues = {}
|
|
|
|
|
for thingClass in commonTools.getAllThingClasses().values():
|
|
|
|
|
if thingClass.thingCategory != self.valueThingCategory:
|
|
|
|
|
continue
|
|
|
|
|
if thingClass.thingPublicCategory is None:
|
|
|
|
|
continue
|
|
|
|
|
if not thingClass.thingPublicCategory in categories:
|
|
|
|
|
categories.append(thingClass.thingPublicCategory)
|
|
|
|
|
groupedValues[thingClass.thingPublicCategory] = []
|
|
|
|
|
groupedValues[thingClass.thingPublicCategory].append(
|
|
|
|
|
thingClass.getThingName.im_func(thingClass))
|
2004-02-12 15:38:22 +01:00
|
|
|
|
return groupedValues
|
|
|
|
|
#categories.sort(lambda x, y: locale.strcoll(_(x), _(y)))
|
|
|
|
|
#labels = self.getLabels(slot)
|
|
|
|
|
#for values in groupedValues.values():
|
|
|
|
|
# values.sort(lambda x, y:
|
|
|
|
|
# locale.strcoll(_(labels[x]), _(labels[y])))
|
|
|
|
|
|
|
|
|
|
def getGroupLabels(self, slot):
|
|
|
|
|
groupNames = self.getGroupedValues(slot).keys()
|
|
|
|
|
groupLabels = {}
|
|
|
|
|
for g in groupNames:
|
|
|
|
|
groupLabels[_(g)] = g
|
|
|
|
|
return groupLabels
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def getDefaultValue(self, slot):
|
|
|
|
|
value = commonTools.newThing(
|
|
|
|
|
self.valueThingCategory, self.valueThingName)
|
|
|
|
|
return value.getDefaultValue(slot)
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getLabels(self, slot):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.labels is not None:
|
|
|
|
|
return self.labels
|
|
|
|
|
self.labels = {}
|
|
|
|
|
for thingClass in commonTools.getAllThingClasses().values():
|
|
|
|
|
if thingClass.thingCategory != self.valueThingCategory:
|
|
|
|
|
continue
|
|
|
|
|
value = thingClass.getThingName.im_func(thingClass)
|
2004-02-12 15:38:22 +01:00
|
|
|
|
self.labels[value] = _(
|
|
|
|
|
thingClass.getThingPublicName.im_func(thingClass) )
|
2003-09-21 18:50:55 +02:00
|
|
|
|
return self.labels
|
|
|
|
|
|
2002-12-29 19:09:10 +01:00
|
|
|
|
def getModelSlotByPath(self, slot, path):
|
2002-12-01 18:40:23 +01:00
|
|
|
|
value = slot.getValue()
|
|
|
|
|
if value is None:
|
2003-05-02 00:37:19 +02:00
|
|
|
|
value = commonTools.newThing(
|
2003-09-21 18:50:55 +02:00
|
|
|
|
self.valueThingCategory, self.valueThingName)
|
2002-12-01 18:40:23 +01:00
|
|
|
|
slot = slot.detach(value)
|
|
|
|
|
return value.getSlotByPath(path, parentSlot = slot)
|
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
def getModelWidget(self, slot, forceEmbedding = 0):
|
|
|
|
|
if forceEmbedding or self.isModelEmbedded(slot):
|
|
|
|
|
return Choice.getModelWidget(
|
|
|
|
|
self, slot, forceEmbedding = forceEmbedding)
|
|
|
|
|
else:
|
|
|
|
|
widget = commonTools.newThing('widget', 'Select')
|
|
|
|
|
widgetOptionHeader = 'widget_'
|
|
|
|
|
widgetOptionHeaderLen = len(widgetOptionHeader)
|
|
|
|
|
widgetOptionNames = [
|
|
|
|
|
name
|
|
|
|
|
for name in self.__dict__.keys()
|
|
|
|
|
if name.startswith(widgetOptionHeader) \
|
|
|
|
|
and not name.startswith(widgetOptionHeader + 'kind')]
|
|
|
|
|
baseClasses = self.getC3ClassLinearization()
|
|
|
|
|
for baseClass in baseClasses:
|
|
|
|
|
for name in baseClass.__dict__.keys():
|
|
|
|
|
if name.startswith(widgetOptionHeader) \
|
|
|
|
|
and not name.startswith(widgetOptionHeader + 'kind') \
|
|
|
|
|
and name not in widgetOptionNames:
|
|
|
|
|
widgetOptionNames.append(name)
|
|
|
|
|
widgetOptions = {}
|
|
|
|
|
for widgetOptionName in widgetOptionNames:
|
|
|
|
|
widgetOptions[widgetOptionName[widgetOptionHeaderLen:]
|
|
|
|
|
] = getattr(self, widgetOptionName)
|
|
|
|
|
widget.buildOptions(widgetOptions)
|
|
|
|
|
return widget
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.values is not None:
|
|
|
|
|
return self.values
|
|
|
|
|
self.values = [
|
|
|
|
|
thingClass.getThingName.im_func(thingClass)
|
|
|
|
|
for thingClass in commonTools.getAllThingClasses().values()
|
|
|
|
|
if thingClass.thingCategory == self.valueThingCategory \
|
|
|
|
|
and thingClass.thingPublicCategory is not None]
|
|
|
|
|
return self.values
|
2002-12-07 18:02:04 +01:00
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def importValueFromXmlRpc(self, slot, importedValue):
|
2003-01-01 22:12:19 +01:00
|
|
|
|
if importedValue is None:
|
|
|
|
|
return None
|
2003-05-02 00:37:19 +02:00
|
|
|
|
value = commonTools.newThing(
|
|
|
|
|
importedValue['__thingCategory__'],
|
|
|
|
|
importedValue['__thingName__'])
|
2002-12-29 19:09:10 +01:00
|
|
|
|
slot.value = value
|
|
|
|
|
value.importFromXmlRpc(importedValue, parentSlot = slot)
|
|
|
|
|
del slot.value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return value
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
def includes(self, kind):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if Choice.includes(self, kind):
|
2003-05-19 11:00:03 +02:00
|
|
|
|
return 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.getThingName() != kind.getThingName():
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 0
|
|
|
|
|
if self.valueThingCategory is None:
|
|
|
|
|
return 1
|
|
|
|
|
if self.valueThingCategory != kind.valueThingCategory:
|
|
|
|
|
return 0
|
|
|
|
|
if self.valueThingName is None:
|
|
|
|
|
return 1
|
|
|
|
|
return self.valueThingName == kind.valueThingName
|
|
|
|
|
|
|
|
|
|
def intersects(self, kind):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if Choice.intersects(self, kind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.getThingName() != kind.getThingName():
|
2003-05-24 15:43:13 +02:00
|
|
|
|
return 0
|
|
|
|
|
if self.valueThingCategory is None or kind.valueThingCategory is None:
|
|
|
|
|
return 1
|
|
|
|
|
if self.valueThingCategory != kind.valueThingCategory:
|
|
|
|
|
return 0
|
|
|
|
|
if self.valueThingName is None or kind.valueThingName is None:
|
|
|
|
|
return 1
|
|
|
|
|
return self.valueThingName == kind.valueThingName
|
2003-05-19 11:00:03 +02:00
|
|
|
|
|
2003-09-15 00:52:39 +02:00
|
|
|
|
def isEmptyModelValue(self, slot, value):
|
|
|
|
|
if value is None:
|
|
|
|
|
return 1
|
2003-10-14 23:43:07 +02:00
|
|
|
|
if self.isModelEmbedded(slot):
|
|
|
|
|
return value.isEmpty(parentSlot = slot)
|
|
|
|
|
else:
|
|
|
|
|
return 0
|
2003-09-15 00:52:39 +02:00
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
def isModelEmbedded(self, slot):
|
|
|
|
|
layoutMode = context.getVar('layoutMode')
|
|
|
|
|
if layoutMode == 'edit':
|
|
|
|
|
isCreateEditMode = context.getVar('isCreateEditMode', default = 0)
|
|
|
|
|
if isCreateEditMode:
|
|
|
|
|
return self.accessInCreateMode == 'embedded' \
|
|
|
|
|
or self.accessInCreateMode is None \
|
|
|
|
|
and self.accessInEditMode == 'embedded'
|
|
|
|
|
else:
|
|
|
|
|
return self.accessInEditMode == 'embedded'
|
|
|
|
|
elif layoutMode == 'use':
|
2003-10-14 23:43:07 +02:00
|
|
|
|
return 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
else:
|
|
|
|
|
return self.accessInViewMode == 'embedded'
|
|
|
|
|
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
def newJail(self, slot):
|
2003-09-29 15:46:29 +02:00
|
|
|
|
if self.valueThingCategory == 'object':
|
|
|
|
|
return jails.Object(slot)
|
|
|
|
|
else:
|
|
|
|
|
return jails.Thing(slot)
|
Les fiches peuvent maintenant contenir des scripts python, ce qui permet
entre autres d'avoir des champs calcules.
Exemple :
- Creer une fiche avec 3 champs : firstName, lastName & title.
- Creer un 4eme champ du type Script, contenant comme expression :
self.title = '%s, %s' % (self.lastName, self.firstName)
- Cocher la case 'Execute On Submit' de ce champ.
- Et voila, le champ title est recalcule chaque modification de la fiche.
Note :
L'utilisateur ne manipule pas directement les objets Glasnost, mais des
wrappers (appeles "jails"), qui lui cachent la complexite et s'assurent que
les champs sont du bon type. Par exemple, dans l'affectation "self.title =
...", Glasnost verifie que la donnee a affecter au champ title est bien de
la kind String avant de faire l'affectation reelle.
Comme quoi, Python permet de faire du typage fort :-)
2003-09-27 16:09:47 +02:00
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
2003-05-19 20:46:45 +02:00
|
|
|
|
if value is None:
|
|
|
|
|
return None
|
2003-04-14 16:48:56 +02:00
|
|
|
|
value.removeIds(rolesToKeep, parentSlot = slot)
|
|
|
|
|
return value
|
2002-11-11 21:56:54 +01:00
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
2002-12-29 19:09:10 +01:00
|
|
|
|
changed = value.repair(toVersion, parentSlot = slot)
|
2002-10-31 23:24:47 +01:00
|
|
|
|
if changed:
|
|
|
|
|
return value
|
|
|
|
|
return None
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
def setToDefaultValue(self, slot):
|
|
|
|
|
if self.isModelEmbedded(slot):
|
|
|
|
|
slot, value = self.getCreatedModelSlotAndValue(slot)
|
2004-02-14 10:31:51 +01:00
|
|
|
|
if self.getDefaultValue(slot):
|
|
|
|
|
slot.getKind().setToDefaultValue(slot)
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
else:
|
|
|
|
|
BaseKind.setToDefaultValue(self, slot)
|
|
|
|
|
|
2003-12-22 16:55:46 +01:00
|
|
|
|
def upgradeModel(self, slot, model, toVersion):
|
|
|
|
|
changed, model = BaseKind.upgradeModel(self, slot, model, toVersion)
|
|
|
|
|
if model is not None:
|
|
|
|
|
if model.upgrade(toVersion, parentSlot = slot):
|
|
|
|
|
changed = 1
|
|
|
|
|
return changed, model
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Thing)
|
|
|
|
|
|
|
|
|
|
|
2003-05-24 15:43:13 +02:00
|
|
|
|
class Union(BaseKind):
|
|
|
|
|
containerNames = ['Any']
|
|
|
|
|
|
|
|
|
|
defaultValue_kindName = 'Union'
|
|
|
|
|
|
|
|
|
|
isPractical = 0
|
|
|
|
|
|
|
|
|
|
items = None
|
|
|
|
|
items_kind_itemKind_valueName = 'Kind'
|
|
|
|
|
items_kind_label = N_('Items')
|
|
|
|
|
items_kindName = 'Sequence'
|
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Union')
|
2003-05-24 15:43:13 +02:00
|
|
|
|
|
|
|
|
|
def equals(self, kind):
|
|
|
|
|
if not BaseKind.equals(self, kind):
|
|
|
|
|
return 0
|
|
|
|
|
if not self.items or not kind.items:
|
|
|
|
|
return 0
|
|
|
|
|
if len(self.items) != len(kind.items):
|
|
|
|
|
return 0
|
|
|
|
|
for item in self.items:
|
|
|
|
|
for kindItem in kind.items:
|
|
|
|
|
if item.equals(kindItem):
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
return 0
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
def includes(self, kind):
|
|
|
|
|
if BaseKind.includes(self, kind):
|
|
|
|
|
return 1
|
|
|
|
|
if self.items is not None:
|
|
|
|
|
for item in self.items:
|
|
|
|
|
if item.includes(kind):
|
|
|
|
|
return 1
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
def intersects(self, kind):
|
|
|
|
|
if BaseKind.intersects(self, kind):
|
|
|
|
|
return 1
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if self.getThingName() != kind.getThingName():
|
2003-05-24 15:43:13 +02:00
|
|
|
|
if not self.items or not kind.items:
|
|
|
|
|
return 0
|
|
|
|
|
for item in self.items:
|
|
|
|
|
for kindItem in kind.items:
|
|
|
|
|
if item.intersects(kindItem):
|
|
|
|
|
return 1
|
|
|
|
|
return 0
|
|
|
|
|
if self.items is not None:
|
|
|
|
|
for item in self.items:
|
|
|
|
|
if item.intersects(kind):
|
|
|
|
|
return 1
|
|
|
|
|
return 0
|
|
|
|
|
register(Union)
|
|
|
|
|
|
|
|
|
|
|
2002-12-02 12:24:51 +01:00
|
|
|
|
class CreationTime(Time):
|
|
|
|
|
defaultValue_kindName = 'CreationTime'
|
|
|
|
|
|
2003-08-31 22:54:12 +02:00
|
|
|
|
importExport = 'from-server-only'
|
2002-12-02 12:24:51 +01:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
isAutomaticallyModified = 1
|
2003-01-04 19:27:35 +01:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isRequired_kindClass(Time.isRequired_kindClass):
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
label = N_('Creation Time')
|
2003-09-17 13:02:53 +02:00
|
|
|
|
|
2003-09-01 17:36:08 +02:00
|
|
|
|
stateInEditMode = 'read-only'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Creation Time')
|
2003-01-04 19:27:35 +01:00
|
|
|
|
|
2003-09-28 18:24:14 +02:00
|
|
|
|
def accepts(self, kind):
|
|
|
|
|
if isinstance(kind, Time):
|
|
|
|
|
return 1
|
|
|
|
|
return Time.accepts(self, kind)
|
|
|
|
|
|
2003-01-04 19:27:35 +01:00
|
|
|
|
def setAutomaticalValue(self, slot, init = 0):
|
|
|
|
|
if init:
|
|
|
|
|
slot.setValue(time.time())
|
2002-12-02 12:24:51 +01:00
|
|
|
|
register(CreationTime)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ModificationTime(Time):
|
|
|
|
|
defaultValue_kindName = 'ModificationTime'
|
|
|
|
|
|
2003-08-31 22:54:12 +02:00
|
|
|
|
importExport = 'from-server-only'
|
2002-12-02 12:24:51 +01:00
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
isAutomaticallyModified = 1
|
2002-12-24 17:46:09 +01:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
class isRequired_kindClass(Time.isRequired_kindClass):
|
|
|
|
|
importExport = 'private'
|
|
|
|
|
stateInEditMode = 'hidden'
|
|
|
|
|
stateInViewMode = 'hidden'
|
2003-09-17 13:02:53 +02:00
|
|
|
|
|
2003-10-14 23:43:07 +02:00
|
|
|
|
label = N_('Modification Time')
|
2003-09-17 13:02:53 +02:00
|
|
|
|
|
2003-09-01 17:36:08 +02:00
|
|
|
|
stateInEditMode = 'read-only'
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Modification Time')
|
2002-12-24 17:46:09 +01:00
|
|
|
|
|
2003-01-04 19:27:35 +01:00
|
|
|
|
def setAutomaticalValue(self, slot, init = 0):
|
2002-12-24 17:46:09 +01:00
|
|
|
|
slot.setValue(time.time())
|
2002-12-02 12:24:51 +01:00
|
|
|
|
register(ModificationTime)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Token(BaseKind):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String']
|
|
|
|
|
defaultValue_kindName = 'Token'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Text')
|
|
|
|
|
thingPublicName = N_('Token')
|
2003-05-11 21:57:57 +02:00
|
|
|
|
|
2003-10-16 18:31:49 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
if value is None:
|
|
|
|
|
return None
|
|
|
|
|
return value.replace(sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
|
2003-09-29 23:52:48 +02:00
|
|
|
|
def newJail(self, slot):
|
|
|
|
|
return jails.String(slot)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Token)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ApplicationToken(Token):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String', 'Token']
|
|
|
|
|
defaultValue_kindName = 'ApplicationToken'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Application Token')
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(ApplicationToken)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserToken(Token):
|
2003-05-24 15:43:13 +02:00
|
|
|
|
containerNames = ['Any', 'String', 'Token']
|
|
|
|
|
defaultValue_kindName = 'UserToken'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('User Token')
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(UserToken)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TranslationToAdd(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'TranslationToAdd'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
|
|
|
|
thingPublicCategory = None
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(TranslationToAdd)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TranslatorsSets(BaseKind):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'TranslatorsSets'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.DictType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
def convertValueIds(
|
|
|
|
|
self, slot, value, sourceDispatcherId, destinationDispatcherId):
|
|
|
|
|
for translationName, translatorsSet in value.items():
|
|
|
|
|
if translatorsSet:
|
|
|
|
|
for i in range(len(translatorsSet)):
|
|
|
|
|
id = translatorsSet[i]
|
|
|
|
|
newId = id.replace(
|
|
|
|
|
sourceDispatcherId, destinationDispatcherId)
|
|
|
|
|
if newId != id:
|
|
|
|
|
translatorsSet[i] = newId
|
|
|
|
|
return value
|
|
|
|
|
|
2002-11-11 21:56:54 +01:00
|
|
|
|
def removeValueIds(self, slot, value, rolesToKeep):
|
|
|
|
|
for translationName, translatorsSet in value.items():
|
|
|
|
|
if translatorsSet:
|
|
|
|
|
r = range(len(translatorsSet))
|
|
|
|
|
r.reverse()
|
|
|
|
|
for i in r:
|
|
|
|
|
id = translatorsSet[i]
|
|
|
|
|
if not commonTools.extractRole(id) in rolesToKeep:
|
|
|
|
|
del translatorsSet[i]
|
|
|
|
|
if not translatorsSet:
|
|
|
|
|
del value[translationName]
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
return value
|
|
|
|
|
|
2002-10-31 23:24:47 +01:00
|
|
|
|
def repairValue(self, slot, value, toVersion):
|
|
|
|
|
if toVersion == 4000:
|
|
|
|
|
changed = 0
|
|
|
|
|
for translationName, translatorsSet in value.items():
|
|
|
|
|
if translatorsSet:
|
|
|
|
|
for i in range(len(translatorsSet)):
|
|
|
|
|
id = translatorsSet[i]
|
|
|
|
|
newId = repairId(id)
|
|
|
|
|
if newId:
|
|
|
|
|
changed = 1
|
|
|
|
|
translatorsSet[i] = newId
|
|
|
|
|
if changed:
|
|
|
|
|
return value
|
2002-10-19 15:00:35 +02:00
|
|
|
|
return None
|
2004-01-30 18:50:57 +01:00
|
|
|
|
|
|
|
|
|
def upgradeModel_0001_0028(self, slot, model):
|
|
|
|
|
"""Convert user ids from "people" to "identities"."""
|
|
|
|
|
changed = 0
|
|
|
|
|
model = slot.getValue()
|
|
|
|
|
if model:
|
|
|
|
|
changed = 1
|
|
|
|
|
for key in model.keys():
|
|
|
|
|
model[key] = [x.replace('/people', '/identities') \
|
|
|
|
|
for x in model[key]]
|
|
|
|
|
return changed, model
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(TranslatorsSets)
|
|
|
|
|
|
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
class WritersSet(UsersSet):
|
2003-01-06 23:11:07 +01:00
|
|
|
|
balloonHelp = N_(
|
2003-12-27 17:17:56 +01:00
|
|
|
|
'Select one or more [editors->readers-and-editors] or groups of editors '\
|
|
|
|
|
'for this [object->objects] (Editors can modify or delete objects). '\
|
|
|
|
|
'Click on "[Others->buttons-others]" if your choice is not proposed in the '\
|
|
|
|
|
'list. Click on "Add" to add another one. '\
|
|
|
|
|
'Select "None" to remove one.')
|
2003-01-06 23:11:07 +01:00
|
|
|
|
|
2003-08-31 01:13:52 +02:00
|
|
|
|
containerNames = ['Any', 'Sequence', 'UsersSet']
|
2003-05-25 20:46:37 +02:00
|
|
|
|
|
2003-01-05 12:29:18 +01:00
|
|
|
|
defaultValue_kindName = 'WritersSet'
|
|
|
|
|
|
2003-12-27 17:17:56 +01:00
|
|
|
|
label = N_('Editors')
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-12-27 17:17:56 +01:00
|
|
|
|
thingPublicName = N_('Editors')
|
2002-12-02 10:43:46 +01:00
|
|
|
|
register(WritersSet)
|
|
|
|
|
|
|
|
|
|
|
2003-01-07 22:34:31 +01:00
|
|
|
|
class XChoice(Choice):
|
|
|
|
|
defaultValue_kindName = 'XChoice'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Choice')
|
|
|
|
|
thingPublicName = N_('Extended Choice')
|
2003-01-07 22:34:31 +01:00
|
|
|
|
widgetName = 'XSelect'
|
|
|
|
|
register(XChoice)
|
|
|
|
|
|
|
|
|
|
|
2003-11-01 01:20:17 +01:00
|
|
|
|
class Command(BaseKind):
|
|
|
|
|
action = None
|
|
|
|
|
class action_kindClass:
|
|
|
|
|
_kindName = 'PythonIdentifier'
|
|
|
|
|
label = N_('Action')
|
|
|
|
|
|
2003-10-15 13:17:07 +02:00
|
|
|
|
defaultValue_kindName = 'Command'
|
2003-11-01 01:20:17 +01:00
|
|
|
|
|
|
|
|
|
nextModeName = None
|
|
|
|
|
class nextModeName_kindClass:
|
|
|
|
|
_kindName = 'PythonIdentifier'
|
|
|
|
|
label = N_('Next Mode')
|
|
|
|
|
|
|
|
|
|
nextObjectId = None
|
|
|
|
|
class nextObjectId_kindClass:
|
|
|
|
|
_kindName = 'Id'
|
|
|
|
|
label = N_('Next Object')
|
|
|
|
|
|
|
|
|
|
possibleWidgetNames = ['PushButton']
|
|
|
|
|
|
2003-10-15 13:17:07 +02:00
|
|
|
|
thingPublicCategory = N_('Links')
|
2003-11-01 01:20:17 +01:00
|
|
|
|
|
|
|
|
|
thingPublicName = N_('Push Button')
|
|
|
|
|
|
|
|
|
|
widgetName = 'PushButton'
|
|
|
|
|
|
|
|
|
|
def getOrderedLayoutSlotNames(self, parentSlot = None):
|
|
|
|
|
slotNames = BaseKind.getOrderedLayoutSlotNames(
|
|
|
|
|
self, parentSlot = parentSlot)
|
|
|
|
|
slotNames += ['action', 'nextObjectId', 'nextModeName']
|
|
|
|
|
return slotNames
|
2003-10-15 13:17:07 +02:00
|
|
|
|
register(Command)
|
|
|
|
|
|
|
|
|
|
|
2003-03-26 00:24:19 +01:00
|
|
|
|
class Fault(Thing):
|
|
|
|
|
defaultValue_kindName = 'Fault'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Fault')
|
2003-03-26 00:24:19 +01:00
|
|
|
|
valueThingCategory = 'other'
|
|
|
|
|
valueThingName = 'Fault'
|
|
|
|
|
register(Fault)
|
|
|
|
|
|
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## class InputConnector(Thing):
|
|
|
|
|
## defaultInput_kindName = 'InputConnector'
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## thingPublicName = N_('Input Connector')
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## valueThingCategory = 'other'
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## valueThingName = 'InputConnector'
|
|
|
|
|
## register(InputConnector)
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Kind(Thing):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
accessInEditMode = 'pointed'
|
|
|
|
|
accessInViewMode = 'pointed'
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Kind'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Kind')
|
2002-10-19 15:00:35 +02:00
|
|
|
|
valueThingCategory = 'kind'
|
|
|
|
|
valueThingName = 'BaseKind'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if type(value) is types.StringType and value:
|
|
|
|
|
return commonTools.newThing('kind', value)
|
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Kind)
|
|
|
|
|
|
|
|
|
|
|
2002-11-24 18:54:44 +01:00
|
|
|
|
class KindName(Choice):
|
|
|
|
|
defaultValue_kindName = 'KindName'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
pythonStorageType = types.StringType
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Kind Name')
|
2002-11-24 18:54:44 +01:00
|
|
|
|
|
|
|
|
|
## def __init__(self, **attributes):
|
|
|
|
|
## Choice.__init__(self, **attributes)
|
|
|
|
|
## self.values = [
|
2003-05-02 00:37:19 +02:00
|
|
|
|
## kindClass.getThingName.im_func(kindClass)
|
|
|
|
|
## for kindClass in commonTools.getAllThingClasses().values()
|
|
|
|
|
## if kindClass.thingCategory == 'kind']
|
2002-11-24 18:54:44 +01:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
2003-01-07 01:10:31 +01:00
|
|
|
|
categories = []
|
|
|
|
|
groupedValues = {}
|
2003-05-02 00:37:19 +02:00
|
|
|
|
for kindClass in commonTools.getAllThingClasses().values():
|
|
|
|
|
if kindClass.thingCategory != 'kind':
|
|
|
|
|
continue
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if kindClass.thingPublicCategory is None:
|
2003-05-02 00:37:19 +02:00
|
|
|
|
continue
|
2003-09-21 18:50:55 +02:00
|
|
|
|
if not kindClass.thingPublicCategory in categories:
|
|
|
|
|
categories.append(kindClass.thingPublicCategory)
|
|
|
|
|
groupedValues[kindClass.thingPublicCategory] = []
|
|
|
|
|
groupedValues[kindClass.thingPublicCategory].append(
|
2003-05-02 00:37:19 +02:00
|
|
|
|
kindClass.getThingName.im_func(kindClass))
|
2003-09-19 19:48:29 +02:00
|
|
|
|
for values in groupedValues.values():
|
|
|
|
|
values.sort(lambda x, y:
|
|
|
|
|
locale.strcoll(_(labels[x]), _(labels[y])))
|
2004-02-12 15:38:22 +01:00
|
|
|
|
return groupedValues
|
|
|
|
|
|
|
|
|
|
def getGroupLabels(self, slot):
|
|
|
|
|
categories = self.getGroupedValues(slot).keys()
|
|
|
|
|
groupLabels = {}
|
|
|
|
|
for cat in categories:
|
|
|
|
|
groupLabels[_(cat)] = cat
|
|
|
|
|
return categories
|
2003-01-07 01:10:31 +01:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
2002-11-24 18:54:44 +01:00
|
|
|
|
return [
|
2003-05-02 00:37:19 +02:00
|
|
|
|
kindClass.getThingName.im_func(kindClass)
|
|
|
|
|
for kindClass in commonTools.getAllThingClasses().values()
|
|
|
|
|
if kindClass.thingCategory == 'kind' \
|
2003-09-21 18:50:55 +02:00
|
|
|
|
and kindClass.thingPublicCategory is not None]
|
2002-11-24 18:54:44 +01:00
|
|
|
|
register(KindName)
|
|
|
|
|
|
|
|
|
|
|
2003-10-08 01:42:15 +02:00
|
|
|
|
class Mode(Thing):
|
|
|
|
|
accessInEditMode = 'pointed'
|
|
|
|
|
accessInViewMode = 'pointed'
|
|
|
|
|
defaultValue_kindName = 'Mode'
|
2003-10-14 23:43:07 +02:00
|
|
|
|
isRequired = 1 # Important for submitField2.
|
2003-10-08 01:42:15 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Mode')
|
|
|
|
|
valueThingCategory = 'mode'
|
|
|
|
|
valueThingName = 'ModeAbstract'
|
|
|
|
|
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if not value:
|
|
|
|
|
return None
|
|
|
|
|
if type(value) is types.StringType:
|
|
|
|
|
return commonTools.newThing('mode', value)
|
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
|
|
|
|
|
|
|
|
|
def convertValueToOtherType(self, value, otherType):
|
|
|
|
|
if otherType is types.StringType and value:
|
|
|
|
|
return value.getThingName()
|
|
|
|
|
return BaseKind.convertValueToOtherType(self, value, otherType)
|
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getGroupedValues(self, slot):
|
2004-02-12 15:38:22 +01:00
|
|
|
|
return None
|
2003-10-08 01:42:15 +02:00
|
|
|
|
register(Mode)
|
|
|
|
|
|
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## class OutputConnector(Thing):
|
|
|
|
|
## defaultOutput_kindName = 'OutputConnector'
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## thingPublicName = N_('Output Connector')
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## valueThingCategory = 'other'
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
2003-10-15 00:41:57 +02:00
|
|
|
|
## valueThingName = 'OutputConnector'
|
|
|
|
|
## register(OutputConnector)
|
2003-03-04 01:25:24 +01:00
|
|
|
|
|
|
|
|
|
|
2002-12-01 18:40:23 +01:00
|
|
|
|
class Upload(Thing):
|
|
|
|
|
defaultValue_kindName = 'Upload'
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = N_('Data')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('File')
|
2002-12-01 18:40:23 +01:00
|
|
|
|
valueThingCategory = 'other'
|
|
|
|
|
valueThingName = 'Upload'
|
2004-02-14 10:31:51 +01:00
|
|
|
|
|
|
|
|
|
widgetName = 'UploadFile'
|
2002-12-01 18:40:23 +01:00
|
|
|
|
register(Upload)
|
|
|
|
|
|
|
|
|
|
|
2003-03-04 01:25:24 +01:00
|
|
|
|
class ValueHolder(Thing):
|
|
|
|
|
defaultValue_kindName = 'ValueHolder'
|
2003-09-22 01:26:12 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicName = N_('Value Holder')
|
2003-03-04 01:25:24 +01:00
|
|
|
|
valueThingCategory = 'other'
|
|
|
|
|
valueThingName = 'ValueHolder'
|
|
|
|
|
register(ValueHolder)
|
|
|
|
|
|
|
|
|
|
|
2002-10-19 15:00:35 +02:00
|
|
|
|
class Widget(Thing):
|
2003-09-21 18:50:55 +02:00
|
|
|
|
accessInEditMode = 'pointed'
|
|
|
|
|
accessInViewMode = 'pointed'
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'Widget'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Widget')
|
2002-10-19 15:00:35 +02:00
|
|
|
|
valueThingCategory = 'widget'
|
|
|
|
|
valueThingName = 'BaseWidget'
|
- Réorg des web, edit, submit et tout. Plusieurs fois, et chaque fois un peu
plus loin. A priori, sans trop tester (mais c'est la première fois que
j'allais aussi loin dans les cards), ça fonctionne. Il y a encore quelques
questions mais on verra ça à Paris. (il y a eu un conflit au niveau des
Cards, je ne vérifie pas si ça fonctionen toujours, je n'ai pas vraiment le
temps...) (normalement, oui)
- Ajout d'un LdapPeopleWeb pour aller chercher les personnes dans un annuaire
LDAP. Ça va de pair avec l'authentification LDAP et ça marche.
- Ajout d'un groupe "Logged Users" dont la possibilité a été découverte par
hasard. (le groupe "General Public" m'acceptait quand je n'étais pas loggé
et me refusait quand j'étais loggé via LDAP, avec un userId != people)
- Ajout du support pour commentaires à un article, ça fonctionne mais c'est un
peu caché pour le moment.
- ...
2003-10-26 10:18:03 +01:00
|
|
|
|
|
|
|
|
|
def convertValueFromOtherType(self, value):
|
|
|
|
|
if type(value) is types.StringType and value:
|
|
|
|
|
return commonTools.newThing('widget', value)
|
|
|
|
|
return BaseKind.convertValueFromOtherType(self, value)
|
2002-10-19 15:00:35 +02:00
|
|
|
|
register(Widget)
|
2002-11-20 16:18:03 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WidgetName(Choice):
|
2002-11-24 09:06:20 +01:00
|
|
|
|
defaultValue_kindName = 'WidgetName'
|
2003-09-21 18:50:55 +02:00
|
|
|
|
thingPublicCategory = None # N_('Glasnost')
|
|
|
|
|
thingPublicName = N_('Widget Name')
|
2002-12-29 19:09:10 +01:00
|
|
|
|
|
2003-11-20 13:59:16 +01:00
|
|
|
|
def getValues(self, slot):
|
|
|
|
|
values = Choice.getValues(self, slot)
|
2003-02-06 23:13:30 +01:00
|
|
|
|
if values:
|
|
|
|
|
return values
|
|
|
|
|
else:
|
2002-12-29 19:09:10 +01:00
|
|
|
|
return ['InputText']
|
2002-11-20 16:18:03 +01:00
|
|
|
|
register(WidgetName)
|
2003-03-21 20:19:12 +01:00
|
|
|
|
|