[ckan-changes] commit/ckan: 3 new changesets
Bitbucket
commits-noreply at bitbucket.org
Fri Oct 14 12:51:25 UTC 2011
3 new changesets in ckan:
http://bitbucket.org/okfn/ckan/changeset/50948e0ce3c0/
changeset: 50948e0ce3c0
branch: release-v1.5
user: dread
date: 2011-10-14 14:25:14
summary: [controllers,logic,templates]: #1386 transplant of branch feature-1386-no-account-creation-via-openid (up to 1605cb0763a0).
affected #: 9 files (-1 bytes)
--- a/ckan/controllers/user.py Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/controllers/user.py Fri Oct 14 13:25:14 2011 +0100
@@ -222,8 +222,8 @@
context['message'] = data_dict.get('log_message', '')
data_dict['id'] = id
user = get_action('user_update')(context, data_dict)
-
- h.redirect_to(controller='user', action='read', id=user['id'])
+ h.flash_success(_('Profile updated'))
+ h.redirect_to(controller='user', action='read', id=user['name'])
except NotAuthorized:
abort(401, _('Unauthorized to edit user %s') % id)
except NotFound, e:
--- a/ckan/lib/authenticator.py Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/lib/authenticator.py Fri Oct 14 13:25:14 2011 +0100
@@ -11,20 +11,9 @@
openid = identity.get('repoze.who.plugins.openid.userid')
user = User.by_openid(openid)
if user is None:
- # TODO: Implement a mask to ask for an alternative user
- # name instead of just using the OpenID identifier.
- name = identity.get('repoze.who.plugins.openid.nickname')
- if not User.check_name_valid(name):
- name = openid
- if not User.check_name_available(name):
- name = openid
- user = User(openid=openid, name=name,
- fullname=identity.get('repoze.who.plugins.openid.fullname'),
- email=identity.get('repoze.who.plugins.openid.email'))
- Session.add(user)
- Session.commit()
- Session.remove()
- return user.name
+ return None
+ else:
+ return user.name
return None
--- a/ckan/logic/schema.py Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/logic/schema.py Fri Oct 14 13:25:14 2011 +0100
@@ -213,10 +213,10 @@
'name': [not_empty, unicode, user_name_validator],
'fullname': [ignore_missing, unicode],
'password': [user_password_validator, user_password_not_empty, ignore_missing, unicode],
- 'email': [ignore_missing, unicode],
+ 'email': [not_empty, unicode],
'about': [ignore_missing, user_about_validator, unicode],
'created': [ignore],
- 'openid': [ignore],
+ 'openid': [ignore_missing],
'apikey': [ignore],
'reset_key': [ignore],
}
--- a/ckan/templates/user/edit_user_form.html Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/templates/user/edit_user_form.html Fri Oct 14 13:25:14 2011 +0100
@@ -12,13 +12,15 @@
</ul></div><fieldset>
- <legend>Base details</legend><dl><dt><label for="fullname">Full name:</label></dt><dd><input type="text" name="fullname" value="${data.get('fullname','')}" /></dd><dt><label for="email">E-Mail:</label></dt><dd><input type="text" name="email" value="${data.get('email','')}" /></dd>
+
+ <dt><label for="openid">OpenID:</label></dt>
+ <dd><input type="text" name="openid" value="${data.get('openid','')}" /></dd><dt><label for="about">About:</label></dt><dd class="description-field">
@@ -43,6 +45,13 @@
<dd><input type="password" name="password2" value="" /></dd></dl></fieldset>
+ <fieldset>
+ <legend>Change your username</legend>
+ <dl>
+ <dt><label for="name">Username:</label></dt>
+ <dd><input type="text" name="name" value="${data.get('name','')}" /></dd>
+ </dl>
+ </fieldset><div class="form-submit"><input id="save" class="pretty-button primary" name="save" type="submit" value="${_('Save Changes')}" /><input id="cancel" class="pretty-button href-action" name="cancel" type="reset" value="${_('Cancel')}" action="${h.url_for(controller='user', action='read')}" />
--- a/ckan/templates/user/login.html Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/templates/user/login.html Fri Oct 14 13:25:14 2011 +0100
@@ -16,20 +16,6 @@
</script></py:def>
- <py:match path="primarysidebar">
- <li class="widget-container boxed widget_text">
- <h2>Not a member?</h2>
- <p>
- Join CKAN to contribute datasets under your own name.
- </p>
- <ul>
- <li>${h.link_to(_('Register'), h.url_for(action='register'))}</li>
- <li>${h.link_to(_('Reset your password'), h.url_for(action='request_reset'))}</li>
- <li>${h.link_to(_('Privacy Policy'), 'http://www.okfn.org/privacy-policy/')}</li>
- </ul>
- </li>
- </py:match>
-
<py:def function="page_title">Login - User</py:def><py:def function="page_heading">Login to ${g.site_title}</py:def>
@@ -50,6 +36,8 @@
</fieldset>
${h.submit('s', _('Login'))} —
<a href="${h.url_for('reset')}">Forgot your password?</a>
+ —
+ ${h.link_to(_('Not yet registered?'), h.url_for(action='register'))}
</form><br/><!-- Simple OpenID Selector -->
--- a/ckan/templates/user/new.html Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/templates/user/new.html Fri Oct 14 13:25:14 2011 +0100
@@ -2,22 +2,8 @@
xmlns:xi="http://www.w3.org/2001/XInclude"
py:strip="">
- <py:match path="primarysidebar">
- <li class="widget-container widget_text">
- <h3>Have an OpenID?</h3>
- <p>
- If you have an account with Google, Yahoo or one of many other
- OpenID providers, you can log in without signing up.
- </p>
- <ul>
- <li>${h.link_to(_('Log in now'), h.url_for(action='login'))}</li>
- </ul>
- </li>
- </py:match>
-
<py:def function="page_title">Register - User</py:def>
- <py:def function="page_heading">Join the community</py:def>
-
+ <py:def function="page_heading">Register for a new Account</py:def><div py:match="content">
${Markup(c.form)}
--- a/ckan/templates/user/new_user_form.html Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/templates/user/new_user_form.html Fri Oct 14 13:25:14 2011 +0100
@@ -12,8 +12,6 @@
</ul></div>
-<fieldset>
- <legend i18n:msg="site_title">Register with CKAN</legend><dl><dt><label class="field_opt" for="name">Login:</label></dt><dd><input type="text" name="name" value="${data.get('name','')}" /></dd>
@@ -24,7 +22,7 @@
<dd><input type="text" name="fullname" value="${data.get('fullname','')}" /></dd><dd class="field_error" py:if="errors.get('fullname', '')">${errors.get('fullname', '')}</dd>
- <dt><label class="field_opt" for="email">E-Mail (optional):</label></dt>
+ <dt><label class="field_opt" for="email">E-Mail</label></dt><dd><input type="text" name="email" value="${data.get('email','')}" /></dd><dt><label class="field_opt" for="password1">Password:</label></dt>
@@ -47,8 +45,5 @@
</dd></dl>
-</fieldset>
-
- <br />
- <input id="save" name="save" type="submit" value="Save" />
+ <input id="save" name="save" type="submit" value="Register now »" /></form>
--- a/ckan/templates/user/request_reset.html Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/templates/user/request_reset.html Fri Oct 14 13:25:14 2011 +0100
@@ -4,22 +4,15 @@
py:strip=""><py:def function="page_title">Reset password</py:def>
+ <py:def function="page_heading">Request a password reset</py:def><div py:match="content">
- <h2>
- Request a password reset
- </h2>
-
<form id="user-password-reset" action="" method="post" class="simple-form"
- xmlns:py="http://genshi.edgewall.org/"
- xmlns:xi="http://www.w3.org/2001/XInclude"
><fieldset>
- <legend>Reset password</legend><label for="user">User name:</label><input name="user" value="" /><br/></fieldset>
-
<div>
${h.submit('reset', _('Reset password'))}
</div>
--- a/ckan/tests/functional/test_user.py Thu Oct 13 17:56:04 2011 +0100
+++ b/ckan/tests/functional/test_user.py Fri Oct 14 13:25:14 2011 +0100
@@ -262,6 +262,7 @@
username = 'testcreate'
fullname = u'Test Create'
password = u'testpassword'
+ email = u'test at test.org'
assert not model.User.by_name(unicode(username))
rev_id_before_test = model.repo.youngest_revision().id
@@ -272,6 +273,7 @@
fv = res.forms['user-edit']
fv['name'] = username
fv['fullname'] = fullname
+ fv['email'] = email
fv['password1'] = password
fv['password2'] = password
res = fv.submit('save')
@@ -294,6 +296,7 @@
assert user
assert_equal(user.name, username)
assert_equal(user.fullname, fullname)
+ assert_equal(user.email, email)
assert user.password
# no revision should be created - User is not revisioned
@@ -314,6 +317,7 @@
username = u'testcreate4'
fullname = u'Test Create\xc2\xa0'
password = u'testpassword\xc2\xa0'
+ email = u'me at test.org'
assert not model.User.by_name(username)
offset = url_for(controller='user', action='register')
@@ -323,6 +327,7 @@
fv = res.forms['user-edit']
fv['name'] = username
fv['fullname'] = fullname.encode('utf8')
+ fv['email'] = email
fv['password1'] = password.encode('utf8')
fv['password2'] = password.encode('utf8')
res = fv.submit('save')
@@ -465,7 +470,8 @@
user = model.User.by_name(unicode(username))
if not user:
model.Session.add(model.User(name=unicode(username), about=about,
- password='letmein'))
+ email=u'me at test.org',
+ password='letmein'))
model.repo.commit_and_remove()
user = model.User.by_name(unicode(username))
rev_id_before_test = model.repo.youngest_revision().id
@@ -473,6 +479,7 @@
# edit
new_about = u'Changed about'
new_password = u'testpass'
+ new_openid = u'http://mynewopenid.com/'
offset = url_for(controller='user', action='edit', id=user.id)
res = self.app.get(offset, status=200, extra_environ={'REMOTE_USER':username})
main_res = self.main_div(res)
@@ -480,6 +487,7 @@
assert about in main_res, main_res
fv = res.forms['user-edit']
fv['about'] = new_about
+ fv['openid'] = new_openid
fv['password1'] = new_password
fv['password2'] = new_password
@@ -491,6 +499,9 @@
assert 'testedit' in main_res, main_res
assert new_about in main_res, main_res
+ updated_user = model.User.by_name(unicode(username))
+ assert_equal(updated_user.openid, new_openid)
+
# read, not logged in
offset = url_for(controller='user', action='read', id=user.id)
res = self.app.get(offset, status=200)
@@ -508,7 +519,8 @@
user = model.User.by_name(unicode(username))
if not user:
model.Session.add(model.User(name=unicode(username), about=about,
- password='letmein'))
+ email=u'me at test.org',
+ password='letmein'))
model.repo.commit_and_remove()
user = model.User.by_name(unicode(username))
http://bitbucket.org/okfn/ckan/changeset/ceb0b2b6f519/
changeset: ceb0b2b6f519
branch: release-v1.5
user: dread
date: 2011-10-14 14:25:55
summary: [tests]: #1386 transplant of cset:8afbf99512c8.
affected #: 1 file (-1 bytes)
--- a/ckan/tests/functional/api/test_action.py Fri Oct 14 13:25:14 2011 +0100
+++ b/ckan/tests/functional/api/test_action.py Fri Oct 14 13:25:55 2011 +0100
@@ -256,6 +256,7 @@
def test_09_user_create(self):
user_dict = {'name':'test_create_from_action_api',
'about': 'Just a test user',
+ 'email': 'me at test.org',
'password':'testpass'}
postparams = '%s=1' % json.dumps(user_dict)
@@ -286,6 +287,7 @@
'error': {
'__type': 'Validation Error',
'name': ['Missing value'],
+ 'email': ['Missing value'],
'password': ['Missing value']
},
'help': 'Creates a new user',
@@ -294,6 +296,7 @@
def test_11_user_create_wrong_password(self):
user_dict = {'name':'test_create_from_action_api_2',
+ 'email':'me at test.org',
'password':'tes'} #Too short
postparams = '%s=1' % json.dumps(user_dict)
@@ -314,10 +317,12 @@
def test_12_user_update(self):
normal_user_dict = {'id': self.normal_user.id,
'fullname': 'Updated normal user full name',
+ 'email': 'me at test.org',
'about':'Updated normal user about'}
sysadmin_user_dict = {'id': self.sysadmin_user.id,
'fullname': 'Updated sysadmin user full name',
+ 'email': 'me at test.org',
'about':'Updated sysadmin user about'}
#Normal users can update themselves
http://bitbucket.org/okfn/ckan/changeset/577a88d032ff/
changeset: 577a88d032ff
branch: release-v1.5
user: dread
date: 2011-10-14 14:51:14
summary: [i18n]: Updated the latest strings from Transifex.
affected #: 2 files (-1 bytes)
Binary file ckan/i18n/fr/LC_MESSAGES/ckan.mo has changed
--- a/ckan/i18n/fr/LC_MESSAGES/ckan.po Fri Oct 14 13:25:55 2011 +0100
+++ b/ckan/i18n/fr/LC_MESSAGES/ckan.po Fri Oct 14 13:51:14 2011 +0100
@@ -11,7 +11,7 @@
"Project-Id-Version: CKAN (Comprehensive Knowledge Archive Network)\n"
"Report-Msgid-Bugs-To: http://www.ckan.org/\n"
"POT-Creation-Date: 2011-10-12 15:40+0100\n"
-"PO-Revision-Date: 2011-10-12 21:09+0000\n"
+"PO-Revision-Date: 2011-10-14 08:03+0000\n"
"Last-Translator: keronos <aka.keronos at gmail.com>\n"
"Language-Team: French (http://www.transifex.net/projects/p/ckan/team/fr/)\n"
"MIME-Version: 1.0\n"
@@ -270,9 +270,8 @@
"<span class=\"new-dataset\">Congratulations, your dataset has been created. "
"<a href=\"%s\">Upload or link some data now »</a></span>"
msgstr ""
-"<span class=\"new-dataset\">Félicitations, votre jeu de données a été créé. "
-"<a href=\"%s\">Vous pouvez transférer ou lier des données maintenant "
-"»</a></span>"
+"Félicitations, votre jeu de données a été créé. <a href=\"%s\">Vous pouvez "
+"transférer ou lier des données maintenant"
#: ckan/controllers/revision.py:42
msgid "CKAN Repository Revision History"
@@ -598,20 +597,19 @@
" file format in which the data is supplied. <br /><b>Description</b> Any "
"information you want to add to describe the resource.<br />"
msgstr ""
-"<br />Vous pouvez répéter ce champ autant de fois que nécessaire. Par "
-"exemple, si les données sont disponibles dans plusieurs formats, ou "
-"réparties en périodes ou zones géographiques différentes, chaque fichier est"
-" une \"ressource\" différente qui doit être décrite différemment. Elles "
-"apparaîtront ensemble sur la page du jeu de données dans CKAN.<br /><br /> "
-"<b>URL:</b> saisissez le lien qui manèe directement à la donnée - en "
-"sélectionnant ce lien dans un navigateur Internet, l'utilisateur "
-"téléchargera directement le jeu de donnée intégralement. Notez que les jeux "
-"de données ne sont pas hébergés sur ce site, mais par l'éditeur de la "
-"donnée. Alternativement, l'URL peut pointer vers un serveur d'API tel qu'un "
-"point d'accès SPARQL ou un service JSON-P.<br /><b>Format:</b> saisissez "
-"ici le format dans lequel le jeu de données est mis à disposition. <br "
-"/><b>Description:</b> saisissez ici toute information utile que vous "
-"souhaiteriez ajouter à la description de la ressource à télécharger.<br />"
+"Vous pouvez répéter ce champ autant de fois que nécessaire. Par exemple, si "
+"les données sont disponibles dans plusieurs formats, ou réparties en "
+"périodes ou zones géographiques différentes, chaque fichier est une "
+"\"ressource\" différente qui doit être décrite différemment. Elles "
+"apparaîtront ensemble sur la page du jeu de données dans CKAN.URL: saisissez"
+" le lien qui manèe directement à la donnée - en sélectionnant ce lien dans "
+"un navigateur Internet, l'utilisateur téléchargera directement le jeu de "
+"donnée intégralement. Notez que les jeux de données ne sont pas hébergés sur"
+" ce site, mais par l'éditeur de la donnée. Alternativement, l'URL peut "
+"pointer vers un serveur d'API tel qu'un point d'accès SPARQL ou un service "
+"JSON-P.Format: saisissez ici le format dans lequel le jeu de données est mis"
+" à disposition. Description: saisissez ici toute information utile que vous "
+"souhaiteriez ajouter à la description de la ressource à télécharger."
#: ckan/forms/package.py:76
msgid ""
@@ -1580,7 +1578,7 @@
" [1:authorization group] can be set-up and users can be added to it."
msgstr ""
"Au lieu de définir les droits d'utilisateurs particuliers sur un jeu de données ou un groupe,\n"
-" Vous pouvez également définir un ensemble d'utilisateurs qui partageront les mêmes droits. POur achever cela, un \n"
+" Vous pouvez également définir un ensemble d'utilisateurs qui partageront les mêmes droits. Pour achever cela, un \n"
" [1:groupe d'autorisation] peut être créé et des utilisateurs peuvent lui être ajoutés."
#: ckan/templates/authorization_group/layout.html:28
@@ -1796,7 +1794,7 @@
"CKAN is the Comprehensive Knowledge Archive Network, a [1:registry] of [2:open knowledge] datasets and projects\n"
" (and a few closed ones)."
msgstr ""
-"CKAN est le Réseau d'Archives de la Connaissance Compréhensible, un [1:registry] de jeux de données et de projets [2:open knowledge] \n"
+"CKAN est le Réseau d'Archives de la Connaissance Compréhensible, un [1:catalogue] de jeux de données et de projets de [2:connaissances ouvertes] \n"
" (et de quelque uns fermés)."
#: ckan/templates/home/about.html:15
@@ -1805,8 +1803,8 @@
" content and data], especially in ways that are machine\n"
" automatable."
msgstr ""
-"CKAN facilite la [1:find, share and reuse open\n"
-" content and data], en offrant notamment des accès programmatiques."
+"CKAN facilite la [1:trouver, partager et réutiliser des données et du "
+"contenu ouverts], en offrant notamment des accès programmatiques."
#: ckan/templates/home/about.html:20
msgid ""
@@ -1824,8 +1822,8 @@
"\t\tcontent resources. However it adds to a simple registry in key ways."
msgstr ""
"Comme l'indique ce diagramme, CKAN combine les fonctionnalités d'un listing/catalogue,\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>un index de jeux de données et un wiki. En tant que catalogue il se comporte comme [1:freshmeat] mais pour ce qui concerne les données ouvertes et les\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>ressources de contenu. Cependant, il ajoute aux fonctionnalités d'un simple catalogue de plusieurs manières."
+"»» un index de jeux de données et un wiki. En tant que catalogue il se comporte comme [1:freshmeat] mais pour ce qui concerne les données ouvertes et les\n"
+"»» ressources de contenu. Cependant, il ajoute aux fonctionnalités d'un simple catalogue de plusieurs manières."
#: ckan/templates/home/about.html:29
msgid ""
@@ -1837,13 +1835,13 @@
"\t\tagain for [4:open data and content]\n"
"\t\tnot code."
msgstr ""
-"Premièrement, grâce à son socle [1:versioned domain model] CKAN bénéficie d'une\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>interface de type wiki qui permet à chacun d'ajouter et de compléter le contenu disponible. Ensuite,\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>contrairement à un wiki, CKAN peut stocker de l'information \"structurée\", qui lui permet de\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>fournir des fonctionnalités de type \"index\"comme le référencement automatique, la découverte\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>et l'installation de matériaux. De ce point de vue, il se comporte comme [2:CPAN] ou [3:PyPI] dans le monde du logiciel -- mais\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>pour [4:open data and content]\n"
-"<span class=\"whitespace other\" title=\"Tab\">»</span><span class=\"whitespace other\" title=\"Tab\">»</span>et pas le code."
+"Premièrement, grâce à son socle [1:modèle de version de domaine] CKAN bénéficie d'une\n"
+"»» interface de type wiki qui permet à chacun d'ajouter et de compléter le contenu disponible. Ensuite,\n"
+"»» contrairement à un wiki, CKAN peut stocker de l'information \"structurée\", qui lui permet de\n"
+"»» fournir des fonctionnalités de type \"index\"comme le référencement automatique, la découverte\n"
+"»» et l'installation de matériaux. De ce point de vue, il se comporte comme [2:CPAN] ou [3:PyPI] dans le monde du logiciel -- mais\n"
+"»» pour [4:les données et le contenu ouverts]\n"
+"»» et pas le code."
#: ckan/templates/home/about.html:40
msgid ""
@@ -1851,8 +1849,8 @@
" be found in [1:these\n"
" slides]."
msgstr ""
-"Plus d'information à propos de CKAN, et l'historique de sa création peut être trouvée dans [1:these\n"
-" slides]."
+"Plus d'information à propos de CKAN, et l'historique de sa création peut "
+"être trouvée dans [1:ces diapositives]."
#: ckan/templates/home/index.html:6
msgid "Welcome"
@@ -1994,8 +1992,8 @@
"editing this page if you are [4:not] happy to do this."
msgstr ""
"[1:Important:] En soumettant du contenu, vous acceptez de publier vos "
-"contributions sous [2:Open Database License]. Merci de vous [3:refrain] de "
-"modifier cette page si vous n'êtes [4:not] d'accord."
+"contributions sous [2:Licence Base de données Ouvertes]. Merci de vous "
+"[3:restreindre] de modifier cette page si vous n'êtes [4:pas] d'accord."
#: ckan/templates/package/history.html:7
msgid "History:"
@@ -2108,7 +2106,7 @@
" [1:Click here to sign in] before saving (opens in new window)."
msgstr ""
"Comme vous ne vous êtes pas identifié, seule votre adresse IP apparaîtra.\n"
-" [1:Click here to sign in] avant de sauvegarder (ouvre une nouvelle fenêtre)."
+" [1:Cliquez ici pour vous connecter] avant de sauvegarder (ouvre une nouvelle fenêtre)."
#: ckan/templates/package/read.html:14
msgid "- Datasets"
@@ -2278,7 +2276,7 @@
"[1:There was an error while searching.] \n"
" Please try again."
msgstr ""
-"[1:There was an error while searching.] \n"
+"[1:Une erreur est survenue pendant la recherche.] \n"
" Merci d'essayer à nouveau."
#: ckan/templates/package/search.html:55
@@ -2288,7 +2286,7 @@
#: ckan/templates/package/search.html:58
msgid "Would you like to [1:create a new dataset?]"
-msgstr "Voulez-vous créer un [1:create a new dataset?]"
+msgstr "Voulez-vous [1:créer un nouveau jeu de données?]"
#: ckan/templates/package/search_form.html:9
msgid "Search..."
@@ -2524,9 +2522,11 @@
" OpenID enabled account]. Probably the simplest way is sign up with a\n"
" free OpenID provider such as [3:https://www.myopenid.com/]."
msgstr ""
-"OpenID est un service qui permet de s'identifier avec une identité unique dans des sites web différents. Apprenez en [1:more\n"
-" about OpenID] et [2:how to get an\n"
-" OpenID enabled account]. Le moyen le plus simple est probablement de vous inscrire avec un fournisseur d'OpenID gratuit comme [3:https://www.myopenid.com/]."
+"OpenID est un service qui permet de s'identifier avec une identité unique "
+"dans des sites web différents. Apprenez en [1:plus sur l'OpenID] et "
+"[2:comment obtenir un compte openID fonctionnel]. Le moyen le plus simple "
+"est probablement de vous inscrire avec un fournisseur d'OpenID gratuit comme"
+" [3:https://www.myopenid.com/]."
#: ckan/templates/user/logout.html:5
msgid "Logout - User"
Repository URL: https://bitbucket.org/okfn/ckan/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
More information about the ckan-changes
mailing list