Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature python3 #81

Open
wants to merge 118 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
55c5c0a
Gevent: Update to version 1.5, & fix API
staverne Apr 11, 2020
19144c4
(#MOBI-3309) Integrate Beaker middleware with WSGI application
M3te0r May 20, 2020
6f79fa4
(#MOBI-3309) fix requirements.txt
M3te0r May 20, 2020
6e6aff9
(#MOBI-3309) support tests implementation, no session
M3te0r May 22, 2020
667ce1d
(#MOBI-3309) refix
M3te0r May 22, 2020
81105d9
(#MOBI-3309) do not use cookie on APIs
M3te0r May 22, 2020
58a30cc
(#MOBI-3309) avoid TB
M3te0r May 22, 2020
ef919ad
(#MOBI-3309) allow to pass headers to do_request
M3te0r May 22, 2020
2db595a
(#MOBI-3309) save on login
M3te0r May 22, 2020
6b31938
(#MOBI-3309) do not save...
M3te0r May 22, 2020
745315e
(#MOBI-3309) register key in server.py init because tests do not laun…
M3te0r May 22, 2020
1e974ee
(#MOBI-3309) fix typo
M3te0r May 22, 2020
4a9c848
session timeout/expire
M3te0r May 22, 2020
f73cf97
httponly and samesite strict
M3te0r May 22, 2020
9b584bf
(#MOBI-3309) jwt exceptions
M3te0r May 25, 2020
aa4a5c0
(#MOBI-3309) fix cookie, log exception
M3te0r May 25, 2020
3cd49a8
(#MOBI-3309) treat basic like bearer
M3te0r May 25, 2020
304d5c6
(#MOBI-3309) treat basic like bearer
M3te0r May 25, 2020
5d96bce
(#MOBI-3309) treat basic like bearer
M3te0r May 25, 2020
b5e155d
(#MOBI-3309) fix cookie
M3te0r May 25, 2020
7e220eb
(#MOBI-3309) remove email from JWT
M3te0r May 25, 2020
98f7e6f
(#MOBI-3309) fix lazy exception...
M3te0r May 27, 2020
71faf9b
Merge pull request #1 from bepatient-fr/mobi_3309_hotfix_session_system
M3te0r Jun 2, 2020
1a0e4b3
(#MOBI-4041) Allow cookie custom domain
M3te0r Aug 7, 2020
e4b8cf3
(#MOBI-4041) Allow cookie custom samesite
M3te0r Aug 7, 2020
7cc61d8
Merge pull request #3 from bepatient-fr/mobi_4041_allow_custom_cookie…
M3te0r Aug 7, 2020
24538fc
Fix TB on Reference
M3te0r Aug 10, 2020
2a4377d
add placeholder to default widget
M3te0r Sep 4, 2020
3deac90
(#MOBI-4189) Fix session samesite lax for fitbit oauth2
M3te0r Sep 11, 2020
88406ca
Merge pull request #4 from bepatient-fr/mobi_4189_fix_session_samesit…
M3te0r Sep 11, 2020
15c688f
(#MOBI-4403) Revamp ikaaro debug error page and logs
M3te0r Oct 13, 2020
8dd864e
(#MOBI-4403) more error to debug on resource links
M3te0r Oct 14, 2020
29ae48a
(#MOBI-4403) update obsolete syntax
M3te0r Oct 14, 2020
1454475
(#MOBI-4403) update requirements.txt
M3te0r Oct 14, 2020
ce2a879
(#MOBI-4403) update requirements.txt
M3te0r Oct 14, 2020
c1fcb1e
(#MOBI-4403) remove tb from default template
M3te0r Oct 14, 2020
b3c26b2
(#MOBI-4403) fix last is_prototype MSG, updates logs
M3te0r Oct 19, 2020
4057319
(#MOBI-4403) session_key customiszation
M3te0r Nov 19, 2020
28d0769
Merge pull request #6 from bepatient-fr/mobi_4403_ikaaro_revamp_error…
M3te0r Nov 19, 2020
4d783e5
(#MOBI-4403) correct ip format request
M3te0r Nov 19, 2020
08961f6
(#MOBI-4403) remove set_cookie header from log
M3te0r Nov 19, 2020
dc68476
Merge pull request #7 from bepatient-fr/fix_usr
M3te0r Nov 19, 2020
461cf82
(#MOBI-4403) fix duration cast
M3te0r Nov 19, 2020
b45d529
Merge pull request #8 from bepatient-fr/fix_duration_cast
M3te0r Nov 19, 2020
b61f799
(#MOBI-4403) fix usr id api
M3te0r Nov 20, 2020
d2cff25
Merge pull request #9 from bepatient-fr/fix_usr_id_api
M3te0r Nov 20, 2020
8b980f2
(#MOBI-4403) fix usr id api 2
M3te0r Nov 20, 2020
03f4adb
(#MOBI-5006) Use SESSION_KEY constant to name the cookie
M3te0r Jan 22, 2021
8a728a7
(#MOBI-5220) use language in multilingual default text field
M3te0r Mar 10, 2021
df7d3bf
Configurable session_secure
M3te0r Mar 31, 2021
fc59276
(#MOBI-5212) Resources metadat json export
M3te0r Mar 19, 2021
0e736e4
(#MOBI-5212&5213) Resources import + fixes export
M3te0r Mar 23, 2021
bc56523
(#MOBI-5212&5213) dry_run mode for _get_form, cleaning, cls child exc…
M3te0r Mar 24, 2021
a7c07b1
(#MOBI-5212&5213) action_goto
M3te0r Mar 24, 2021
0fb9f75
(#MOBI-5212&5213) export rte html support
M3te0r Mar 25, 2021
9806c69
(#MOBI-5212) fix check field names, remove index
M3te0r May 3, 2021
0802349
Merge pull request #10 from bepatient-fr/mobi_5212_resources_metadat_…
M3te0r May 7, 2021
27d3954
(#MOBI-5600) Fix False boolean import
M3te0r May 10, 2021
3eb3cf9
(#MOBI-5609) Fix non str datatype import
M3te0r May 10, 2021
e9e3f16
(#MOBI-5615) Dry run update_metadata
M3te0r May 12, 2021
5352726
(#MOBI-5687) Fix import _get_form errors
M3te0r Jun 1, 2021
358ae9d
mobi ikaaro perf
M3te0r Aug 12, 2021
b4e9ae1
Activate RO concurrence
M3te0r Aug 18, 2021
abd5d4b
gevent patch in main, GET writable paths returned by root
M3te0r Aug 18, 2021
3300549
Merge pull request #13 from bepatient-fr/mobi_ikaaro_perf
M3te0r Aug 19, 2021
3520d49
Merge pull request #14 from bepatient-fr/activate_ro_concurrence
M3te0r Aug 19, 2021
53dd8a8
Update deps
M3te0r Sep 13, 2021
c51d605
Pin jwcrypto to 0.8
M3te0r Sep 13, 2021
10690e5
Update NPM
M3te0r Dec 14, 2021
632f1ec
fix access rights
M3te0r Dec 17, 2021
c7a8e16
add encryption utils methods
JamesTOMBI Dec 21, 2021
d5f2456
put encryption knowledge in ikaaro
JamesTOMBI Dec 22, 2021
caf513c
add restrictions to datatype
JamesTOMBI Dec 24, 2021
950d212
spreading datatype changes into value retrieving calls
JamesTOMBI Dec 30, 2021
42fb179
add some comments
JamesTOMBI Jan 3, 2022
910783d
fix some unicode indexation issues
JamesTOMBI Jan 4, 2022
4cce8d8
(#MOBI-6291) Move encryption to itools, encrypted in datatype and dat…
M3te0r Jan 12, 2022
34e252d
(#MOBI-6291) Fix imports
M3te0r Jan 12, 2022
75cbcdd
(#MOBI-6291) remove pycryptodome
M3te0r Jan 12, 2022
9bca3e8
Merge pull request #16 from bepatient-fr/mobi_6291_encryption_data
M3te0r Jan 14, 2022
4b59c88
Fix import Ikaaro Fisrt pass
elieterrien Jan 28, 2022
d93c6f6
Python 3 2nd pass with requirements.txt
elieterrien Feb 9, 2022
973ad09
Fix parameters
elieterrien Feb 11, 2022
facc4fd
Python 3 read images
elieterrien Feb 11, 2022
8b6e5ff
Python 3 fix type value
elieterrien Feb 11, 2022
72ac2ac
Python 3 fix import package
elieterrien Feb 11, 2022
bc0430e
Python 3 str to bytes
elieterrien Feb 11, 2022
68d60e5
Python 3 Gevent APP need to return Bytes
elieterrien Feb 14, 2022
54f7785
Python 3 fix convert to dict
elieterrien Feb 14, 2022
2fcff83
Python 3 fix decode
elieterrien Feb 15, 2022
0f3351b
Fix many things
jdavid Feb 15, 2022
3ae8092
Merge pull request #18 from jdavid/bepatient-py3
elterrien Feb 15, 2022
2e452c9
Python 3 order languages by name
elieterrien Feb 15, 2022
bae96ea
Python 3 nom de fichier en string
elieterrien Feb 15, 2022
7d3544f
Python 3 added new method get_multipart_body_v2 for upload file and i…
elieterrien Feb 15, 2022
78b7c24
Python 3 fix encoding
elieterrien Feb 15, 2022
2cf1a60
Python 3 - from past.builtins import cmp cause circular import
elieterrien Feb 16, 2022
a2f6af1
Python 3 - from past.builtins import cmp cause circular import
elieterrien Feb 21, 2022
027f0c5
Python 3 fix import module
elieterrien Feb 23, 2022
0feaa54
Python 3 fix encoding context
elieterrien Feb 25, 2022
e20536f
Update requirements
jdavid Mar 2, 2022
8b6df6f
Fixing tests (wip)
jdavid Mar 2, 2022
c51a019
Fix tests
jdavid Mar 3, 2022
7aeecf3
Test xapian search
elieterrien Mar 4, 2022
744b96b
Index most fields as String instead of Unicode
jdavid Mar 4, 2022
da8e0fc
Integrate xapian search
elieterrien Mar 4, 2022
e03afb0
Python 3 convert to json
elieterrien Mar 7, 2022
45f280c
Pb requirements.txt
elieterrien Mar 11, 2022
dd883d5
Python update init
elieterrien Mar 15, 2022
c6ab617
Python3 convert response headers
elieterrien Mar 18, 2022
3d2f094
ikaaro does not use cryptography directly
jdavid Mar 22, 2022
2ee07e8
Fix json import - delete encoding to bytes
elieterrien Apr 11, 2022
5d2dd08
Fix Text_Field is String
elieterrien Apr 11, 2022
297e01c
Fix Text_Field decoding
elieterrien Apr 11, 2022
b284871
Fix ressource empty
elieterrien Apr 13, 2022
3361768
Missing 'u'
elieterrien Apr 15, 2022
7cda02d
Log the resource abspath
elieterrien Apr 15, 2022
ee01810
Fix Root import
elieterrien Apr 15, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ test/demo.hforge.org/
*.xhtml.ca
*.xhtml.nl_BE
ikaaro/ui_dev/aruni/node_modules/
.idea
File renamed without changes.
28 changes: 17 additions & 11 deletions ikaaro/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,28 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.

# Import from standard library
from logging import getLogger, NullHandler
from sys import stderr

# Import from itools
from itools.core import get_abspath, get_version
from itools.gettext import register_domain

# Import from ikaaro
from file import File
from folder import Folder
from registry import register_document_type
from root import Root
import text
from webpage import WebPage
# Add class to register
from .root import Root
from .file import File
from .folder import Folder
from .registry import register_document_type
from . import text
from .webpage import WebPage


getLogger("ikaaro").addHandler(NullHandler())
getLogger("ikaaro.web").addHandler(NullHandler())
getLogger("ikaaro.update").addHandler(NullHandler())
getLogger("ikaaro.access").addHandler(NullHandler())
getLogger("ikaaro.cron").addHandler(NullHandler())


# Check for required software
Expand All @@ -50,7 +59,7 @@


# Import required modules
import users
from . import users

# Register the itools domain
path = get_abspath('locale')
Expand All @@ -59,7 +68,4 @@
# Register document types
register_document_type(WebPage)
register_document_type(Folder)
register_document_type(File)

# Silent pyflakes
Root
register_document_type(File)
15 changes: 7 additions & 8 deletions ikaaro/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
from ikaaro.urls import urlpattern

# Import from here
from views import Api_DocView, ApiStatus_View
from views import Api_LoginView
from views import ApiDevPanel_ResourceJSON, ApiDevPanel_ResourceRaw, ApiDevPanel_ResourceHistory
from views import ApiDevPanel_ClassidViewDetails, ApiDevPanel_ClassidViewList
from views import ApiDevPanel_Config, ApiDevPanel_Log
from views import ApiDevPanel_CatalogReindex, UUIDView
from views import ApiDevPanel_ServerView, ApiDevPanel_ServerStop
from .views import Api_DocView, ApiStatus_View
from .views import Api_LoginView
from .views import ApiDevPanel_ResourceJSON, ApiDevPanel_ResourceRaw, ApiDevPanel_ResourceHistory
from .views import ApiDevPanel_ClassidViewDetails, ApiDevPanel_ClassidViewList
from .views import ApiDevPanel_Config, ApiDevPanel_Log
from .views import ApiDevPanel_CatalogReindex, UUIDView
from .views import ApiDevPanel_ServerView, ApiDevPanel_ServerStop


urlpatterns = [
Expand All @@ -36,7 +36,6 @@
urlpattern('/devpanel/classid', ApiDevPanel_ClassidViewList),
urlpattern('/devpanel/classid/{class_id}', ApiDevPanel_ClassidViewDetails),
# Resource
urlpattern('/devpanel/resource/{uuid}', UUIDView),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe its used to remove resource ?

urlpattern('/devpanel/resource/{uuid}/json', ApiDevPanel_ResourceJSON),
urlpattern('/devpanel/resource/{uuid}/raw', ApiDevPanel_ResourceRaw),
urlpattern('/devpanel/resource/{uuid}/history', ApiDevPanel_ResourceHistory),
Expand Down
36 changes: 16 additions & 20 deletions ikaaro/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,9 @@ def get_namespace(self, resource, context):
'methods': view.known_methods,
'description': view.__doc__}
namespace['endpoints'].append(kw)
i +=1
i += 1
return namespace


def get_view_query_as_list(self, view, schema):
l = []
for key, field in schema.items():
Expand All @@ -74,13 +73,11 @@ def get_view_query_as_list(self, view, schema):
return l




class Api_View(ItoolsView):

response_schema = {}
route = None

use_cookies = False

@classmethod
def get_route(cls):
Expand All @@ -89,7 +86,6 @@ def get_route(cls):
"""
return cls.route


def get_resource(self, context):
return context.resource

Expand Down Expand Up @@ -125,7 +121,7 @@ class UUIDView(Api_View):
access = True
known_methods = ['DELETE']

path_query_schema = {'uuid': Char_Field(title=MSG(u'The uuid of a resource in DB'))}
path_query_schema = {'uuid': Char_Field(title=MSG('The uuid of a resource in DB'))}

def get_resource(self, context):
query = get_resource_by_uuid_query(
Expand All @@ -142,7 +138,7 @@ def get_resource(self, context):
# Forbidden (403)
raise Forbidden
raise NotFound
return search.get_resources(size=1).next()
return next(search.get_resources(size=1))


access_DELETE = 'is_allowed_to_remove'
Expand All @@ -159,7 +155,7 @@ class ApiDevPanel_ResourceJSON(UUIDView):

access = 'is_admin'
known_methods = ['GET', 'DELETE']
query_schema = {'pretty': Boolean_Field(title=MSG(u'Pretty ?'))}
query_schema = {'pretty': Boolean_Field(title=MSG('Pretty ?'))}

def GET(self, root, context):
resource = self.get_resource(context)
Expand Down Expand Up @@ -194,10 +190,10 @@ class ApiDevPanel_ResourceHistory(UUIDView):
access = 'is_admin'
known_methods = ['GET', 'DELETE']
response_schema = {
'sha': Char_Field(title=MSG(u'SHA of the commit')),
'sha': Char_Field(title=MSG('SHA of the commit')),
'author_date': Datetime_Field(title=MSG("Datetime of commit")),
'author_name': Char_Field(title=MSG(u"Commit's author name")),
'message_short': Char_Field(title=MSG(u"Commit's title"))
'author_name': Char_Field(title=MSG("Commit's author name")),
'message_short': Char_Field(title=MSG("Commit's title"))
}
def GET(self, root, context):
resource = self.get_resource(context)
Expand Down Expand Up @@ -229,11 +225,11 @@ class ApiDevPanel_ClassidViewDetails(Api_View):
access = 'is_admin'

path_query_schema = {
'class_id': Char_Field(title=MSG(u'A class_id registered in DB'))
'class_id': Char_Field(title=MSG('A class_id registered in DB'))
}
response_schema = {
'class_title': Char_Field(title=MSG(u'The class_title of the resource cls')),
'class_id': Char_Field(title=MSG(u'The class_id of the resource cls'))
'class_title': Char_Field(title=MSG('The class_title of the resource cls')),
'class_id': Char_Field(title=MSG('The class_id of the resource cls'))
}


Expand Down Expand Up @@ -264,8 +260,8 @@ class Api_LoginView(Api_View):

access = True
known_methods = ['POST']
schema = {'email': Email_Field(title=MSG(u'Username'), required=True),
'password': Password_Field(title=MSG(u'Password'), required=True)}
schema = {'email': Email_Field(title=MSG('Username'), required=True),
'password': Password_Field(title=MSG('Password'), required=True)}

def POST(self, root, context):
raise NotImplementedError
Expand Down Expand Up @@ -316,9 +312,9 @@ class ApiDevPanel_ServerView(Api_View):
access = 'is_admin'
known_methods = ['GET']
response_schema = {
'timestamp': Char_Field(title=MSG(u"Server's start timestamp")),
'pid': Integer_Field(title=MSG(u"Server's PID")),
'port': Integer_Field(title=MSG(u"Server's port"))
'timestamp': Char_Field(title=MSG("Server's start timestamp")),
'pid': Integer_Field(title=MSG("Server's PID")),
'port': Integer_Field(title=MSG("Server's port"))
}

def GET(self, root, context):
Expand Down
40 changes: 20 additions & 20 deletions ikaaro/autoadd.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
from itools.web import get_context, ERROR, FormError

# Import from ikaaro
from autoform import AutoForm
from datatypes import BirthDate
from datatypes import Days, Months, Years
from buttons import Button
from fields import Field
import messages
from widgets import HiddenWidget, ReadOnlyWidget
from .autoform import AutoForm
from .datatypes import BirthDate
from .datatypes import Days, Months, Years
from .buttons import Button
from .fields import Field
from . import messages
from .widgets import HiddenWidget, ReadOnlyWidget



Expand All @@ -37,7 +37,7 @@ class AutoAdd(AutoForm):

access = 'is_allowed_to_add'

actions = [Button(access=True, css='btn btn-primary', title=MSG(u'Add'))]
actions = [Button(access=True, css='btn btn-primary', title=MSG('Add'))]
action_goto = None
goto_view = None
goto_parent_view = None # DEPRECATED -> use action_goto
Expand Down Expand Up @@ -77,7 +77,7 @@ def get_field(self, name):
def _resource_class(self):
context = self.context

class_id = context.query['type']
class_id = context.query.get('type')
if not class_id:
return None
return context.database.get_resource_class(class_id)
Expand All @@ -90,10 +90,10 @@ def get_title(self, context):
cls = self._resource_class
if cls:
class_title = cls.class_title.gettext()
title = MSG(u'Add {class_title}')
title = MSG('Add {class_title}')
return title.gettext(class_title=class_title)

return MSG(u'Add resource').gettext()
return MSG('Add resource').gettext()


def _get_datatype(self, resource, context, name):
Expand Down Expand Up @@ -162,11 +162,11 @@ def get_value(self, resource, context, name, datatype):
# View cls_description
value = getattr(self, name, None)
if value is not None:
return value.gettext() if value else u''
return value.gettext() if value else ''
# Resource cls_description
cls = self._resource_class
value = cls.class_description
return value.gettext() if value else u''
return value.gettext() if value else ''
elif name == 'referrer':
referrer = context.query.get('referrer')
return referrer or context.get_referrer()
Expand All @@ -177,7 +177,7 @@ def get_value(self, resource, context, name, datatype):

if getattr(datatype, 'multilingual', False):
for language in resource.get_edit_languages(context):
value.setdefault(language, u'')
value.setdefault(language, '')

return value

Expand All @@ -196,8 +196,8 @@ def get_container(self, resource, context, form):
root = context.root
if not root.has_permission(context.user, 'add', container, class_id):
path = '/' if path == '.' else '/%s/' % path
msg = ERROR(u'Adding resources to {path} is not allowed.')
raise FormError, msg.gettext(path=path)
msg = ERROR('Adding resources to {path} is not allowed.')
raise FormError(msg.gettext(path=path))

# Ok
return container
Expand Down Expand Up @@ -228,17 +228,17 @@ def _get_form(self, resource, context):
# 2. The name
name = self.get_new_resource_name(form)
if not name:
raise FormError, messages.MSG_NAME_MISSING
raise FormError(messages.MSG_NAME_MISSING)
try:
name = checkid(name)
except UnicodeEncodeError:
name = None
if name is None:
raise FormError, messages.MSG_BAD_NAME
raise FormError(messages.MSG_BAD_NAME)

# Check the name is free
if container.get_resource(name, soft=True) is not None:
raise FormError, messages.MSG_NAME_CLASH
raise FormError(messages.MSG_NAME_CLASH)
form['name'] = name

# Ok
Expand All @@ -257,7 +257,7 @@ def set_value(self, resource, context, name, form):

value = form[name]
if type(value) is dict:
for language, data in value.iteritems():
for language, data in value.items():
resource.set_value(name, data, language=language)
else:
resource.set_value(name, value)
Expand Down
24 changes: 12 additions & 12 deletions ikaaro/autoedit.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,18 @@
from itools.web import get_context

# Import from ikaaro
from autoform import AutoForm
from widgets import HiddenWidget, timestamp_widget
from datatypes import BirthDate
from datatypes import Days, Months, Years
from fields import Field
import messages
from views import ContextMenu
from .autoform import AutoForm
from .widgets import HiddenWidget, timestamp_widget
from .datatypes import BirthDate
from .datatypes import Days, Months, Years
from .fields import Field
from . import messages
from .views import ContextMenu


class EditLanguageMenu(ContextMenu):

title = MSG(u'Configuration')
title = MSG('Configuration')
template = '/ui/ikaaro/generic/edit_language_menu.xml'
view = None

Expand All @@ -52,7 +52,7 @@ def action(self):
def _get_items(self):
multilingual = False
schema = self.view._get_schema(self.resource, self.context)
for key, datatype in schema.iteritems():
for key, datatype in schema.items():
if getattr(datatype, 'multilingual', False):
multilingual = True
break
Expand Down Expand Up @@ -87,7 +87,7 @@ def display(self):
class AutoEdit(AutoForm):

access = 'is_allowed_to_edit'
title = MSG(u'Edit')
title = MSG('Edit')

fields = ['title', 'description', 'subject']
def get_fields(self):
Expand Down Expand Up @@ -149,7 +149,7 @@ def _get_query_fields(self, resource, context):
default = set()
to_keep = set()

for key, datatype in schema.iteritems():
for key, datatype in schema.items():
# Keep readonly and mandatory widgets
if getattr(datatype, 'mandatory', False):
to_keep.add(key)
Expand Down Expand Up @@ -314,7 +314,7 @@ def set_value(self, resource, context, name, form):
return False
value = form[name]
if type(value) is dict:
for language, data in value.iteritems():
for language, data in value.items():
resource.set_value(name, data, language=language)
else:
resource.set_value(name, value)
Expand Down
Loading