diff --git a/VERSION b/VERSION index 3eb3cd3f..e29beaca 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.09.01.13.34.22 +Version 2.6.0-development+timestamp.2013.09.01.14.13.25 diff --git a/gluon/dal.py b/gluon/dal.py index 8fe636e7..61b3a0a8 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -8422,8 +8422,9 @@ class Table(object): def _enable_record_versioning(self, archive_db=None, archive_name = '%(tablename)s_archive', + is_active = 'is_active', current_record = 'current_record', - is_active = 'is_active'): + current_record_label = None): db = self._db archive_db = archive_db or db archive_name = archive_name % dict(tablename=self._tablename) @@ -8438,7 +8439,8 @@ class Table(object): clones.append(field.clone( unique=False, type=field.type if nfk else 'bigint')) archive_db.define_table( - archive_name, Field(current_record,field_type), *clones) + archive_name, Field(current_record,field_type, + label=current_record_label), *clones) self._before_update.append( lambda qset,fs,db=archive_db,an=archive_name,cn=current_record: archive_record(qset,fs,db[an],cn)) diff --git a/gluon/tools.py b/gluon/tools.py index aae48d53..1834b310 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -1523,7 +1523,8 @@ class Auth(object): tables, archive_db=None, archive_names='%(tablename)s_archive', - current_record='current_record'): + current_record='current_record', + current_record_label=None): """ to enable full record versioning (including auth tables): @@ -1550,6 +1551,8 @@ class Auth(object): does automatically. """ + current_record_label = current_record_label or current.T( + current_record.replace('_',' ').title()) for table in tables: fieldnames = table.fields() if ('id' in fieldnames and @@ -1558,7 +1561,8 @@ class Auth(object): table._enable_record_versioning( archive_db=archive_db, archive_name=archive_names, - current_record=current_record) + current_record=current_record, + current_record_label=current_record_label) def define_signature(self): db = self.db @@ -2158,12 +2162,17 @@ class Auth(object): elif 'username' in table_user.fields: username = 'username' else: - username = 'email' + username = 'email' + settings = self.settings if 'username' in table_user.fields or \ - not self.settings.login_email_validate: + not settings.login_email_validate: tmpvalidator = IS_NOT_EMPTY(error_message=self.messages.is_empty) + if not settings.username_case_sensitive: + tmpvalidator = [IS_LOWER(), tmpvalidator] else: tmpvalidator = IS_EMAIL(error_message=self.messages.invalid_email) + if not settings.email_case_sensitive: + tmpvalidator = [IS_LOWER(), tmpvalidator] old_requires = table_user[username].requires table_user[username].requires = tmpvalidator @@ -2171,7 +2180,7 @@ class Auth(object): response = current.response session = current.session - passfield = self.settings.password_field + passfield = settings.password_field try: table_user[passfield].requires[-1].min_length = 0 except: @@ -2187,43 +2196,43 @@ class Auth(object): if next is DEFAULT: # important for security - next = self.settings.login_next + next = settings.login_next user_next = snext if user_next: external = user_next.split('://') if external[0].lower() in ['http', 'https', 'ftp']: host_next = user_next.split('//', 1)[-1].split('/')[0] - if host_next in self.settings.cas_domains: + if host_next in settings.cas_domains: next = user_next else: next = user_next if onvalidation is DEFAULT: - onvalidation = self.settings.login_onvalidation + onvalidation = settings.login_onvalidation if onaccept is DEFAULT: - onaccept = self.settings.login_onaccept + onaccept = settings.login_onaccept if log is DEFAULT: log = self.messages['login_log'] - onfail = self.settings.login_onfail + onfail = settings.login_onfail user = None # default # do we use our own login form, or from a central source? - if self.settings.login_form == self: + if settings.login_form == self: form = SQLFORM( table_user, fields=[username, passfield], hidden=dict(_next=next), - showid=self.settings.showid, + showid=settings.showid, submit_button=self.messages.login_button, delete_label=self.messages.delete_label, - formstyle=self.settings.formstyle, - separator=self.settings.label_separator + formstyle=settings.formstyle, + separator=settings.label_separator ) - if self.settings.remember_me_form: + if settings.remember_me_form: ## adds a new input checkbox "remember me for longer" - if self.settings.formstyle != 'bootstrap': + if settings.formstyle != 'bootstrap': addrow(form, XML(" "), DIV(XML(" "), INPUT(_type='checkbox', @@ -2236,9 +2245,9 @@ class Auth(object): self.messages.label_remember_me, _for="auth_user_remember", )), "", - self.settings.formstyle, + settings.formstyle, 'auth_user_remember__row') - elif self.settings.formstyle == 'bootstrap': + elif settings.formstyle == 'bootstrap': addrow(form, "", LABEL( @@ -2248,20 +2257,20 @@ class Auth(object): self.messages.label_remember_me, _class="checkbox"), "", - self.settings.formstyle, + settings.formstyle, 'auth_user_remember__row') - captcha = self.settings.login_captcha or \ - (self.settings.login_captcha != False and self.settings.captcha) + captcha = settings.login_captcha or \ + (settings.login_captcha != False and settings.captcha) if captcha: addrow(form, captcha.label, captcha, captcha.comment, - self.settings.formstyle, 'captcha__row') + settings.formstyle, 'captcha__row') accepted_form = False if form.accepts(request, session, formname='login', dbio=False, onvalidation=onvalidation, - hideerror=self.settings.hideerror): + hideerror=settings.hideerror): accepted_form = True # check for username in db @@ -2283,36 +2292,36 @@ class Auth(object): # try alternate logins 1st as these have the # current version of the password user = None - for login_method in self.settings.login_methods: + for login_method in settings.login_methods: if login_method != self and \ login_method(request.vars[username], request.vars[passfield]): - if not self in self.settings.login_methods: + if not self in settings.login_methods: # do not store password in db form.vars[passfield] = None user = self.get_or_create_user( - form.vars, self.settings.update_fields) + form.vars, settings.update_fields) break if not user: # alternates have failed, maybe because service inaccessible - if self.settings.login_methods[0] == self: + if settings.login_methods[0] == self: # try logging in locally using cached credentials if form.vars.get(passfield, '') == temp_user[passfield]: # success user = temp_user else: # user not in db - if not self.settings.alternate_requires_registration: + if not settings.alternate_requires_registration: # we're allowed to auto-register users from external systems - for login_method in self.settings.login_methods: + for login_method in settings.login_methods: if login_method != self and \ login_method(request.vars[username], request.vars[passfield]): - if not self in self.settings.login_methods: + if not self in settings.login_methods: # do not store password in db form.vars[passfield] = None user = self.get_or_create_user( - form.vars, self.settings.update_fields) + form.vars, settings.update_fields) break if not user: self.log_event(self.messages['login_failed_log'], @@ -2322,25 +2331,25 @@ class Auth(object): callback(onfail, None) redirect( self.url(args=request.args, vars=request.get_vars), - client_side=self.settings.client_side) + client_side=settings.client_side) else: # use a central authentication server - cas = self.settings.login_form + cas = settings.login_form cas_user = cas.get_user() if cas_user: cas_user[passfield] = None user = self.get_or_create_user( table_user._filter_fields(cas_user), - self.settings.update_fields) + settings.update_fields) elif hasattr(cas, 'login_form'): return cas.login_form() else: # we need to pass through login again before going on - next = self.url(self.settings.function, args='login') + next = self.url(settings.function, args='login') redirect(cas.login_url(next), - client_side=self.settings.client_side) + client_side=settings.client_side) # process authenticated users if user: @@ -2350,20 +2359,20 @@ class Auth(object): self.login_user(user) session.auth.expiration = \ request.vars.get('remember', False) and \ - self.settings.long_expiration or \ - self.settings.expiration + settings.long_expiration or \ + settings.expiration session.auth.remember = 'remember' in request.vars self.log_event(log, user) session.flash = self.messages.logged_in # how to continue - if self.settings.login_form == self: + if settings.login_form == self: if accepted_form: callback(onaccept, form) if next == session._auth_next: session._auth_next = None next = replace_id(next, form) - redirect(next, client_side=self.settings.client_side) + redirect(next, client_side=settings.client_side) table_user[username].requires = old_requires return form @@ -2372,7 +2381,7 @@ class Auth(object): if next == session._auth_next: del session._auth_next - redirect(next, client_side=self.settings.client_side) + redirect(next, client_side=settings.client_side) def logout(self, next=DEFAULT, onlogout=DEFAULT, log=DEFAULT): """