# HG changeset patch # User Sylvain Thénault # Date 1317194862 -7200 # Node ID 9aae456abab585ca360ef5587f237868ca792142 # Parent be04706eacc9d4f9661b19b407e4ca19c98ca8ba [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way) diff -r be04706eacc9 -r 9aae456abab5 __init__.py --- a/__init__.py Tue Sep 27 16:04:30 2011 +0200 +++ b/__init__.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. diff -r be04706eacc9 -r 9aae456abab5 appobject.py --- a/appobject.py Tue Sep 27 16:04:30 2011 +0200 +++ b/appobject.py Wed Sep 28 09:27:42 2011 +0200 @@ -324,7 +324,7 @@ selected according to a context (usually at least a request and a result set). - The following attributes should be set on concret appobject classes: + The following attributes should be set on concrete appobject classes: :attr:`__registry__` name of the registry for this object (string like 'views', @@ -415,7 +415,7 @@ appobject is returned without any transformation. """ try: # XXX < 3.6 bw compat - pdefs = cls.property_defs + pdefs = cls.property_defs # pylint: disable=E1101 except AttributeError: pdefs = getattr(cls, 'cw_property_defs', {}) else: diff -r be04706eacc9 -r 9aae456abab5 crypto.py --- a/crypto.py Tue Sep 27 16:04:30 2011 +0200 +++ b/crypto.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -15,9 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public License along # with CubicWeb. If not, see . -"""Simple cryptographic routines, based on python-crypto. - -""" +"""Simple cryptographic routines, based on python-crypto.""" __docformat__ = "restructuredtext en" from pickle import dumps, loads diff -r be04706eacc9 -r 9aae456abab5 cwconfig.py --- a/cwconfig.py Tue Sep 27 16:04:30 2011 +0200 +++ b/cwconfig.py Wed Sep 28 09:27:42 2011 +0200 @@ -830,6 +830,13 @@ """ return [self.cube_dir(p) for p in self.cubes()] + # these are overridden by set_log_methods below + # only defining here to prevent pylint from complaining + @classmethod + def debug(cls, msg, *a, **kw): + pass + info = warning = error = critical = exception = debug + class CubicWebConfiguration(CubicWebNoAppConfiguration): """base class for cubicweb server and web configurations""" @@ -853,6 +860,9 @@ # wouldn't be possible otherwise repairing = False + # set by upgrade command + verbosity = 0 + options = CubicWebNoAppConfiguration.options + ( ('log-file', {'type' : 'string', @@ -1072,13 +1082,13 @@ @cached def instance_md5_version(self): - import hashlib + from hashlib import md5 # pylint: disable=E0611 infos = [] for pkg in sorted(self.cubes()): version = self.cube_version(pkg) infos.append('%s-%s' % (pkg, version)) infos.append('cubicweb-%s' % str(self.cubicweb_version())) - return hashlib.md5(';'.join(infos)).hexdigest() + return md5(';'.join(infos)).hexdigest() def load_configuration(self): """load instance's configuration files""" @@ -1188,13 +1198,6 @@ SMTP_LOCK.release() return True - # these are overridden by set_log_methods below - # only defining here to prevent pylint from complaining - @classmethod - def debug(cls, msg, *a, **kw): - pass - info = warning = error = critical = exception = debug - set_log_methods(CubicWebNoAppConfiguration, logging.getLogger('cubicweb.configuration')) @@ -1303,7 +1306,7 @@ try: return Binary(fpath) except OSError, ex: - self.critical("can't open %s: %s", fpath, ex) + source.critical("can't open %s: %s", fpath, ex) return None register_function(FSPATH) diff -r be04706eacc9 -r 9aae456abab5 dbapi.py --- a/dbapi.py Tue Sep 27 16:04:30 2011 +0200 +++ b/dbapi.py Wed Sep 28 09:27:42 2011 +0200 @@ -292,7 +292,7 @@ self.user = user self.set_entity_cache(user) - def execute(self, *args, **kwargs): + def execute(self, *args, **kwargs): # pylint: disable=E0202 """overriden when session is set. By default raise authentication error so authentication is requested. """ @@ -621,7 +621,8 @@ """ return self._repo.check_session(self.sessionid) - def _txid(self, cursor=None): # XXX could now handle various isolation level! + def _txid(self, cursor=None): # pylint: disable=E0202 + # XXX could now handle various isolation level! # return a dict as bw compat trick return {'txid': currentThread().getName()} diff -r be04706eacc9 -r 9aae456abab5 devtools/__init__.py --- a/devtools/__init__.py Tue Sep 27 16:04:30 2011 +0200 +++ b/devtools/__init__.py Wed Sep 28 09:27:42 2011 +0200 @@ -28,7 +28,7 @@ import pickle import glob import warnings -import hashlib +from hashlib import sha1 # pylint: disable=E0611 from datetime import timedelta from os.path import (abspath, join, exists, basename, dirname, normpath, split, isfile, isabs, splitext, isdir, expanduser) @@ -598,7 +598,7 @@ @property def _config_id(self): - return hashlib.sha1(self.config.apphome).hexdigest()[:10] + return sha1(self.config.apphome).hexdigest()[:10] def _backup_name(self, db_id): # merge me with parent backup_name = '_'.join(('cache', self._config_id, self.dbname, db_id)) diff -r be04706eacc9 -r 9aae456abab5 devtools/qunit.py --- a/devtools/qunit.py Tue Sep 27 16:04:30 2011 +0200 +++ b/devtools/qunit.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,3 +1,21 @@ +# copyright 2010-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb 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 Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . + import os, os.path as osp import signal from tempfile import mkdtemp, NamedTemporaryFile, TemporaryFile diff -r be04706eacc9 -r 9aae456abab5 devtools/repotest.py --- a/devtools/repotest.py Tue Sep 27 16:04:30 2011 +0200 +++ b/devtools/repotest.py Wed Sep 28 09:27:42 2011 +0200 @@ -148,8 +148,7 @@ from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions class RQLGeneratorTC(TestCase): - schema = backend = None # set this in concret test - + schema = backend = None # set this in concrete class @classmethod def setUpClass(cls): @@ -197,7 +196,7 @@ class BaseQuerierTC(TestCase): - repo = None # set this in concret test + repo = None # set this in concrete class def setUp(self): self.o = self.repo.querier diff -r be04706eacc9 -r 9aae456abab5 devtools/testlib.py --- a/devtools/testlib.py Tue Sep 27 16:04:30 2011 +0200 +++ b/devtools/testlib.py Wed Sep 28 09:27:42 2011 +0200 @@ -1167,34 +1167,34 @@ pass -def vreg_instrumentize(testclass): - # XXX broken - from cubicweb.devtools.apptest import TestEnvironment - env = testclass._env = TestEnvironment('data', configcls=testclass.configcls) - for reg in env.vreg.values(): - reg._selected = {} - try: - orig_select_best = reg.__class__.__orig_select_best - except Exception: - orig_select_best = reg.__class__._select_best - def instr_select_best(self, *args, **kwargs): - selected = orig_select_best(self, *args, **kwargs) - try: - self._selected[selected.__class__] += 1 - except KeyError: - self._selected[selected.__class__] = 1 - except AttributeError: - pass # occurs on reg used to restore database - return selected - reg.__class__._select_best = instr_select_best - reg.__class__.__orig_select_best = orig_select_best +# def vreg_instrumentize(testclass): +# # XXX broken +# from cubicweb.devtools.apptest import TestEnvironment +# env = testclass._env = TestEnvironment('data', configcls=testclass.configcls) +# for reg in env.vreg.values(): +# reg._selected = {} +# try: +# orig_select_best = reg.__class__.__orig_select_best +# except Exception: +# orig_select_best = reg.__class__._select_best +# def instr_select_best(self, *args, **kwargs): +# selected = orig_select_best(self, *args, **kwargs) +# try: +# self._selected[selected.__class__] += 1 +# except KeyError: +# self._selected[selected.__class__] = 1 +# except AttributeError: +# pass # occurs on reg used to restore database +# return selected +# reg.__class__._select_best = instr_select_best +# reg.__class__.__orig_select_best = orig_select_best -def print_untested_objects(testclass, skipregs=('hooks', 'etypes')): - for regname, reg in testclass._env.vreg.iteritems(): - if regname in skipregs: - continue - for appobjects in reg.itervalues(): - for appobject in appobjects: - if not reg._selected.get(appobject): - print 'not tested', regname, appobject +# def print_untested_objects(testclass, skipregs=('hooks', 'etypes')): +# for regname, reg in testclass._env.vreg.iteritems(): +# if regname in skipregs: +# continue +# for appobjects in reg.itervalues(): +# for appobject in appobjects: +# if not reg._selected.get(appobject): +# print 'not tested', regname, appobject diff -r be04706eacc9 -r 9aae456abab5 entities/adapters.py --- a/entities/adapters.py Tue Sep 27 16:04:30 2011 +0200 +++ b/entities/adapters.py Wed Sep 28 09:27:42 2011 +0200 @@ -366,8 +366,8 @@ class IProgressAdapter(EntityAdapter): """something that has a cost, a state and a progression. - You should at least override progress_info an in_progress methods on concret - implementations. + You should at least override progress_info an in_progress methods on + concrete implementations. """ __needs_bw_compat__ = True __regid__ = 'IProgress' diff -r be04706eacc9 -r 9aae456abab5 entities/wfobjs.py --- a/entities/wfobjs.py Tue Sep 27 16:04:30 2011 +0200 +++ b/entities/wfobjs.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. diff -r be04706eacc9 -r 9aae456abab5 etwist/request.py --- a/etwist/request.py Tue Sep 27 16:04:30 2011 +0200 +++ b/etwist/request.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. diff -r be04706eacc9 -r 9aae456abab5 etwist/server.py --- a/etwist/server.py Tue Sep 27 16:04:30 2011 +0200 +++ b/etwist/server.py Wed Sep 28 09:27:42 2011 +0200 @@ -28,7 +28,7 @@ import traceback import threading import re -import hashlib +from hashlib import md5 # pylint: disable=E0611 from os.path import join from time import mktime from datetime import date, timedelta @@ -77,6 +77,11 @@ class NoListingFile(static.File): + def __init__(self, config, path=None): + if path is None: + path = config.static_directory + static.File.__init__(self, path) + self.config = config def set_expires(self, request): if not self.config.debugmode: @@ -93,8 +98,7 @@ class DataLookupDirectory(NoListingFile): def __init__(self, config, path): self.md5_version = config.instance_md5_version() - NoListingFile.__init__(self, path) - self.config = config + NoListingFile.__init__(self, config, path) self.here = path self._defineChildResources() if self.config.debugmode: @@ -134,13 +138,10 @@ return resource else: self.set_expires(request) - return NoListingFile(filepath) + return NoListingFile(self.config, filepath) class FCKEditorResource(NoListingFile): - def __init__(self, config, path): - NoListingFile.__init__(self, path) - self.config = config def getChild(self, path, request): pre_path = request.path.split('/')[1:] @@ -179,7 +180,7 @@ # create a unique / predictable filename. We don't consider cubes # version since uicache is cleared at server startup, and file's dates # are checked in debug mode - fname = 'cache_concat_' + hashlib.md5(';'.join(paths)).hexdigest() + ext + fname = 'cache_concat_' + md5(';'.join(paths)).hexdigest() + ext filepath = osp.join(config.appdatahome, 'uicache', fname) LongTimeExpiringFile.__init__(self, config, filepath) self._concat_cached_filepath(filepath, paths) @@ -239,7 +240,7 @@ self.https_url = config['https-url'] global MAX_POST_LENGTH MAX_POST_LENGTH = config['max-post-length'] - self.putChild('static', NoListingFile(config.static_directory)) + self.putChild('static', NoListingFile(config)) self.putChild('fckeditor', FCKEditorResource(self.config, '')) self.putChild('data', DataLookupDirectory(self.config, '')) @@ -402,6 +403,13 @@ stream=content, code=code, headers=request.headers_out) + # these are overridden by set_log_methods below + # only defining here to prevent pylint from complaining + @classmethod + def debug(cls, msg, *a, **kw): + pass + info = warning = error = critical = exception = debug + JSON_PATHS = set(('json',)) FRAME_POST_PATHS = set(('validateform',)) diff -r be04706eacc9 -r 9aae456abab5 ext/rest.py --- a/ext/rest.py Tue Sep 27 16:04:30 2011 +0200 +++ b/ext/rest.py Wed Sep 28 09:27:42 2011 +0200 @@ -187,7 +187,7 @@ try: from pygments import highlight from pygments.lexers import get_lexer_by_name - from pygments.formatters import HtmlFormatter + from pygments.formatters.html import HtmlFormatter except ImportError: pygments_directive = None else: diff -r be04706eacc9 -r 9aae456abab5 hooks/metadata.py --- a/hooks/metadata.py Tue Sep 27 16:04:30 2011 +0200 +++ b/hooks/metadata.py Wed Sep 28 09:27:42 2011 +0200 @@ -150,6 +150,8 @@ # entity source handling ####################################################### class ChangeEntityUpdateCaches(hook.Operation): + oldsource = newsource = entity = None # make pylint happy + def postcommit_event(self): self.oldsource.reset_caches() repo = self.session.repo diff -r be04706eacc9 -r 9aae456abab5 hooks/notification.py --- a/hooks/notification.py Tue Sep 27 16:04:30 2011 +0200 +++ b/hooks/notification.py Wed Sep 28 09:27:42 2011 +0200 @@ -28,6 +28,8 @@ class RenderAndSendNotificationView(hook.Operation): """delay rendering of notification view until precommit""" + view = None # make pylint happy + def precommit_event(self): view = self.view if view.cw_rset is not None and not view.cw_rset: diff -r be04706eacc9 -r 9aae456abab5 hooks/syncschema.py --- a/hooks/syncschema.py Tue Sep 27 16:04:30 2011 +0200 +++ b/hooks/syncschema.py Wed Sep 28 09:27:42 2011 +0200 @@ -246,6 +246,7 @@ CWAttribute entities * add owned_by relation by creating the necessary CWRelation entity """ + entity = None # make pylint happy def precommit_event(self): session = self.session @@ -759,6 +760,8 @@ class MemSchemaCWETypeDel(MemSchemaOperation): """actually remove the entity type from the instance's schema""" + etype = None # make pylint happy + def postcommit_event(self): # del_entity_type also removes entity's relations self.session.vreg.schema.del_entity_type(self.etype) @@ -766,6 +769,8 @@ class MemSchemaCWRTypeAdd(MemSchemaOperation): """actually add the relation type to the instance's schema""" + rtypedef = None # make pylint happy + def precommit_event(self): self.session.vreg.schema.add_relation_type(self.rtypedef) @@ -775,6 +780,8 @@ class MemSchemaCWRTypeDel(MemSchemaOperation): """actually remove the relation type from the instance's schema""" + rtype = None # make pylint happy + def postcommit_event(self): try: self.session.vreg.schema.del_relation_type(self.rtype) @@ -786,6 +793,7 @@ class MemSchemaPermissionAdd(MemSchemaOperation): """synchronize schema when a *_permission relation has been added on a group """ + eid = action = group_eid = expr = None # make pylint happy def precommit_event(self): """the observed connections.cnxset has been commited""" @@ -845,6 +853,7 @@ class MemSchemaSpecializesAdd(MemSchemaOperation): + etypeeid = parentetypeeid = None # make pylint happy def precommit_event(self): eschema = self.session.vreg.schema.schema_by_eid(self.etypeeid) @@ -856,6 +865,7 @@ class MemSchemaSpecializesDel(MemSchemaOperation): + etypeeid = parentetypeeid = None # make pylint happy def precommit_event(self): try: diff -r be04706eacc9 -r 9aae456abab5 hooks/syncsession.py --- a/hooks/syncsession.py Tue Sep 27 16:04:30 2011 +0200 +++ b/hooks/syncsession.py Wed Sep 28 09:27:42 2011 +0200 @@ -40,7 +40,8 @@ class _GroupOperation(hook.Operation): """base class for group operation""" - geid = None + cnxuser = None # make pylint happy + def __init__(self, session, *args, **kwargs): """override to get the group name before actual groups manipulation: @@ -55,6 +56,7 @@ class _DeleteGroupOp(_GroupOperation): """synchronize user when a in_group relation has been deleted""" + def postcommit_event(self): """the observed connections set has been commited""" groups = self.cnxuser.groups @@ -117,9 +119,9 @@ # CWProperty hooks ############################################################# - class _DelCWPropertyOp(hook.Operation): """a user's custom properties has been deleted""" + cwpropdict = key = None # make pylint happy def postcommit_event(self): """the observed connections set has been commited""" @@ -131,6 +133,7 @@ class _ChangeCWPropertyOp(hook.Operation): """a user's custom properties has been added/changed""" + cwpropdict = key = value = None # make pylint happy def postcommit_event(self): """the observed connections set has been commited""" @@ -139,6 +142,7 @@ class _AddCWPropertyOp(hook.Operation): """a user's custom properties has been added/changed""" + cwprop = None # make pylint happy def postcommit_event(self): """the observed connections set has been commited""" diff -r be04706eacc9 -r 9aae456abab5 hooks/syncsources.py --- a/hooks/syncsources.py Tue Sep 27 16:04:30 2011 +0200 +++ b/hooks/syncsources.py Wed Sep 28 09:27:42 2011 +0200 @@ -34,6 +34,7 @@ # repo sources synchronization ################################################# class SourceAddedOp(hook.Operation): + entity = None # make pylint happy def postcommit_event(self): self.session.repo.add_source(self.entity) @@ -54,6 +55,7 @@ class SourceRemovedOp(hook.Operation): + uri = None # make pylint happy def postcommit_event(self): self.session.repo.remove_source(self.uri) @@ -82,6 +84,7 @@ class SourceRenamedOp(hook.LateOperation): + oldname = newname = None # make pylint happy def precommit_event(self): source = self.session.repo.sources_by_uri[self.oldname] @@ -141,12 +144,12 @@ # Expect cw_for_source/cw_schema are immutable relations (i.e. can't change from # a source or schema to another). -class SourceMappingDeleteHook(SourceHook): +class SourceMappingImmutableHook(SourceHook): """check cw_for_source and cw_schema are immutable relations XXX empty delete perms would be enough? """ - __regid__ = 'cw.sources.delschemaconfig' + __regid__ = 'cw.sources.mapping.immutable' __select__ = SourceHook.__select__ & hook.match_rtype('cw_for_source', 'cw_schema') events = ('before_add_relation',) def __call__(self): diff -r be04706eacc9 -r 9aae456abab5 hooks/workflow.py --- a/hooks/workflow.py Tue Sep 27 16:04:30 2011 +0200 +++ b/hooks/workflow.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -45,6 +45,7 @@ class _SetInitialStateOp(hook.Operation): """make initial state be a default state""" + entity = None # make pylint happy def precommit_event(self): session = self.session @@ -61,6 +62,7 @@ class _FireAutotransitionOp(hook.Operation): """try to fire auto transition after state changes""" + entity = None # make pylint happy def precommit_event(self): entity = self.entity @@ -73,6 +75,7 @@ class _WorkflowChangedOp(hook.Operation): """fix entity current state when changing its workflow""" + eid = wfeid = None # make pylint happy def precommit_event(self): # notice that enforcement that new workflow apply to the entity's type is @@ -109,6 +112,7 @@ class _CheckTrExitPoint(hook.Operation): + treid = None # make pylint happy def precommit_event(self): tr = self.session.entity_from_eid(self.treid) @@ -122,6 +126,7 @@ class _SubWorkflowExitOp(hook.Operation): + forentity = trinfo = None # make pylint happy def precommit_event(self): session = self.session diff -r be04706eacc9 -r 9aae456abab5 mail.py --- a/mail.py Tue Sep 27 16:04:30 2011 +0200 +++ b/mail.py Wed Sep 28 09:27:42 2011 +0200 @@ -21,10 +21,10 @@ from base64 import b64encode, b64decode from time import time -from email.MIMEMultipart import MIMEMultipart -from email.MIMEText import MIMEText -from email.MIMEImage import MIMEImage -from email.Header import Header +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.mime.image import MIMEImage +from email.header import Header try: from socket import gethostname except ImportError: @@ -156,6 +156,10 @@ msgid_timestamp = True + # to be defined on concrete sub-classes + content = None # body of the mail + message = None # action verb of the subject + # this is usually the method to call def render_and_send(self, **kwargs): """generate and send an email message for this view""" diff -r be04706eacc9 -r 9aae456abab5 md5crypt.py --- a/md5crypt.py Tue Sep 27 16:04:30 2011 +0200 +++ b/md5crypt.py Wed Sep 28 09:27:42 2011 +0200 @@ -41,7 +41,7 @@ MAGIC = '$1$' # Magic string ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" -import hashlib as md5 +from hashlib import md5 # pylint: disable=E0611 def to64 (v, n): ret = '' @@ -63,7 +63,7 @@ salt = salt.split('$', 1)[0] salt = salt[:8] ctx = pw + magic + salt - final = md5.md5(pw + salt + pw).digest() + final = md5(pw + salt + pw).digest() for pl in xrange(len(pw), 0, -16): if pl > 16: ctx = ctx + final[:16] @@ -77,7 +77,7 @@ else: ctx = ctx + pw[0] i = i >> 1 - final = md5.md5(ctx).digest() + final = md5(ctx).digest() # The following is supposed to make # things run slower. # my question: WTF??? @@ -95,7 +95,7 @@ ctx1 = ctx1 + final[:16] else: ctx1 = ctx1 + pw - final = md5.md5(ctx1).digest() + final = md5(ctx1).digest() # Final xform passwd = '' passwd = passwd + to64((int(ord(final[0])) << 16) diff -r be04706eacc9 -r 9aae456abab5 migration.py --- a/migration.py Tue Sep 27 16:04:30 2011 +0200 +++ b/migration.py Wed Sep 28 09:27:42 2011 +0200 @@ -201,8 +201,8 @@ if not ask_confirm or self.confirm(msg): return meth(*args, **kwargs) - def confirm(self, question, shell=True, abort=True, retry=False, pdb=False, - default='y'): + def confirm(self, question, # pylint: disable=E0202 + shell=True, abort=True, retry=False, pdb=False, default='y'): """ask for confirmation and return true on positive answer if `retry` is true the r[etry] answer may return 2 diff -r be04706eacc9 -r 9aae456abab5 rqlrewrite.py --- a/rqlrewrite.py Tue Sep 27 16:04:30 2011 +0200 +++ b/rqlrewrite.py Wed Sep 28 09:27:42 2011 +0200 @@ -638,7 +638,7 @@ def visit_mathexpression(self, node): cmp_ = n.MathExpression(node.operator) - for c in cmp.children: + for c in node.children: cmp_.append(c.accept(self)) return cmp_ diff -r be04706eacc9 -r 9aae456abab5 schema.py --- a/schema.py Tue Sep 27 16:04:30 2011 +0200 +++ b/schema.py Wed Sep 28 09:27:42 2011 +0200 @@ -666,6 +666,8 @@ # these are overridden by set_log_methods below # only defining here to prevent pylint from complaining info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None + # to be defined in concrete classes + full_rql = None def __init__(self, expression, mainvars, eid): self.eid = eid # eid of the entity representing this rql expression diff -r be04706eacc9 -r 9aae456abab5 selectors.py --- a/selectors.py Tue Sep 27 16:04:30 2011 +0200 +++ b/selectors.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. diff -r be04706eacc9 -r 9aae456abab5 server/hook.py --- a/server/hook.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/hook.py Wed Sep 28 09:27:42 2011 +0200 @@ -537,7 +537,7 @@ # XXX deprecated enabled = True # stop pylint from complaining about missing attributes in Hooks classes - eidfrom = eidto = entity = rtype = None + eidfrom = eidto = entity = rtype = repo = None @classmethod @cached @@ -580,7 +580,7 @@ warn('[3.6] %s: accepts is deprecated, define proper __select__' % classid(cls), DeprecationWarning) rtypes = [] - for ertype in cls.accepts: + for ertype in cls.accepts: # pylint: disable=E1101 if ertype.islower(): rtypes.append(ertype) else: @@ -601,6 +601,7 @@ if hasattr(self, 'call'): warn('[3.6] %s: call is deprecated, implement __call__' % classid(self.__class__), DeprecationWarning) + # pylint: disable=E1101 if self.event.endswith('_relation'): self.call(self._cw, self.eidfrom, self.rtype, self.eidto) elif 'delete' in self.event: @@ -628,7 +629,7 @@ Notice there are no default behaviour defined when a watched relation is deleted, you'll have to handle this by yourself. - You usually want to use the :class:`match_rtype_sets` selector on concret + You usually want to use the :class:`match_rtype_sets` selector on concrete classes. """ events = ('after_add_relation',) @@ -808,7 +809,7 @@ if event == 'postcommit_event' and hasattr(self, 'commit_event'): warn('[3.10] %s: commit_event method has been replaced by postcommit_event' % classid(self.__class__), DeprecationWarning) - self.commit_event() + self.commit_event() # pylint: disable=E1101 getattr(self, event)() def precommit_event(self): @@ -1092,6 +1093,9 @@ class RQLPrecommitOperation(Operation): + # to be defined in concrete classes + rqls = None + def precommit_event(self): execute = self.session.execute for rql in self.rqls: diff -r be04706eacc9 -r 9aae456abab5 server/migractions.py --- a/server/migractions.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/migractions.py Wed Sep 28 09:27:42 2011 +0200 @@ -1563,8 +1563,7 @@ This may be useful on accidental desync between the repository schema and a sql database """ - dbhelper = self.repo.system_source.dbhelper - tablesql = rschema2sql(dbhelper, self.repo.schema.rschema(rtype)) + tablesql = rschema2sql(self.repo.schema.rschema(rtype)) for sql in tablesql.split(';'): if sql.strip(): self.sqlexec(sql) diff -r be04706eacc9 -r 9aae456abab5 server/msplanner.py --- a/server/msplanner.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/msplanner.py Wed Sep 28 09:27:42 2011 +0200 @@ -1438,7 +1438,7 @@ for step in steps for select in step.union.children): if temptable: - step = IntersectFetchStep(plan) # XXX not implemented + raise NotImplementedError('oops') # IntersectFetchStep(plan) else: step = IntersectStep(plan) else: diff -r be04706eacc9 -r 9aae456abab5 server/server.py --- a/server/server.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/server.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -129,6 +129,13 @@ signal.signal(signal.SIGINT, lambda x, y, s=self: s.quit()) signal.signal(signal.SIGTERM, lambda x, y, s=self: s.quit()) + + # these are overridden by set_log_methods below + # only defining here to prevent pylint from complaining + @classmethod + def info(cls, msg, *a, **kw): + pass + from logging import getLogger from cubicweb import set_log_methods LOGGER = getLogger('cubicweb.reposerver') diff -r be04706eacc9 -r 9aae456abab5 server/sources/__init__.py --- a/server/sources/__init__.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/sources/__init__.py Wed Sep 28 09:27:42 2011 +0200 @@ -118,6 +118,10 @@ # source configuration options options = () + # these are overridden by set_log_methods below + # only defining here to prevent pylint from complaining + info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None + def __init__(self, repo, source_config, eid=None): self.repo = repo self.set_schema(repo.schema) diff -r be04706eacc9 -r 9aae456abab5 server/sources/native.py --- a/server/sources/native.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/sources/native.py Wed Sep 28 09:27:42 2011 +0200 @@ -865,7 +865,7 @@ self.exception('failed to query entities table for eid %s', eid) raise UnknownEid(eid) - def eid_type_source(self, session, eid): + def eid_type_source(self, session, eid): # pylint: disable=E0202 """return a tuple (type, source, extid) for the entity with id """ sql = 'SELECT type, source, extid, asource FROM entities WHERE eid=%s' % eid res = self._eid_type_source(session, eid, sql) @@ -924,13 +924,13 @@ return cursor.fetchone()[0] - def create_eid(self, session): + def create_eid(self, session): # pylint: disable=E0202 # lock needed to prevent 'Connection is busy with results for another # command (0)' errors with SQLServer with self._eid_cnx_lock: - return self._create_eid() + return self._create_eid() # pylint: disable=E1102 - def _create_eid(self): + def _create_eid(self): # pylint: disable=E0202 # internal function doing the eid creation without locking. # needed for the recursive handling of disconnections (otherwise we # deadlock on self._eid_cnx_lock @@ -946,13 +946,13 @@ # FIXME: better detection of deconnection pb self.warning("trying to reconnect create eid connection") self._eid_creation_cnx = None - return self._create_eid() + return self._create_eid() # pylint: disable=E1102 except (self.DbapiError,), exc: # We get this one with pyodbc and SQL Server when connection was reset if exc.args[0] == '08S01': self.warning("trying to reconnect create eid connection") self._eid_creation_cnx = None - return self._create_eid() + return self._create_eid() # pylint: disable=E1102 else: raise except Exception: # WTF? diff -r be04706eacc9 -r 9aae456abab5 server/sources/pyrorql.py --- a/server/sources/pyrorql.py Tue Sep 27 16:04:30 2011 +0200 +++ b/server/sources/pyrorql.py Wed Sep 28 09:27:42 2011 +0200 @@ -191,7 +191,7 @@ self.support_entities[ertype] = 'write' in options else: # CWRType if ertype in ('is', 'is_instance_of', 'cw_source') or ertype in VIRTUAL_RTYPES: - msg = schemacfg._cw._('%s relation should not be in mapped') % rtype + msg = schemacfg._cw._('%s relation should not be in mapped') % ertype raise ValidationError(schemacfg.eid, {role_name('cw_for_schema', 'subject'): msg}) options = self._check_options(schemacfg, self.rtype_options) if 'dontcross' in options: diff -r be04706eacc9 -r 9aae456abab5 setup.py --- a/setup.py Tue Sep 27 16:04:30 2011 +0200 +++ b/setup.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,7 +1,7 @@ #!/usr/bin/env python # pylint: disable=W0142,W0403,W0404,W0613,W0622,W0622,W0704,R0904,C0103,E0611 # -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -179,7 +179,7 @@ if USE_SETUPTOOLS: # overwrite MyInstallData to use sys.prefix instead of the egg directory MyInstallMoreData = MyInstallData - class MyInstallData(MyInstallMoreData): + class MyInstallData(MyInstallMoreData): # pylint: disable=E0102 """A class that manages data files installation""" def run(self): _old_install_dir = self.install_dir diff -r be04706eacc9 -r 9aae456abab5 sobjects/notification.py --- a/sobjects/notification.py Tue Sep 27 16:04:30 2011 +0200 +++ b/sobjects/notification.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -109,6 +109,8 @@ url: %(url)s """ + # to be defined on concrete sub-classes + content_attr = None def context(self, **kwargs): entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) diff -r be04706eacc9 -r 9aae456abab5 sobjects/parsers.py --- a/sobjects/parsers.py Tue Sep 27 16:04:30 2011 +0200 +++ b/sobjects/parsers.py Wed Sep 28 09:27:42 2011 +0200 @@ -32,7 +32,7 @@ """ import os.path as osp -from datetime import datetime, timedelta +from datetime import datetime, timedelta, time from urllib import urlencode from cgi import parse_qs # in urlparse with python >= 2.6 @@ -151,7 +151,7 @@ linker.check_options(options, schemacfg.eid) except KeyError: msg = _('"action" must be specified in options; allowed values are ' - '%s') % ', '.join(self.action_methods) + '%s') % ', '.join(self.list_actions()) raise ValidationError(schemacfg.eid, {rn('options', 'subject'): msg}) except RegistryException: msg = _('allowed values for "action" are %s') % ', '.join(self.list_actions()) diff -r be04706eacc9 -r 9aae456abab5 toolsutils.py --- a/toolsutils.py Tue Sep 27 16:04:30 2011 +0200 +++ b/toolsutils.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -36,7 +36,7 @@ from logilab.common.compat import any from logilab.common.shellutils import ASK -from cubicweb import warning +from cubicweb import warning # pylint: disable=E0611 from cubicweb import ConfigurationError, ExecutionError def underline_title(title, car='-'): diff -r be04706eacc9 -r 9aae456abab5 uilib.py --- a/uilib.py Tue Sep 27 16:04:30 2011 +0200 +++ b/uilib.py Wed Sep 28 09:27:42 2011 +0200 @@ -161,94 +161,84 @@ REM_ROOT_HTML_TAGS = re.compile('', re.U) -try: - from lxml import etree, html - from lxml.html import clean, defs +from lxml import etree, html +from lxml.html import clean, defs - ALLOWED_TAGS = (defs.general_block_tags | defs.list_tags | defs.table_tags | - defs.phrase_tags | defs.font_style_tags | - set(('span', 'a', 'br', 'img', 'map', 'area', 'sub', 'sup')) - ) +ALLOWED_TAGS = (defs.general_block_tags | defs.list_tags | defs.table_tags | + defs.phrase_tags | defs.font_style_tags | + set(('span', 'a', 'br', 'img', 'map', 'area', 'sub', 'sup')) + ) - CLEANER = clean.Cleaner(allow_tags=ALLOWED_TAGS, remove_unknown_tags=False, - style=True, safe_attrs_only=True, - add_nofollow=False, - ) +CLEANER = clean.Cleaner(allow_tags=ALLOWED_TAGS, remove_unknown_tags=False, + style=True, safe_attrs_only=True, + add_nofollow=False, + ) - def soup2xhtml(data, encoding): - """tidy html soup by allowing some element tags and return the result - """ - # remove spurious and tags, then normalize line break - # (see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1) - data = REM_ROOT_HTML_TAGS.sub('', u'\n'.join(data.splitlines())) - xmltree = etree.HTML(CLEANER.clean_html('
%s
' % data)) - # NOTE: lxml 2.0 does support encoding='unicode', but last time I (syt) - # tried I got weird results (lxml 2.2.8) - body = etree.tostring(xmltree[0], encoding=encoding) - # remove and and decode to unicode - snippet = body[6:-7].decode(encoding) - # take care to bad xhtml (for instance starting with ) which - # may mess with the
we added below. Only remove it if it's - # still there... - if snippet.startswith('
') and snippet.endswith('
'): - snippet = snippet[5:-6] - return snippet +def soup2xhtml(data, encoding): + """tidy html soup by allowing some element tags and return the result + """ + # remove spurious and tags, then normalize line break + # (see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1) + data = REM_ROOT_HTML_TAGS.sub('', u'\n'.join(data.splitlines())) + xmltree = etree.HTML(CLEANER.clean_html('
%s
' % data)) + # NOTE: lxml 2.0 does support encoding='unicode', but last time I (syt) + # tried I got weird results (lxml 2.2.8) + body = etree.tostring(xmltree[0], encoding=encoding) + # remove and and decode to unicode + snippet = body[6:-7].decode(encoding) + # take care to bad xhtml (for instance starting with
) which + # may mess with the
we added below. Only remove it if it's + # still there... + if snippet.startswith('
') and snippet.endswith('
'): + snippet = snippet[5:-6] + return snippet - # lxml.Cleaner envelops text elements by internal logic (not accessible) - # see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1 - # TODO drop attributes in elements - # TODO add policy configuration (content only, embedded content, ...) - # XXX this is buggy for "

