Mercurial > kallithea
changeset 1634:1d904d972c47 beta
User usermodel instead of db model to manage accounts
- initial refactoring of models to handle rhodecode+api
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 02 Nov 2011 16:19:51 +0200 |
parents | 2c0d35e336b5 |
children | 7e0ec636b061 |
files | rhodecode/lib/db_manage.py rhodecode/lib/utils.py rhodecode/model/db.py rhodecode/model/user.py |
diffstat | 4 files changed, 72 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/rhodecode/lib/db_manage.py Wed Nov 02 03:08:33 2011 +0200 +++ b/rhodecode/lib/db_manage.py Wed Nov 02 16:19:51 2011 +0200 @@ -33,7 +33,7 @@ from rhodecode import __dbversion__ from rhodecode.model import meta -from rhodecode.lib.auth import get_crypt_password, generate_api_key +from rhodecode.model.user import UserModel from rhodecode.lib.utils import ask_ok from rhodecode.model import init_model from rhodecode.model.db import User, Permission, RhodeCodeUi, \ @@ -415,30 +415,18 @@ log.info('created ui config') def create_user(self, username, password, email='', admin=False): - log.info('creating administrator user %s', username) - - form_data = dict(username=username, - password=password, - active=True, - admin=admin, - name='RhodeCode', - lastname='Admin', - email=email) - User.create(form_data) - + log.info('creating user %s', username) + UserModel().create_or_update(username, password, email, + name='RhodeCode', lastname='Admin', + active=True, admin=admin) def create_default_user(self): log.info('creating default user') - #create default user for handling default permissions. - - form_data = dict(username='default', - password=str(uuid.uuid1())[:8], - active=False, - admin=False, - name='Anonymous', - lastname='User', - email='anonymous@rhodecode.org') - User.create(form_data) + # create default user for handling default permissions. + UserModel().create_or_update(username='default', + password=str(uuid.uuid1())[:8], + email='anonymous@rhodecode.org', + name='Anonymous', lastname='User') def create_permissions(self): #module.(access|create|change|delete)_[name]
--- a/rhodecode/lib/utils.py Wed Nov 02 03:08:33 2011 +0200 +++ b/rhodecode/lib/utils.py Wed Nov 02 16:19:51 2011 +0200 @@ -47,15 +47,14 @@ from rhodecode.model.caching_query import FromCache from rhodecode.model.db import Repository, User, RhodeCodeUi, UserLog, RepoGroup, \ RhodeCodeSetting -from rhodecode.model.repo import RepoModel log = logging.getLogger(__name__) -def recursive_replace(str, replace=' '): +def recursive_replace(str_, replace=' '): """Recursive replace of given sign to just one instance - :param str: given string + :param str_: given string :param replace: char to find and replace multiple instances Examples:: @@ -63,11 +62,11 @@ 'Mighty-Mighty-Bo-sstones' """ - if str.find(replace * 2) == -1: - return str + if str_.find(replace * 2) == -1: + return str_ else: - str = str.replace(replace * 2, replace) - return recursive_replace(str, replace) + str_ = str_.replace(replace * 2, replace) + return recursive_replace(str_, replace) def repo_name_slug(value): @@ -116,13 +115,12 @@ else: raise Exception('You have to provide user object or username') - rm = RepoModel() if hasattr(repo, 'repo_id'): - repo_obj = rm.get(repo.repo_id, cache=False) + repo_obj = Repository.get(repo.repo_id) repo_name = repo_obj.repo_name elif isinstance(repo, basestring): repo_name = repo.lstrip('/') - repo_obj = rm.get_by_repo_name(repo_name, cache=False) + repo_obj = Repository.get_by_repo_name(repo_name) else: raise Exception('You have to provide repository to action logger') @@ -151,8 +149,6 @@ :param path: path to scann for repositories :param recursive: recursive search and return names with subdirs in front """ - from vcs.utils.helpers import get_scm - from vcs.exceptions import VCSError if path.endswith(os.sep): #remove ending slash for better results @@ -377,17 +373,20 @@ def repo2db_mapper(initial_repo_list, remove_obsolete=False): - """maps all repos given in initial_repo_list, non existing repositories + """ + maps all repos given in initial_repo_list, non existing repositories are created, if remove_obsolete is True it also check for db entries that are not in initial_repo_list and removes them. :param initial_repo_list: list of repositories found by scanning methods :param remove_obsolete: check for obsolete entries in database """ - + from rhodecode.model.repo import RepoModel sa = meta.Session() rm = RepoModel() user = sa.query(User).filter(User.admin == True).first() + if user is None: + raise Exception('Missing administrative account !') added = [] # fixup groups paths to new format on the fly # TODO: remove this in future
--- a/rhodecode/model/db.py Wed Nov 02 03:08:33 2011 +0200 +++ b/rhodecode/model/db.py Wed Nov 02 16:19:51 2011 +0200 @@ -30,6 +30,7 @@ from datetime import date from sqlalchemy import * +from sqlalchemy.exc import DatabaseError from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import relationship, joinedload, class_mapper, validates from beaker.cache import cache_region, region_invalidate @@ -322,26 +323,6 @@ Session.commit() log.debug('updated user %s lastlogin', self.username) - @classmethod - def create(cls, form_data): - from rhodecode.lib.auth import get_crypt_password - - try: - new_user = cls() - for k, v in form_data.items(): - if k == 'password': - v = get_crypt_password(v) - setattr(new_user, k, v) - - new_user.api_key = generate_api_key(form_data['username']) - Session.add(new_user) - Session.commit() - return new_user - except: - log.error(traceback.format_exc()) - Session.rollback() - raise - class UserLog(Base, BaseModel): __tablename__ = 'user_logs' __table_args__ = {'extend_existing':True}
--- a/rhodecode/model/user.py Wed Nov 02 03:08:33 2011 +0200 +++ b/rhodecode/model/user.py Wed Nov 02 16:19:51 2011 +0200 @@ -92,6 +92,54 @@ self.sa.rollback() raise + + def create_or_update(self, username, password, email, name, lastname, + active=True, admin=False, ldap_dn=None): + """ + Creates a new instance if not found, or updates current one + + :param username: + :param password: + :param email: + :param active: + :param name: + :param lastname: + :param active: + :param admin: + :param ldap_dn: + """ + + from rhodecode.lib.auth import get_crypt_password + + log.debug('Checking for %s account in RhodeCode database', username) + user = User.get_by_username(username, case_insensitive=True) + if user is None: + log.debug('creating new user %s', username) + new_user = User() + else: + log.debug('updating user %s', username) + new_user = user + + try: + new_user.username = username + new_user.admin = admin + new_user.password = get_crypt_password(password) + new_user.api_key = generate_api_key(username) + new_user.email = email + new_user.active = active + new_user.ldap_dn = safe_unicode(ldap_dn) if ldap_dn else None + new_user.name = name + new_user.lastname = lastname + + self.sa.add(new_user) + self.sa.commit() + return new_user + except (DatabaseError,): + log.error(traceback.format_exc()) + self.sa.rollback() + raise + + def create_for_container_auth(self, username, attrs): """ Creates the given user if it's not already in the database