Improve PEP8 gluon/tools.py

This commit is contained in:
Richard Vézina
2015-03-31 13:56:21 -04:00
parent f9c755bc18
commit e4ef75c550
+128 -160
View File
@@ -287,29 +287,28 @@ class Mail(object):
self.result = {} self.result = {}
self.error = None self.error = None
def send( def send(self,
self,
to, to,
subject = '[no subject]', subject='[no subject]',
message = '[no message]', message='[no message]',
attachments = None, attachments=None,
cc = None, cc=None,
bcc = None, bcc=None,
reply_to = None, reply_to=None,
sender = None, sender=None,
encoding = 'utf-8', encoding='utf-8',
raw = False, raw=False,
headers = {}, headers={},
from_address = None, from_address=None,
cipher_type = None, cipher_type=None,
sign = None, sign=None,
sign_passphrase = None, sign_passphrase=None,
encrypt = None, encrypt=None,
x509_sign_keyfile = None, x509_sign_keyfile=None,
x509_sign_chainfile = None, x509_sign_chainfile=None,
x509_sign_certfile = None, x509_sign_certfile=None,
x509_crypt_certfiles = None, x509_crypt_certfiles=None,
x509_nocerts = None x509_nocerts=None
): ):
""" """
Sends an email using data specified in constructor Sends an email using data specified in constructor
@@ -664,7 +663,7 @@ class Mail(object):
# SIGN # SIGN
if sign: if sign:
#key for signing # key for signing
try: try:
keyfile_bio = BIO.openfile(x509_sign_keyfile)\ keyfile_bio = BIO.openfile(x509_sign_keyfile)\
if os.path.isfile(x509_sign_keyfile)\ if os.path.isfile(x509_sign_keyfile)\
@@ -796,7 +795,7 @@ class Mail(object):
subject=subject, body=text, **xcc) subject=subject, body=text, **xcc)
else: else:
smtp_args = self.settings.server.split(':') smtp_args = self.settings.server.split(':')
kwargs = dict(timeout = self.settings.timeout) kwargs = dict(timeout=self.settings.timeout)
if self.settings.ssl: if self.settings.ssl:
server = smtplib.SMTP_SSL(*smtp_args, **kwargs) server = smtplib.SMTP_SSL(*smtp_args, **kwargs)
else: else:
@@ -839,8 +838,7 @@ class Recaptcha(DIV):
API_SERVER = 'http://www.google.com/recaptcha/api' API_SERVER = 'http://www.google.com/recaptcha/api'
VERIFY_SERVER = 'http://www.google.com/recaptcha/api/verify' VERIFY_SERVER = 'http://www.google.com/recaptcha/api/verify'
def __init__( def __init__(self,
self,
request=None, request=None,
public_key='', public_key='',
private_key='', private_key='',
@@ -849,7 +847,7 @@ class Recaptcha(DIV):
error_message='invalid', error_message='invalid',
label='Verify:', label='Verify:',
options='', options='',
comment = '', comment='',
ajax=False ajax=False
): ):
request = request or current.request request = request or current.request
@@ -942,7 +940,7 @@ class Recaptcha(DIV):
jQuery.getScript('%(url)s',function() { jQuery.getScript('%(url)s',function() {
Recaptcha.create('%(public_key)s', Recaptcha.create('%(public_key)s',
'recaptcha',jQuery.extend(RecaptchaOptions,{'callback':Recaptcha.focus_response_field})) 'recaptcha',jQuery.extend(RecaptchaOptions,{'callback':Recaptcha.focus_response_field}))
}) """ % ({'options':RecaptchaOptions,'url':url_recaptcha_js,'public_key':public_key}) }) """ % ({'options': RecaptchaOptions, 'url': url_recaptcha_js, 'public_key': public_key})
captcha = DIV( captcha = DIV(
SCRIPT( SCRIPT(
script, script,
@@ -963,6 +961,7 @@ class Recaptcha(DIV):
captcha.append(DIV(self.errors['captcha'], _class='error')) captcha.append(DIV(self.errors['captcha'], _class='error'))
return XML(captcha).xml() return XML(captcha).xml()
# this should only be used for catcha and perhaps not even for that # this should only be used for catcha and perhaps not even for that
def addrow(form, a, b, c, style, _id, position=-1): def addrow(form, a, b, c, style, _id, position=-1):
if style == "divs": if style == "divs":
@@ -1050,14 +1049,14 @@ class Auth(object):
profile_fields=None, profile_fields=None,
email_case_sensitive=True, email_case_sensitive=True,
username_case_sensitive=True, username_case_sensitive=True,
update_fields = ['email'], update_fields=['email'],
ondelete="CASCADE", ondelete="CASCADE",
client_side = True, client_side=True,
renew_session_onlogin=True, renew_session_onlogin=True,
renew_session_onlogout=True, renew_session_onlogout=True,
keep_session_onlogin=True, keep_session_onlogin=True,
keep_session_onlogout=False, keep_session_onlogout=False,
wiki = Settings(), wiki=Settings(),
) )
# ## these are messages that can be customized # ## these are messages that can be customized
default_messages = dict( default_messages = dict(
@@ -1099,8 +1098,7 @@ class Auth(object):
retrieve_username_subject='Username retrieve', retrieve_username_subject='Username retrieve',
retrieve_password='Your password is: %(password)s', retrieve_password='Your password is: %(password)s',
retrieve_password_subject='Password retrieve', retrieve_password_subject='Password retrieve',
reset_password= reset_password='Click on the link %(link)s to reset your password',
'Click on the link %(link)s to reset your password',
reset_password_subject='Password reset', reset_password_subject='Password reset',
invalid_reset_password='Invalid reset password', invalid_reset_password='Invalid reset password',
profile_updated='Profile updated', profile_updated='Profile updated',
@@ -1263,7 +1261,7 @@ class Auth(object):
f=f, args=args, vars=vars, scheme=scheme) f=f, args=args, vars=vars, scheme=scheme)
def here(self): def here(self):
return URL(args=current.request.args,vars=current.request.get_vars) return URL(args=current.request.args, vars=current.request.get_vars)
def __init__(self, environment=None, db=None, mailer=True, def __init__(self, environment=None, db=None, mailer=True,
hmac_key=None, controller='default', function='user', hmac_key=None, controller='default', function='user',
@@ -1365,7 +1363,8 @@ class Auth(object):
# ## these are messages that can be customized # ## these are messages that can be customized
messages = self.messages = Messages(current.T) messages = self.messages = Messages(current.T)
messages.update(Auth.default_messages) messages.update(Auth.default_messages)
messages.update(ajax_failed_authentication=DIV(H4('NOT AUTHORIZED'), messages.update(ajax_failed_authentication=
DIV(H4('NOT AUTHORIZED'),
'Please ', 'Please ',
A('login', A('login',
_href=self.settings.login_url + _href=self.settings.login_url +
@@ -1392,7 +1391,7 @@ class Auth(object):
return next return next
def _get_user_id(self): def _get_user_id(self):
"accessor for auth.user_id" """accessor for auth.user_id"""
return self.user and self.user.id or None return self.user and self.user.id or None
user_id = property(_get_user_id, doc="user.id or None") user_id = property(_get_user_id, doc="user.id or None")
@@ -1545,10 +1544,10 @@ class Auth(object):
self.bar[0][3].append((item['name'], False, item['href'])) self.bar[0][3].append((item['name'], False, item['href']))
def bootstrap3(): # Default web2py scaffolding def bootstrap3(): # Default web2py scaffolding
def rename(icon): return icon+' '+icon.replace('icon','glyphicon') def rename(icon): return icon+' '+icon.replace('icon', 'glyphicon')
self.bar = UL(LI(Anr(I(_class=rename('icon '+items[0]['icon'])), self.bar = UL(LI(Anr(I(_class=rename('icon '+items[0]['icon'])),
' ' + items[0]['name'], ' ' + items[0]['name'],
_href=items[0]['href'])),_class='dropdown-menu') _href=items[0]['href'])), _class='dropdown-menu')
del items[0] del items[0]
for item in items: for item in items:
self.bar.insert(-1, LI(Anr(I(_class=rename('icon '+item['icon'])), self.bar.insert(-1, LI(Anr(I(_class=rename('icon '+item['icon'])),
@@ -1557,13 +1556,13 @@ class Auth(object):
self.bar.insert(-1, LI('', _class='divider')) self.bar.insert(-1, LI('', _class='divider'))
if self.user_id: if self.user_id:
self.bar = LI(Anr(prefix, user_identifier, self.bar = LI(Anr(prefix, user_identifier,
_href='#',_class="dropdown-toggle", _href='#', _class="dropdown-toggle",
data={'toggle':'dropdown'}), data={'toggle': 'dropdown'}),
self.bar,_class='dropdown') self.bar, _class='dropdown')
else: else:
self.bar = LI(Anr(T('Log In'), self.bar = LI(Anr(T('Log In'),
_href='#',_class="dropdown-toggle", _href='#', _class="dropdown-toggle",
data={'toggle':'dropdown'}), self.bar, data={'toggle': 'dropdown'}), self.bar,
_class='dropdown') _class='dropdown')
def bare(): def bare():
@@ -1714,7 +1713,7 @@ class Auth(object):
""" """
current_record_label = current_record_label or current.T( current_record_label = current_record_label or current.T(
current_record.replace('_',' ').title()) current_record.replace('_', ' ').title())
for table in tables: for table in tables:
fieldnames = table.fields() fieldnames = table.fields()
if ('id' in fieldnames and if ('id' in fieldnames and
@@ -1787,8 +1786,10 @@ class Auth(object):
""" """
db = self.db db = self.db
if migrate is None: migrate = db._migrate if migrate is None:
if fake_migrate is None: fake_migrate = db._fake_migrate migrate = db._migrate
if fake_migrate is None:
fake_migrate = db._fake_migrate
settings = self.settings settings = self.settings
if username is None: if username is None:
username = settings.use_username username = settings.use_username
@@ -1895,8 +1896,7 @@ class Auth(object):
settings.table_group_name, settings.table_group_name,
Field('role', length=512, default='', Field('role', length=512, default='',
label=self.messages.label_role, label=self.messages.label_role,
requires=IS_NOT_IN_DB( requires=IS_NOT_IN_DB(db, '%s.role' % settings.table_group_name)),
db, '%s.role' % settings.table_group_name)),
Field('description', 'text', Field('description', 'text',
label=self.messages.label_description), label=self.messages.label_description),
*extra_fields, *extra_fields,
@@ -2116,8 +2116,7 @@ class Auth(object):
basic_realm = unicode(basic_auth_realm) basic_realm = unicode(basic_auth_realm)
elif basic_auth_realm is True: elif basic_auth_realm is True:
basic_realm = u'' + current.request.application basic_realm = u'' + current.request.application
http_401 = HTTP(401, u'Not Authorized', http_401 = HTTP(401, u'Not Authorized', **{'WWW-Authenticate': u'Basic realm="' + basic_realm + '"'})
**{'WWW-Authenticate': u'Basic realm="' + basic_realm + '"'})
if not basic or not basic[:6].lower() == 'basic ': if not basic or not basic[:6].lower() == 'basic ':
if basic_auth_realm: if basic_auth_realm:
raise http_401 raise http_401
@@ -2135,16 +2134,15 @@ class Auth(object):
from gluon.settings import global_settings from gluon.settings import global_settings
if global_settings.web2py_runtime_gae: if global_settings.web2py_runtime_gae:
user = Row(self.table_user()._filter_fields(user, id=True)) user = Row(self.table_user()._filter_fields(user, id=True))
delattr(user,'password') delattr(user, 'password')
else: else:
user = Row(user) user = Row(user)
for key, value in user.items(): for key, value in user.items():
if callable(value) or key=='password': if callable(value) or key == 'password':
delattr(user,key) delattr(user, key)
if self.settings.renew_session_onlogin: if self.settings.renew_session_onlogin:
current.session.renew(clear_session=not self.settings.keep_session_onlogin) current.session.renew(clear_session=not self.settings.keep_session_onlogin)
current.session.auth = Storage( current.session.auth = Storage(user=user,
user = user,
last_visit=current.request.now, last_visit=current.request.now,
expiration=self.settings.expiration, expiration=self.settings.expiration,
hmac_key=web2py_uuid()) hmac_key=web2py_uuid())
@@ -2178,8 +2176,7 @@ class Auth(object):
else: else:
# user not in database try other login methods # user not in database try other login methods
for login_method in self.settings.login_methods: for login_method in self.settings.login_methods:
if login_method != self and \ if login_method != self and login_method(username, password):
login_method(username, password):
self.user = username self.user = username
return username return username
return False return False
@@ -2196,20 +2193,14 @@ class Auth(object):
elif not fields.get(settings.userfield): elif not fields.get(settings.userfield):
raise ValueError("register_bare: " + raise ValueError("register_bare: " +
"userfield not provided or invalid") "userfield not provided or invalid")
fields[settings.passfield] = \ fields[settings.passfield] = settings.table_user[settings.passfield].validate(fields[settings.passfield])[0]
settings.table_user[settings.passfield].validate( user = self.get_or_create_user(fields, login=False, get=False, update_fields=self.settings.update_fields)
fields[settings.passfield])[0]
user = self.get_or_create_user(
fields, login=False, get=False,
update_fields=self.settings.update_fields)
if not user: if not user:
# get or create did not create a user (it ignores duplicate records) # get or create did not create a user (it ignores duplicate records)
return False return False
return user return user
def cas_login(self,
def cas_login(
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -2303,18 +2294,17 @@ class Auth(object):
raise HTTP(200, message) raise HTTP(200, message)
def _reset_two_factor_auth(self, session): def _reset_two_factor_auth(self, session):
'''When two-step authentication is enabled, this function is used to """When two-step authentication is enabled, this function is used to
clear the session after successfully completing second challenge clear the session after successfully completing second challenge
or when the maximum number of tries allowed has expired. or when the maximum number of tries allowed has expired.
''' """
session.auth_two_factor_user = None session.auth_two_factor_user = None
session.auth_two_factor = None session.auth_two_factor = None
session.auth_two_factor_enabled = False session.auth_two_factor_enabled = False
# Allow up to 4 attempts (the 1st one plus 3 more) # Allow up to 4 attempts (the 1st one plus 3 more)
session.auth_two_factor_tries_left = 3 session.auth_two_factor_tries_left = 3
def login( def login(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -2424,7 +2414,7 @@ class Auth(object):
if settings.remember_me_form: if settings.remember_me_form:
extra_fields = [ extra_fields = [
Field('remember_me','boolean',default=False, Field('remember_me', 'boolean', default=False,
label = self.messages.label_remember_me)] label = self.messages.label_remember_me)]
else: else:
extra_fields = [] extra_fields = []
@@ -2549,7 +2539,7 @@ class Auth(object):
# auth.settings.two_factor_authentication_group # auth.settings.two_factor_authentication_group
if user and self.settings.two_factor_authentication_group: if user and self.settings.two_factor_authentication_group:
role = self.settings.two_factor_authentication_group role = self.settings.two_factor_authentication_group
session.auth_two_factor_enabled = self.has_membership(user_id=user.id,role=role) session.auth_two_factor_enabled = self.has_membership(user_id=user.id, role=role)
# challenge # challenge
if session.auth_two_factor_enabled: if session.auth_two_factor_enabled:
form = SQLFORM.factory( form = SQLFORM.factory(
@@ -2673,8 +2663,7 @@ class Auth(object):
if not next is None: if not next is None:
redirect(next) redirect(next)
def register( def register(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -2728,7 +2717,7 @@ class Auth(object):
if self.settings.register_verify_password: if self.settings.register_verify_password:
extra_fields = [ extra_fields = [
Field("password_two", "password", requires=IS_EQUAL_TO( Field("password_two", "password", requires=IS_EQUAL_TO(
request.post_vars.get(passfield,None), request.post_vars.get(passfield, None),
error_message=self.messages.mismatched_password), error_message=self.messages.mismatched_password),
label=current.T("Confirm Password"))] label=current.T("Confirm Password"))]
else: else:
@@ -2772,7 +2761,7 @@ class Auth(object):
link = self.url( link = self.url(
self.settings.function, args=('verify_email', key), scheme=True) self.settings.function, args=('verify_email', key), scheme=True)
d = dict(form.vars) d = dict(form.vars)
d.update(dict(key=key, link=link,username=form.vars[username])) d.update(dict(key=key, link=link, username=form.vars[username]))
if not (self.settings.mailer and self.settings.mailer.send( if not (self.settings.mailer and self.settings.mailer.send(
to=form.vars.email, to=form.vars.email,
subject=self.messages.verify_email_subject, subject=self.messages.verify_email_subject,
@@ -2813,8 +2802,7 @@ class Auth(object):
return True return True
return False return False
def verify_email( def verify_email(self,
self,
next=DEFAULT, next=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
log=DEFAULT, log=DEFAULT,
@@ -2847,8 +2835,7 @@ class Auth(object):
callback(onaccept, user) callback(onaccept, user)
redirect(next) redirect(next)
def retrieve_username( def retrieve_username(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -2905,8 +2892,7 @@ class Auth(object):
username = ', '.join(u.username for u in users) username = ', '.join(u.username for u in users)
self.settings.mailer.send(to=form.vars.email, self.settings.mailer.send(to=form.vars.email,
subject=self.messages.retrieve_username_subject, subject=self.messages.retrieve_username_subject,
message=self.messages.retrieve_username message=self.messages.retrieve_username % dict(username=username))
% dict(username=username))
session.flash = self.messages.email_sent session.flash = self.messages.email_sent
for user in users: for user in users:
self.log_event(log, user) self.log_event(log, user)
@@ -2931,8 +2917,7 @@ class Auth(object):
password += random.choice(specials) password += random.choice(specials)
return ''.join(random.sample(password, len(password))) return ''.join(random.sample(password, len(password)))
def reset_password_deprecated( def reset_password_deprecated(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -2991,8 +2976,7 @@ class Auth(object):
if self.settings.mailer and \ if self.settings.mailer and \
self.settings.mailer.send(to=form.vars.email, self.settings.mailer.send(to=form.vars.email,
subject=self.messages.retrieve_password_subject, subject=self.messages.retrieve_password_subject,
message=self.messages.retrieve_password message=self.messages.retrieve_password % dict(password=password)):
% dict(password=password)):
session.flash = self.messages.email_sent session.flash = self.messages.email_sent
else: else:
session.flash = self.messages.unable_to_send_email session.flash = self.messages.unable_to_send_email
@@ -3006,8 +2990,7 @@ class Auth(object):
table_user.email.requires = old_requires table_user.email.requires = old_requires
return form return form
def reset_password( def reset_password(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -3071,8 +3054,7 @@ class Auth(object):
redirect(next, client_side=self.settings.client_side) redirect(next, client_side=self.settings.client_side)
return form return form
def request_reset_password( def request_reset_password(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -3101,7 +3083,7 @@ class Auth(object):
log = self.messages['reset_password_log'] log = self.messages['reset_password_log']
userfield = self.settings.login_userfield or 'username' \ userfield = self.settings.login_userfield or 'username' \
if 'username' in table_user.fields else 'email' if 'username' in table_user.fields else 'email'
if userfield=='email': if userfield == 'email':
table_user.email.requires = [ table_user.email.requires = [
IS_EMAIL(error_message=self.messages.invalid_email), IS_EMAIL(error_message=self.messages.invalid_email),
IS_IN_DB(self.db, table_user.email, IS_IN_DB(self.db, table_user.email,
@@ -3169,8 +3151,7 @@ class Auth(object):
return True return True
return False return False
def retrieve_password( def retrieve_password(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -3181,8 +3162,7 @@ class Auth(object):
else: else:
return self.reset_password_deprecated(next, onvalidation, onaccept, log) return self.reset_password_deprecated(next, onvalidation, onaccept, log)
def change_password( def change_password(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -3211,9 +3191,9 @@ class Auth(object):
log = self.messages['change_password_log'] log = self.messages['change_password_log']
passfield = self.settings.password_field passfield = self.settings.password_field
requires = table_user[passfield].requires requires = table_user[passfield].requires
if not isinstance(requires,(list, tuple)): if not isinstance(requires, (list, tuple)):
requires = [requires] requires = [requires]
requires = filter(lambda t:isinstance(t,CRYPT), requires) requires = filter(lambda t: isinstance(t, CRYPT), requires)
if requires: if requires:
requires[0].min_length = 0 requires[0].min_length = 0
form = SQLFORM.factory( form = SQLFORM.factory(
@@ -3237,7 +3217,7 @@ class Auth(object):
onvalidation=onvalidation, onvalidation=onvalidation,
hideerror=self.settings.hideerror): hideerror=self.settings.hideerror):
current_user = s.select(limitby=(0,1), orderby_on_limitby=False).first() current_user = s.select(limitby=(0, 1), orderby_on_limitby=False).first()
if not form.vars['old_password'] == current_user[passfield]: if not form.vars['old_password'] == current_user[passfield]:
form.errors['old_password'] = self.messages.invalid_password form.errors['old_password'] = self.messages.invalid_password
else: else:
@@ -3253,8 +3233,7 @@ class Auth(object):
redirect(next, client_side=self.settings.client_side) redirect(next, client_side=self.settings.client_side)
return form return form
def profile( def profile(self,
self,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
onaccept=DEFAULT, onaccept=DEFAULT,
@@ -3314,7 +3293,7 @@ class Auth(object):
onaccept = self.settings.login_onaccept onaccept = self.settings.login_onaccept
if onaccept: if onaccept:
form = Storage(dict(vars=self.user)) form = Storage(dict(vars=self.user))
if not isinstance(onaccept,(list, tuple)): if not isinstance(onaccept, (list, tuple)):
onaccept = [onaccept] onaccept = [onaccept]
for callback in onaccept: for callback in onaccept:
callback(form) callback(form)
@@ -3615,8 +3594,7 @@ class Auth(object):
if group_id in self.user_groups: del self.user_groups[group_id] if group_id in self.user_groups: del self.user_groups[group_id]
return ret return ret
def has_permission( def has_permission(self,
self,
name='any', name='any',
table_name='', table_name='',
record_id=0, record_id=0,
@@ -3668,8 +3646,7 @@ class Auth(object):
table_name=table_name, record_id=record_id)) table_name=table_name, record_id=record_id))
return r return r
def add_permission( def add_permission(self,
self,
group_id, group_id,
name='any', name='any',
table_name='', table_name='',
@@ -3683,7 +3660,7 @@ class Auth(object):
if group_id == 0: if group_id == 0:
group_id = self.user_group() group_id = self.user_group()
record = self.db(permission.group_id == group_id)(permission.name == name)(permission.table_name == str(table_name))( record = self.db(permission.group_id == group_id)(permission.name == name)(permission.table_name == str(table_name))(
permission.record_id == long(record_id)).select(limitby=(0,1), orderby_on_limitby=False).first() permission.record_id == long(record_id)).select(limitby=(0, 1), orderby_on_limitby=False).first()
if record: if record:
id = record.id id = record.id
else: else:
@@ -3696,8 +3673,7 @@ class Auth(object):
record_id=record_id)) record_id=record_id))
return id return id
def del_permission( def del_permission(self,
self,
group_id, group_id,
name='any', name='any',
table_name='', table_name='',
@@ -3862,7 +3838,8 @@ class Auth(object):
force_render=False, force_render=False,
groups=None): groups=None):
if controller and function: resolve = False if controller and function:
resolve = False
if not hasattr(self, '_wiki'): if not hasattr(self, '_wiki'):
self._wiki = Wiki(self, render=render, self._wiki = Wiki(self, render=render,
@@ -3885,7 +3862,7 @@ class Auth(object):
if resolve: if resolve:
if slug: if slug:
wiki = self._wiki.read(slug, force_render) wiki = self._wiki.read(slug, force_render)
if isinstance(wiki, dict) and wiki.has_key('content'): if isinstance(wiki, dict) and wiki.has_key('content'): # FIXME: .has_key() is deprecated
# We don't want to return a dict object, just the wiki # We don't want to return a dict object, just the wiki
wiki = wiki['content'] wiki = wiki['content']
else: else:
@@ -4013,8 +3990,7 @@ class Crud(object):
return Auth.archive(form, archive_table=archive_table, return Auth.archive(form, archive_table=archive_table,
current_record=current_record) current_record=current_record)
def update( def update(self,
self,
table, table,
record, record,
next=DEFAULT, next=DEFAULT,
@@ -4125,8 +4101,7 @@ class Crud(object):
raise HTTP(401, serializers.json(dict(errors=form.errors))) raise HTTP(401, serializers.json(dict(errors=form.errors)))
return form return form
def create( def create(self,
self,
table, table,
next=DEFAULT, next=DEFAULT,
onvalidation=DEFAULT, onvalidation=DEFAULT,
@@ -4182,8 +4157,7 @@ class Crud(object):
return table._filter_fields(form.record, id=True) return table._filter_fields(form.record, id=True)
return form return form
def delete( def delete(self,
self,
table, table,
record_id, record_id,
next=DEFAULT, next=DEFAULT,
@@ -4237,8 +4211,7 @@ class Crud(object):
limitby=limitby)) limitby=limitby))
return rows return rows
def select( def select(self,
self,
table, table,
query=None, query=None,
fields=None, fields=None,
@@ -4329,7 +4302,7 @@ class Crud(object):
""" """
table = tables[0] table = tables[0]
fields = args.get('fields', table.fields) fields = args.get('fields', table.fields)
validate = args.get('validate',True) validate = args.get('validate', True)
request = current.request request = current.request
db = self.db db = self.db
if not (isinstance(table, Table) or table in db.tables): if not (isinstance(table, Table) or table in db.tables):
@@ -4382,8 +4355,7 @@ class Crud(object):
if request.post_vars and (chkval or field.type == 'id'): if request.post_vars and (chkval or field.type == 'id'):
if txtval and opval != '': if txtval and opval != '':
if field.type[0:10] == 'reference ': if field.type[0:10] == 'reference ':
refsearch.append(self.get_query(field, refsearch.append(self.get_query(field, opval, txtval, refsearch=True))
opval, txtval, refsearch=True))
elif validate: elif validate:
value, error = field.validate(txtval) value, error = field.validate(txtval)
if not error: if not error:
@@ -4477,8 +4449,7 @@ def universal_caller(f, *a, **b):
# Fill the arg_dict with name and value for the submitted, positional values # Fill the arg_dict with name and value for the submitted, positional values
for pos_index, pos_val in enumerate(a[:c]): for pos_index, pos_val in enumerate(a[:c]):
arg_dict[n[pos_index] arg_dict[n[pos_index]] = pos_val # n[pos_index] is the name of the argument
] = pos_val # n[pos_index] is the name of the argument
# There might be pos_args left, that are sent as named_values. Gather them as well. # There might be pos_args left, that are sent as named_values. Gather them as well.
# If a argument already is populated with values we simply replaces them. # If a argument already is populated with values we simply replaces them.
@@ -4856,7 +4827,6 @@ class Service(object):
-32603: ("Internal error", "Internal JSON-RPC error."), -32603: ("Internal error", "Internal JSON-RPC error."),
-32099: ("Server error", "Reserved for implementation-defined server-errors.")} -32099: ("Server error", "Reserved for implementation-defined server-errors.")}
def serve_jsonrpc(self): def serve_jsonrpc(self):
def return_response(id, result): def return_response(id, result):
return serializers.json({'version': '1.1', return serializers.json({'version': '1.1',
@@ -4886,7 +4856,7 @@ class Service(object):
if not method in methods: if not method in methods:
return return_error(id, 100, 'method "%s" does not exist' % method) return return_error(id, 100, 'method "%s" does not exist' % method)
try: try:
if isinstance(params,dict): if isinstance(params, dict):
s = methods[method](**params) s = methods[method](**params)
else: else:
s = methods[method](*params) s = methods[method](*params)
@@ -4952,8 +4922,6 @@ class Service(object):
return True return True
request = current.request request = current.request
response = current.response response = current.response
if not data: if not data:
@@ -4986,7 +4954,7 @@ class Service(object):
if not method in methods: if not method in methods:
return return_error(id, -32601, data='Method "%s" does not exist' % method) return return_error(id, -32601, data='Method "%s" does not exist' % method)
try: try:
if isinstance(params,dict): if isinstance(params, dict):
s = methods[method](**params) s = methods[method](**params)
else: else:
s = methods[method](*params) s = methods[method](*params)
@@ -5006,7 +4974,6 @@ class Service(object):
logger.warning('%s: %s\n%s' % (etype.__name__, eval, traceback.format_tb(etb))) logger.warning('%s: %s\n%s' % (etype.__name__, eval, traceback.format_tb(etb)))
return return_error(id, -32099, data=data) return return_error(id, -32099, data=data)
def serve_xmlrpc(self): def serve_xmlrpc(self):
request = current.request request = current.request
response = current.response response = current.response
@@ -5407,7 +5374,7 @@ class Expose(object):
self.filenames = [f[len(path) - 1:] for f in sorted(glob.glob(path)) self.filenames = [f[len(path) - 1:] for f in sorted(glob.glob(path))
if not os.path.isdir(f) and not self.isprivate(f)] if not os.path.isdir(f) and not self.isprivate(f)]
if 'README' in self.filenames: if 'README' in self.filenames:
readme = open(os.path.join(filename,'README')).read() readme = open(os.path.join(filename, 'README')).read()
self.paragraph = MARKMIN(readme) self.paragraph = MARKMIN(readme)
else: else:
self.paragraph = None self.paragraph = None
@@ -5464,7 +5431,8 @@ class Expose(object):
class Wiki(object): class Wiki(object):
everybody = 'everybody' everybody = 'everybody'
rows_page = 25 rows_page = 25
def markmin_base(self,body):
def markmin_base(self, body):
return MARKMIN(body, extra=self.settings.extra, return MARKMIN(body, extra=self.settings.extra,
url=True, environment=self.env, url=True, environment=self.env,
autolinks=lambda link: expand_one(link, {})).xml() autolinks=lambda link: expand_one(link, {})).xml()
@@ -5576,7 +5544,7 @@ class Wiki(object):
table_definitions = [ table_definitions = [
('wiki_page', { ('wiki_page', {
'args':[ 'args': [
Field('slug', Field('slug',
requires=[IS_SLUG(), requires=[IS_SLUG(),
IS_NOT_IN_DB(db, 'wiki_page.slug')], IS_NOT_IN_DB(db, 'wiki_page.slug')],
@@ -5601,20 +5569,20 @@ class Wiki(object):
requires=IS_EMPTY_OR( requires=IS_EMPTY_OR(
IS_IN_SET(engines))), IS_IN_SET(engines))),
auth.signature], auth.signature],
'vars':{'format':'%(title)s', 'migrate':migrate}}), 'vars': {'format': '%(title)s', 'migrate': migrate}}),
('wiki_tag', { ('wiki_tag', {
'args':[ 'args': [
Field('name'), Field('name'),
Field('wiki_page', 'reference wiki_page'), Field('wiki_page', 'reference wiki_page'),
auth.signature], auth.signature],
'vars':{'format':'%(title)s', 'migrate':migrate}}), 'vars':{'format': '%(title)s', 'migrate': migrate}}),
('wiki_media', { ('wiki_media', {
'args':[ 'args': [
Field('wiki_page', 'reference wiki_page'), Field('wiki_page', 'reference wiki_page'),
Field('title', required=True), Field('title', required=True),
Field('filename', 'upload', required=True), Field('filename', 'upload', required=True),
auth.signature], auth.signature],
'vars':{'format':'%(title)s', 'migrate':migrate}}), 'vars': {'format': '%(title)s', 'migrate': migrate}}),
] ]
# define only non-existent tables # define only non-existent tables
@@ -5633,7 +5601,7 @@ class Wiki(object):
if self.settings.templates is None and not \ if self.settings.templates is None and not \
self.settings.manage_permissions: self.settings.manage_permissions:
self.settings.templates = db.wiki_page.tags.contains('template')&\ self.settings.templates = db.wiki_page.tags.contains('template') & \
db.wiki_page.can_read.contains('everybody') db.wiki_page.can_read.contains('everybody')
def update_tags_insert(page, id, db=db): def update_tags_insert(page, id, db=db):
@@ -5643,7 +5611,7 @@ class Wiki(object):
db.wiki_tag.insert(name=tag, wiki_page=id) db.wiki_tag.insert(name=tag, wiki_page=id)
def update_tags_update(dbset, page, db=db): def update_tags_update(dbset, page, db=db):
page = dbset.select(limitby=(0,1)).first() page = dbset.select(limitby=(0, 1)).first()
db(db.wiki_tag.wiki_page == page.id).delete() db(db.wiki_tag.wiki_page == page.id).delete()
for tag in page.tags or []: for tag in page.tags or []:
tag = tag.strip().lower() tag = tag.strip().lower()
@@ -5733,7 +5701,7 @@ class Wiki(object):
elif not zero or not zero.startswith('_'): elif not zero or not zero.startswith('_'):
return self.read(zero) return self.read(zero)
elif zero == '_edit': elif zero == '_edit':
return self.edit(request.args(1) or 'index',request.args(2) or 0) return self.edit(request.args(1) or 'index', request.args(2) or 0)
elif zero == '_editmedia': elif zero == '_editmedia':
return self.editmedia(request.args(1) or 'index') return self.editmedia(request.args(1) or 'index')
elif zero == '_create': elif zero == '_create':
@@ -5804,7 +5772,7 @@ class Wiki(object):
created_on=page.created_on, created_on=page.created_on,
modified_on=page.modified_on) modified_on=page.modified_on)
def edit(self,slug,from_template=0): def edit(self, slug, from_template=0):
auth = self.auth auth = self.auth
db = auth.db db = auth.db
page = db.wiki_page(slug=slug) page = db.wiki_page(slug=slug)
@@ -5825,7 +5793,8 @@ class Wiki(object):
db.wiki_page.body.default = \ db.wiki_page.body.default = \
'- Menu Item > @////index\n- - Submenu > http://web2py.com' '- Menu Item > @////index\n- - Submenu > http://web2py.com'
else: else:
db.wiki_page.body.default = db(db.wiki_page.id==from_template).select(db.wiki_page.body)[0].body if int(from_template) > 0 else '## %s\n\npage content' % title_guess db.wiki_page.body.default = db(db.wiki_page.id == from_template).select(db.wiki_page.body)[0].body \
if int(from_template) > 0 else '## %s\n\npage content' % title_guess
vars = current.request.post_vars vars = current.request.post_vars
if vars.body: if vars.body:
vars.body = vars.body.replace('://%s' % self.host, '://HOSTNAME') vars.body = vars.body.replace('://%s' % self.host, '://HOSTNAME')
@@ -5880,9 +5849,9 @@ class Wiki(object):
} }
}) })
}) })
""" % dict(url=URL(args=('_preview', slug)),link_media=('true' if page else 'false'), """ % dict(url=URL(args=('_preview', slug)), link_media=('true' if page else 'false'),
urlmedia=URL(extension='load', urlmedia=URL(extension='load',
args=('_editmedia',slug), args=('_editmedia', slug),
vars=dict(embedded=1))) vars=dict(embedded=1)))
return dict(content=TAG[''](form, SCRIPT(script))) return dict(content=TAG[''](form, SCRIPT(script)))
@@ -5894,9 +5863,7 @@ class Wiki(object):
return self.not_authorized(page) return self.not_authorized(page)
self.auth.db.wiki_media.id.represent = lambda id, row: \ self.auth.db.wiki_media.id.represent = lambda id, row: \
id if not row.filename else \ id if not row.filename else \
SPAN('@////%i/%s.%s' % SPAN('@////%i/%s.%s' % (id, IS_SLUG.urlify(row.title.split('.')[0]), row.filename.split('.')[-1]))
(id, IS_SLUG.urlify(row.title.split('.')[0]),
row.filename.split('.')[-1]))
self.auth.db.wiki_media.wiki_page.default = page.id self.auth.db.wiki_media.wiki_page.default = page.id
self.auth.db.wiki_media.wiki_page.writable = False self.auth.db.wiki_media.wiki_page.writable = False
links = [] links = []
@@ -5907,16 +5874,16 @@ class Wiki(object):
fragment = self.auth.db.wiki_media.id.represent fragment = self.auth.db.wiki_media.id.represent
csv = False csv = False
create = False create = False
links=[ links= [
lambda row: lambda row:
A('copy into source', _href='#', _onclick=script % (fragment(row.id, row))) A('copy into source', _href='#', _onclick=script % (fragment(row.id, row)))
] ]
content = SQLFORM.grid( content = SQLFORM.grid(
self.auth.db.wiki_media.wiki_page == page.id, self.auth.db.wiki_media.wiki_page == page.id,
orderby=self.auth.db.wiki_media.title, orderby=self.auth.db.wiki_media.title,
links = links, links=links,
csv = csv, csv=csv,
create = create, create=create,
args=['_editmedia', slug], args=['_editmedia', slug],
user_signature=False) user_signature=False)
return dict(content=content) return dict(content=content)
@@ -5925,12 +5892,12 @@ class Wiki(object):
if not self.can_edit(): if not self.can_edit():
return self.not_authorized() return self.not_authorized()
db = self.auth.db db = self.auth.db
slugs=db(db.wiki_page.id>0).select(db.wiki_page.id,db.wiki_page.slug) slugs = db(db.wiki_page.id > 0).select(db.wiki_page.id, db.wiki_page.slug)
options=[OPTION(row.slug,_value=row.id) for row in slugs] options = [OPTION(row.slug, _value=row.id) for row in slugs]
options.insert(0, OPTION('',_value='')) options.insert(0, OPTION('', _value=''))
fields = [Field("slug", default=current.request.args(1) or fields = [Field("slug", default=current.request.args(1) or
self.settings.force_prefix, self.settings.force_prefix,
requires=(IS_SLUG(), IS_NOT_IN_DB(db,db.wiki_page.slug))),] requires=(IS_SLUG(), IS_NOT_IN_DB(db, db.wiki_page.slug))),]
if self.settings.templates: if self.settings.templates:
fields.append( fields.append(
Field("from_template", "reference wiki_page", Field("from_template", "reference wiki_page",
@@ -5947,7 +5914,7 @@ class Wiki(object):
if form.process().accepted: if form.process().accepted:
form.vars.from_template = 0 if not form.vars.from_template \ form.vars.from_template = 0 if not form.vars.from_template \
else form.vars.from_template else form.vars.from_template
redirect(URL(args=('_edit', form.vars.slug,form.vars.from_template or 0))) # added param redirect(URL(args=('_edit', form.vars.slug, form.vars.from_template or 0))) # added param
return dict(content=form) return dict(content=form)
def pages(self): def pages(self):
@@ -5960,14 +5927,14 @@ class Wiki(object):
wiki_table = self.auth.db.wiki_page wiki_table = self.auth.db.wiki_page
content = SQLFORM.grid( content = SQLFORM.grid(
wiki_table, wiki_table,
fields = [wiki_table.slug, fields=[wiki_table.slug,
wiki_table.title, wiki_table.tags, wiki_table.title, wiki_table.tags,
wiki_table.can_read, wiki_table.can_edit], wiki_table.can_read, wiki_table.can_edit],
links=[ links=[
lambda row: lambda row:
A('edit', _href=URL(args=('_edit', row.slug)),_class='btn'), A('edit', _href=URL(args=('_edit', row.slug)), _class='btn'),
lambda row: lambda row:
A('media', _href=URL(args=('_editmedia', row.slug)),_class='btn')], A('media', _href=URL(args=('_editmedia', row.slug)), _class='btn')],
details=False, editable=False, deletable=False, create=False, details=False, editable=False, deletable=False, create=False,
orderby=self.auth.db.wiki_page.title, orderby=self.auth.db.wiki_page.title,
args=['_pages'], args=['_pages'],
@@ -6151,6 +6118,7 @@ class Wiki(object):
request.post_vars.render = None request.post_vars.render = None
return render(request.post_vars) return render(request.post_vars)
class Config(object): class Config(object):
def __init__( def __init__(
self, self,
@@ -6166,7 +6134,7 @@ class Config(object):
self.filename = filename self.filename = filename
def read(self): def read(self):
if not( isinstance(current.session['settings_%s' % self.section], dict) ): if not(isinstance(current.session['settings_%s' % self.section], dict)):
settings = dict(self.config.items(self.section)) settings = dict(self.config.items(self.section))
else: else:
settings = current.session['settings_%s' % self.section] settings = current.session['settings_%s' % self.section]