text1

text2

"... - # XXX drop these two snippets action and follow the lxml behaviour - # XXX (tests need to be updated) - # if snippet.startswith('
') and snippet.endswith('
'): - # snippet = snippet[5:-6] - # if snippet.startswith('

') and snippet.endswith('

'): - # snippet = snippet[3:-4] - return snippet.decode(encoding) - -except (ImportError, AttributeError): - # gae environment: lxml not available - # fallback implementation - def soup2xhtml(data, encoding): - # normalize line break - # see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1 - return u'\n'.join(data.splitlines()) -else: - - if hasattr(etree.HTML('
test
'), 'iter'): # XXX still necessary? + # lxml.Cleaner envelops text elements by internal logic (not accessible) + # see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1 + # TODO drop attributes in elements + # TODO add policy configuration (content only, embedded content, ...) + # XXX this is buggy for "

text1

text2

"... + # XXX drop these two snippets action and follow the lxml behaviour + # XXX (tests need to be updated) + # if snippet.startswith('
') and snippet.endswith('
'): + # snippet = snippet[5:-6] + # if snippet.startswith('

') and snippet.endswith('

'): + # snippet = snippet[3:-4] + return snippet.decode(encoding) - def safe_cut(text, length): - """returns an html document of length based on , - and cut is necessary. - """ - if text is None: - return u'' - dom = etree.HTML(text) - curlength = 0 - add_ellipsis = False - for element in dom.iter(): - if curlength >= length: - parent = element.getparent() - parent.remove(element) - if curlength == length and (element.text or element.tail): - add_ellipsis = True - else: - if element.text is not None: - element.text = cut(element.text, length - curlength) - curlength += len(element.text) - if element.tail is not None: - if curlength < length: - element.tail = cut(element.tail, length - curlength) - curlength += len(element.tail) - elif curlength == length: - element.tail = '...' - else: - element.tail = '' - text = etree.tounicode(dom[0])[6:-7] # remove wrapping - if add_ellipsis: - return text + u'...' - return text +if hasattr(etree.HTML('
test
'), 'iter'): # XXX still necessary? + # pylint: disable=E0102 + def safe_cut(text, length): + """returns an html document of length based on , + and cut is necessary. + """ + if text is None: + return u'' + dom = etree.HTML(text) + curlength = 0 + add_ellipsis = False + for element in dom.iter(): + if curlength >= length: + parent = element.getparent() + parent.remove(element) + if curlength == length and (element.text or element.tail): + add_ellipsis = True + else: + if element.text is not None: + element.text = cut(element.text, length - curlength) + curlength += len(element.text) + if element.tail is not None: + if curlength < length: + element.tail = cut(element.tail, length - curlength) + curlength += len(element.tail) + elif curlength == length: + element.tail = '...' + else: + element.tail = '' + text = etree.tounicode(dom[0])[6:-7] # remove wrapping + if add_ellipsis: + return text + u'...' + return text def text_cut(text, nbwords=30, gotoperiod=True): """from the given plain text, return a text with at least words, diff -r be04706eacc9 -r 9aae456abab5 web/action.py --- a/web/action.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/action.py Wed Sep 28 09:27:42 2011 +0200 @@ -133,10 +133,13 @@ & partial_relation_possible(action='add', strict=True)) submenu = 'addrelated' + # to be defined in concrete classes + target_etype = rtype = None def url(self): try: - ttype = self.etype # deprecated in 3.6, already warned by the selector + # deprecated in 3.6, already warned by the selector + ttype = self.etype # pylint: disable=E1101 except AttributeError: ttype = self.target_etype entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) diff -r be04706eacc9 -r 9aae456abab5 web/box.py --- a/web/box.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/box.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -118,7 +118,8 @@ related to the current result set. """ - rql = None + # to be defined in concrete classes + rql = title = None def to_display_rql(self): assert self.rql is not None, self.__regid__ @@ -168,7 +169,7 @@ subclasses should define at least id, rtype and target class attributes. """ - + rtype = None def cell_call(self, row, col, view=None, **kwargs): self._cw.add_js('cubicweb.ajax.js') entity = self.cw_rset.get_entity(row, col) diff -r be04706eacc9 -r 9aae456abab5 web/component.py --- a/web/component.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/component.py Wed Sep 28 09:27:42 2011 +0200 @@ -321,7 +321,7 @@ def wview(__vid, rset=None, __fallback_vid=None, **kwargs): self._cw.view(__vid, rset, __fallback_vid, w=self.w, **kwargs) self.wview = wview - self.call(**kwargs) + self.call(**kwargs) # pylint: disable=E1101 return getlayout = self._cw.vreg['components'].select layout = getlayout('layout', self._cw, **self.layout_select_args()) @@ -539,6 +539,9 @@ subclasses should define at least id, rtype and target class attributes. """ + # to be defined in concrete classes + rtype = None + def render_title(self, w): w(display_name(self._cw, self.rtype, role(self), context=self.entity.__regid__)) @@ -566,7 +569,9 @@ added_msg = None removed_msg = None - # class attributes below *must* be set in concret classes (additionaly to + # to be defined in concrete classes + rtype = role = target_etype = None + # class attributes below *must* be set in concrete classes (additionaly to # rtype / role [/ target_etype]. They should correspond to js_* methods on # the json controller @@ -706,6 +711,8 @@ __select__ = EntityVComponent.__select__ & partial_has_related_entities() vid = 'list' + # to be defined in concrete classes + rtype = title = None def rql(self): """override this method if you want to use a custom rql query""" diff -r be04706eacc9 -r 9aae456abab5 web/controller.py --- a/web/controller.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/controller.py Wed Sep 28 09:27:42 2011 +0200 @@ -114,7 +114,7 @@ [recipient], body, subject) if not self._cw.vreg.config.sendmails([(msg, [recipient])]): msg = self._cw._('could not connect to the SMTP server') - url = self._cw.build_url(__message=msgid) + url = self._cw.build_url(__message=msg) raise Redirect(url) def reset(self): diff -r be04706eacc9 -r 9aae456abab5 web/facet.py --- a/web/facet.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/facet.py Wed Sep 28 09:27:42 2011 +0200 @@ -82,9 +82,9 @@ @deprecated('[3.13] filter_hiddens moved to cubicweb.web.views.facets with ' 'slightly modified prototype') -def filter_hiddens(w, **kwargs): +def filter_hiddens(w, baserql, **kwargs): from cubicweb.web.views.facets import filter_hiddens - return filter_hiddens(w, wdgs=kwargs.pop('facets')) + return filter_hiddens(w, baserql, wdgs=kwargs.pop('facets'), **kwargs) ## rqlst manipulation functions used by facets ################################ @@ -502,7 +502,7 @@ class RelationFacet(VocabularyFacet): """Base facet to filter some entities according to other entities to which - they are related. Create concret facet by inheriting from this class an then + they are related. Create concrete facet by inheriting from this class an then configuring it by setting class attribute described below. The relation is defined by the `rtype` and `role` attributes. @@ -751,7 +751,7 @@ restrvar, rtrel = _make_relation(self.select, self.filtered_variable, self.rtype, self.role) if rel is None: - select.add_restriction(rtrel) + self.select.add_restriction(rtrel) else: rel.parent.replace(rel, nodes.And(rel, rtrel)) self._and_restriction(rel, restrvar, value.pop()) diff -r be04706eacc9 -r 9aae456abab5 web/formfields.py --- a/web/formfields.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/formfields.py Wed Sep 28 09:27:42 2011 +0200 @@ -28,7 +28,7 @@ .. autoclass:: cubicweb.web.formfields.Field -Now, you usually don't use that class but one of the concret field classes +Now, you usually don't use that class but one of the concrete field classes described below, according to what you want to edit. Basic fields @@ -107,7 +107,7 @@ class Field(object): """This class is the abstract base class for all fields. It hold a bunch of attributes which may be used for fine control of the behaviour of a - concret field. + concrete field. **Attributes** @@ -349,6 +349,7 @@ def initial_typed_value(self, form, load_bytes): if self.value is not _MARKER: if callable(self.value): + # pylint: disable=E1102 if support_args(self.value, 'form', 'field'): return self.value(form, self) else: @@ -389,6 +390,7 @@ """ assert self.choices is not None if callable(self.choices): + # pylint: disable=E1102 if getattr(self.choices, 'im_self', None) is self: vocab = self.choices(form=form, **kwargs) elif support_args(self.choices, 'form', 'field'): @@ -396,11 +398,11 @@ else: try: vocab = self.choices(form=form, **kwargs) - warn('[3.6] %s: choices should now take ' + warn('[3.6] %s: choices should now take ' 'the form and field as named arguments' % self, DeprecationWarning) except TypeError: - warn('[3.3] %s: choices should now take ' + warn('[3.3] %s: choices should now take ' 'the form and field as named arguments' % self, DeprecationWarning) vocab = self.choices(req=form._cw, **kwargs) diff -r be04706eacc9 -r 9aae456abab5 web/formwidgets.py --- a/web/formwidgets.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/formwidgets.py Wed Sep 28 09:27:42 2011 +0200 @@ -110,8 +110,8 @@ **Attributes** - Here are standard attributes of a widget, that may be set on concret - class to override default behaviours: + Here are standard attributes of a widget, that may be set on concrete class + to override default behaviours: :attr:`needs_js` list of javascript files needed by the widget. @@ -134,7 +134,7 @@ Also, widget instances takes as first argument a `attrs` dictionary which will be stored in the attribute of the same name. It contains HTML - attributes that should be set in the widget's input tag (though concret + attributes that should be set in the widget's input tag (though concrete classes may ignore it). .. currentmodule:: cubicweb.web.formwidgets @@ -190,7 +190,7 @@ return self._render(form, field, renderer) def _render(self, form, field, renderer): - """This is the method you have to implement in concret widget classes. + """This is the method you have to implement in concrete widget classes. """ raise NotImplementedError() @@ -232,7 +232,7 @@ correctly typed value. 3 and 4 are handle by the :meth:`typed_value` method to ease reuse in - concret classes. + concrete classes. """ values = None if not field.ignore_req_params: diff -r be04706eacc9 -r 9aae456abab5 web/request.py --- a/web/request.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/request.py Wed Sep 28 09:27:42 2011 +0200 @@ -19,10 +19,10 @@ __docformat__ = "restructuredtext en" -import hashlib import time import random import base64 +from hashlib import sha1 # pylint: disable=E0611 from Cookie import SimpleCookie from calendar import timegm from datetime import date @@ -49,7 +49,7 @@ _MARKER = object() def build_cb_uid(seed): - sha = hashlib.sha1('%s%s%s' % (time.time(), seed, random.random())) + sha = sha1('%s%s%s' % (time.time(), seed, random.random())) return 'cb_%s' % (sha.hexdigest()) diff -r be04706eacc9 -r 9aae456abab5 web/test/unittest_formfields.py --- a/web/test/unittest_formfields.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/test/unittest_formfields.py Wed Sep 28 09:27:42 2011 +0200 @@ -144,6 +144,17 @@ self.assertEqual(description_format_field.value(form), 'text/rest') + def test_property_key_field(self): + from cubicweb.web.views.cwproperties import PropertyKeyField + req = self.request() + field = PropertyKeyField() + e = self.vreg['etypes'].etype_class('CWProperty')(req) + renderer = self.vreg['formrenderers'].select('base', req) + form = EntityFieldsForm(req, entity=e) + form.formvalues = {} + field.render(form, renderer) + + class UtilsTC(TestCase): def test_vocab_sort(self): self.assertEqual(vocab_sort([('Z', 1), ('A', 2), diff -r be04706eacc9 -r 9aae456abab5 web/views/ajaxedit.py --- a/web/views/ajaxedit.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/ajaxedit.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -70,7 +70,7 @@ if getattr(self, 'etype', None): rset = entity.unrelated(self.rtype, self.etype, role(self), ordermethod='fetch_order') - self.pagination(self._cw, rset, w=self.w) + self.paginate(self._cw, rset=rset, w=self.w) return rset.entities() super(AddRelationView, self).unrelated_entities(self) diff -r be04706eacc9 -r 9aae456abab5 web/views/autoform.py --- a/web/views/autoform.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/autoform.py Wed Sep 28 09:27:42 2011 +0200 @@ -198,6 +198,9 @@ _select_attrs = ('peid', 'rtype', 'role', 'pform', 'etype') removejs = "removeInlinedEntity('%s', '%s', '%s')" + # make pylint happy + peid = rtype = role = pform = etype = None + def __init__(self, *args, **kwargs): for attr in self._select_attrs: # don't pop attributes from kwargs, so the end-up in @@ -304,6 +307,9 @@ & specified_etype_implements('Any')) _select_attrs = InlineEntityEditionFormView._select_attrs + ('petype',) + # make pylint happy + petype = None + @property def removejs(self): entity = self._entity() @@ -345,6 +351,7 @@ & specified_etype_implements('Any')) _select_attrs = InlineEntityCreationFormView._select_attrs + ('card',) + card = None # make pylint happy form = None # no actual form wrapped def call(self, i18nctx, **kwargs): @@ -752,6 +759,7 @@ def _generic_relations_field(self): try: + # pylint: disable=E1101 srels_by_cat = self.srelations_by_category('generic', 'add', strict=True) warn('[3.6] %s: srelations_by_category is deprecated, use uicfg or ' 'override editable_relations instead' % classid(self), diff -r be04706eacc9 -r 9aae456abab5 web/views/basetemplates.py --- a/web/views/basetemplates.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/basetemplates.py Wed Sep 28 09:27:42 2011 +0200 @@ -56,6 +56,9 @@ self.wview('htmlheader', rset=self.cw_rset) w(u'%s\n' % xml_escape(page_title)) + def content(self): + raise NotImplementedError() + class LogInTemplate(LogInOutTemplate): __regid__ = 'login' diff -r be04706eacc9 -r 9aae456abab5 web/views/cwproperties.py --- a/web/views/cwproperties.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/cwproperties.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -302,6 +302,7 @@ def render(self, form, renderer): wdg = self.get_widget(form) + # pylint: disable=E1101 wdg.attrs['tabindex'] = form._cw.next_tabindex() wdg.attrs['onchange'] = "javascript:setPropValueWidget('%s', %s)" % ( form.edited_entity.eid, form._cw.next_tabindex()) @@ -337,7 +338,7 @@ try: pdef = form._cw.vreg.property_info(entity.pkey) except UnknownProperty, ex: - self.warning('%s (you should probably delete that property ' + form.warning('%s (you should probably delete that property ' 'from the database)', ex) msg = form._cw._('you should probably delete that property') self.widget = NotEditableWidget(entity.printable_value('value'), diff -r be04706eacc9 -r 9aae456abab5 web/views/cwuser.py --- a/web/views/cwuser.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/cwuser.py Wed Sep 28 09:27:42 2011 +0200 @@ -20,7 +20,7 @@ __docformat__ = "restructuredtext en" _ = unicode -import hashlib +from hashlib import sha1 # pylint: disable=E0611 from logilab.mtconverter import xml_escape @@ -86,7 +86,7 @@ emailaddr = entity.cw_adapt_to('IEmailable').get_email() if emailaddr: self.w(u'%s\n' - % hashlib.sha1(emailaddr.encode('utf-8')).hexdigest()) + % sha1(emailaddr.encode('utf-8')).hexdigest()) self.w(u'\n') diff -r be04706eacc9 -r 9aae456abab5 web/views/idownloadable.py --- a/web/views/idownloadable.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/idownloadable.py Wed Sep 28 09:27:42 2011 +0200 @@ -194,7 +194,7 @@ def cell_call(self, row, col, link=False, **kwargs): entity = self.cw_rset.get_entity(row, col) adapter = entity.cw_adapt_to('IDownloadable') - tag = self._embedding_tag(src=adapter.download_url(), + tag = self._embedding_tag(src=adapter.download_url(), # pylint: disable=E1102 alt=(self._cw._('download %s') % adapter.download_file_name()), **kwargs) if link: diff -r be04706eacc9 -r 9aae456abab5 web/views/plots.py --- a/web/views/plots.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/plots.py Wed Sep 28 09:27:42 2011 +0200 @@ -79,6 +79,9 @@ if w is None: return self._stream.getvalue() + def _render(self, *args, **kwargs): + raise NotImplementedError + class FlotPlotWidget(PlotWidget): """PlotRenderer widget using Flot""" onload = u""" diff -r be04706eacc9 -r 9aae456abab5 web/views/primary.py --- a/web/views/primary.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/primary.py Wed Sep 28 09:27:42 2011 +0200 @@ -130,7 +130,8 @@ if hasattr(self, 'render_entity_summary'): warn('[3.10] render_entity_summary method is deprecated (%s)' % self, DeprecationWarning) - self.render_entity_summary(entity) + self.render_entity_summary(entity) # pylint: disable=E1101 + summary = self.summary(entity) if summary: warn('[3.10] summary method is deprecated (%s)' % self, @@ -149,7 +150,7 @@ self.w(u'
') if hasattr(self, 'render_side_related'): warn('[3.2] render_side_related is deprecated') - self.render_side_related(entity, []) + self.render_side_related(entity, []) # pylint: disable=E1101 self.render_side_boxes(boxes) self.w(u'
') self.w(u'') @@ -217,20 +218,21 @@ if display_attributes: self.w(u'') for rschema, role, dispctrl, value in display_attributes: + # pylint: disable=E1101 if not hasattr(self, '_render_attribute'): label = self._rel_label(entity, rschema, role, dispctrl) self.render_attribute(label, value, table=True) elif support_args(self._render_attribute, 'dispctrl'): warn('[3.9] _render_attribute prototype has changed and ' 'renamed to render_attribute, please update %s' - % self.__class___, DeprecationWarning) + % self.__class__, DeprecationWarning) self._render_attribute(dispctrl, rschema, value, role=role, table=True) else: self._render_attribute(rschema, value, role=role, table=True) warn('[3.6] _render_attribute prototype has changed and ' 'renamed to render_attribute, please update %s' - % self.__class___, DeprecationWarning) + % self.__class__, DeprecationWarning) self.w(u'
') def render_attribute(self, label, value, table=False): @@ -255,6 +257,7 @@ if not rset: continue if hasattr(self, '_render_relation'): + # pylint: disable=E1101 if not support_args(self._render_relation, 'showlabel'): self._render_relation(dispctrl, rset, 'autolimited') warn('[3.9] _render_relation prototype has changed and has ' @@ -431,7 +434,7 @@ __regid__ = 'attribute' __select__ = EntityView.__select__ & match_kwargs('rtype') - def entity_call(self, entity, rtype, **kwargs): + def entity_call(self, entity, rtype, role, **kwargs): if self._cw.vreg.schema.rschema(rtype).final: self.w(entity.printable_value(rtype)) else: diff -r be04706eacc9 -r 9aae456abab5 web/views/reledit.py --- a/web/views/reledit.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/reledit.py Wed Sep 28 09:27:42 2011 +0200 @@ -106,13 +106,15 @@ def _handle_attribute(self, rschema, role, divid, reload, action): rvid = self._rules.get('rvid', None) if rvid is not None: - value = self._cw.view(rvid, entity=self.entity, rtype=rschema.type) + value = self._cw.view(rvid, entity=self.entity, + rtype=rschema.type, role=role) else: value = self.entity.printable_value(rschema.type) if not self._should_edit_attribute(rschema): self.w(value) return - form, renderer = self._build_form(self.entity, rschema, role, divid, 'base', reload, action) + form, renderer = self._build_form(self.entity, rschema, role, divid, + 'base', reload, action) value = value or self._compute_default_value(rschema, role) self.view_form(divid, value, form, renderer) diff -r be04706eacc9 -r 9aae456abab5 web/views/tabs.py --- a/web/views/tabs.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/tabs.py Wed Sep 28 09:27:42 2011 +0200 @@ -190,6 +190,8 @@ """ __select__ = EntityView.__select__ & partial_has_related_entities() vid = 'list' + # to be defined in concrete classes + rtype = title = None def cell_call(self, row, col): rset = self.cw_rset.get_entity(row, col).related(self.rtype, role(self)) diff -r be04706eacc9 -r 9aae456abab5 web/views/treeview.py --- a/web/views/treeview.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/treeview.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. diff -r be04706eacc9 -r 9aae456abab5 web/views/workflow.py --- a/web/views/workflow.py Tue Sep 27 16:04:30 2011 +0200 +++ b/web/views/workflow.py Wed Sep 28 09:27:42 2011 +0200 @@ -174,6 +174,7 @@ warn('[3.10] %s should now implement render_body instead of cell_call' % self.__class__, DeprecationWarning) self.w = w + # pylint: disable=E1101 self.cell_call(self.entity.cw_row, self.entity.cw_col) else: self.entity.view('wfhistory', w=w, title=None) diff -r be04706eacc9 -r 9aae456abab5 wsgi/request.py --- a/wsgi/request.py Tue Sep 27 16:04:30 2011 +0200 +++ b/wsgi/request.py Wed Sep 28 09:27:42 2011 +0200 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb.