Changeset - 91b38dc6d891
[Not reviewed]
default
0 10 0
Søren Løvborg - 9 years ago 2016-08-03 16:07:39
sorenl@unity3d.com
model: refactor and simplify _get_instance

_get_instance is a BaseModel method, but never uses "self". Instead
it takes a class argument, which indicates that it's better suited as
a classmethod on said classes.

Also rename to something more descriptive, remove leading underscore
since it's not a private API, and refactor for readability.
10 files changed with 47 insertions and 44 deletions:
0 comments (0 inline, 0 general)
kallithea/model/__init__.py
Show inline comments
 
@@ -46,7 +46,7 @@ Original author and date, and relevant c
 

	
 
import logging
 
from kallithea.model import meta
 
from kallithea.lib.utils2 import safe_str, obfuscate_url_pw
 
from kallithea.lib.utils2 import obfuscate_url_pw
 

	
 
log = logging.getLogger(__name__)
 

	
 
@@ -78,29 +78,6 @@ class BaseModel(object):
 
        else:
 
            self.sa = meta.Session()
 

	
 
    def _get_instance(self, cls, instance, callback=None):
 
        """
 
        Gets instance of given cls using some simple lookup mechanism.
 

	
 
        :param cls: class to fetch
 
        :param instance: int or Instance
 
        :param callback: callback to call if all lookups failed
 
        """
 

	
 
        if isinstance(instance, cls):
 
            return instance
 
        elif isinstance(instance, (int, long)) or safe_str(instance).isdigit():
 
            return cls.get(instance)
 
        else:
 
            if instance is not None:
 
                if callback is None:
 
                    raise Exception(
 
                        'given object must be int, long or Instance of %s '
 
                        'got %s, no callback provided' % (cls, type(instance))
 
                    )
 
                else:
 
                    return callback(instance)
 

	
 
    def _get_user(self, user):
 
        """
 
        Helper method to get user by ID, or username fallback
 
@@ -108,7 +85,7 @@ class BaseModel(object):
 
        :param user: UserID, username, or User instance
 
        """
 
        from kallithea.model.db import User
 
        return self._get_instance(User, user,
 
        return User.guess_instance(user,
 
                                  callback=User.get_by_username)
 

	
 
    def _get_repo(self, repository):
 
@@ -118,7 +95,7 @@ class BaseModel(object):
 
        :param repository: RepoID, repository name or Repository Instance
 
        """
 
        from kallithea.model.db import Repository
 
        return self._get_instance(Repository, repository,
 
        return Repository.guess_instance(repository,
 
                                  callback=Repository.get_by_repo_name)
 

	
 
    def _get_perm(self, permission):
 
@@ -128,5 +105,5 @@ class BaseModel(object):
 
        :param permission: PermissionID, permission_name or Permission instance
 
        """
 
        from kallithea.model.db import Permission
 
        return self._get_instance(Permission, permission,
 
        return Permission.guess_instance(permission,
 
                                  callback=Permission.get_by_key)
kallithea/model/changeset_status.py
Show inline comments
 
@@ -50,7 +50,7 @@ class ChangesetStatusModel(BaseModel):
 
        if revision:
 
            q = q.filter(ChangesetStatus.revision == revision)
 
        elif pull_request:
 
            pull_request = self._get_instance(PullRequest, pull_request)
 
            pull_request = PullRequest.guess_instance(pull_request)
 
            q = q.filter(ChangesetStatus.pull_request == pull_request)
 
        else:
 
            raise Exception('Please specify revision or pull_request')
 
@@ -159,7 +159,7 @@ class ChangesetStatusModel(BaseModel):
 
            revisions = [revision]
 
        else:
 
            assert pull_request is not None
 
            pull_request = self._get_instance(PullRequest, pull_request)
 
            pull_request = PullRequest.guess_instance(pull_request)
 
            repo = pull_request.org_repo
 
            q = q.filter(ChangesetStatus.repo == repo)
 
            q = q.filter(ChangesetStatus.revision.in_(pull_request.revisions))
kallithea/model/comment.py
Show inline comments
 
@@ -178,7 +178,7 @@ class ChangesetCommentsModel(BaseModel):
 
        if revision is not None:
 
            comment.revision = revision
 
        elif pull_request is not None:
 
            pull_request = self._get_instance(PullRequest, pull_request)
 
            pull_request = PullRequest.guess_instance(pull_request)
 
            comment.pull_request = pull_request
 
        else:
 
            raise Exception('Please specify revision or pull_request_id')
 
@@ -219,7 +219,7 @@ class ChangesetCommentsModel(BaseModel):
 
        return comment
 

	
 
    def delete(self, comment):
 
        comment = self._get_instance(ChangesetComment, comment)
 
        comment = ChangesetComment.guess_instance(comment)
 
        Session().delete(comment)
 

	
 
        return comment
 
@@ -264,7 +264,7 @@ class ChangesetCommentsModel(BaseModel):
 
            q = q.filter(ChangesetComment.revision == revision) \
 
                .filter(ChangesetComment.repo_id == repo_id)
 
        elif pull_request is not None:
 
            pull_request = self._get_instance(PullRequest, pull_request)
 
            pull_request = PullRequest.guess_instance(pull_request)
 
            q = q.filter(ChangesetComment.pull_request == pull_request)
 
        else:
 
            raise Exception('Please specify either revision or pull_request')
kallithea/model/db.py
Show inline comments
 
@@ -122,6 +122,32 @@ class BaseModel(object):
 
            return cls.query().get(id_)
 

	
 
    @classmethod
 
    def guess_instance(cls, value, callback=None):
 
        """Haphazardly attempt to convert `value` to a `cls` instance.
 

	
 
        If `value` is None or already a `cls` instance, return it. If `value`
 
        is a number (or looks like one if you squint just right), assume it's
 
        a database primary key and let SQLAlchemy sort things out. Otherwise,
 
        fall back to resolving it using `callback` (if specified); this could
 
        e.g. be a function that looks up instances by name (though that won't
 
        work if the name begins with a digit). Otherwise, raise Exception.
 
        """
 

	
 
        if value is None:
 
            return None
 
        if isinstance(value, cls):
 
            return value
 
        if isinstance(value, (int, long)) or safe_str(value).isdigit():
 
            return cls.get(value)
 
        if callback is not None:
 
            return callback(value)
 

	
 
        raise Exception(
 
            'given object must be int, long or Instance of %s '
 
            'got %s, no callback provided' % (cls, type(value))
 
        )
 

	
 
    @classmethod
 
    def get_or_404(cls, id_):
 
        try:
 
            id_ = int(id_)
kallithea/model/gist.py
Show inline comments
 
@@ -53,7 +53,7 @@ class GistModel(BaseModel):
 

	
 
        :param gist: GistID, gist_access_id, or Gist instance
 
        """
 
        return self._get_instance(Gist, gist, callback=Gist.get_by_access_id)
 
        return Gist.guess_instance(gist, callback=Gist.get_by_access_id)
 

	
 
    def __delete_gist(self, gist):
 
        """
kallithea/model/notification.py
Show inline comments
 
@@ -140,7 +140,7 @@ class NotificationModel(BaseModel):
 
    def delete(self, user, notification):
 
        # we don't want to remove actual notification just the assignment
 
        try:
 
            notification = self._get_instance(Notification, notification)
 
            notification = Notification.guess_instance(notification)
 
            user = self._get_user(user)
 
            if notification and user:
 
                obj = UserNotification.query() \
 
@@ -178,7 +178,7 @@ class NotificationModel(BaseModel):
 

	
 
    def mark_read(self, user, notification):
 
        try:
 
            notification = self._get_instance(Notification, notification)
 
            notification = Notification.guess_instance(notification)
 
            user = self._get_user(user)
 
            if notification and user:
 
                obj = UserNotification.query() \
 
@@ -223,7 +223,7 @@ class NotificationModel(BaseModel):
 

	
 
    def get_user_notification(self, user, notification):
 
        user = self._get_user(user)
 
        notification = self._get_instance(Notification, notification)
 
        notification = Notification.guess_instance(notification)
 

	
 
        return UserNotification.query() \
 
            .filter(UserNotification.notification == notification) \
kallithea/model/pull_request.py
Show inline comments
 
@@ -197,7 +197,7 @@ class PullRequestModel(BaseModel):
 

	
 
    def update_reviewers(self, user, pull_request, reviewers_ids):
 
        reviewers_ids = set(reviewers_ids)
 
        pull_request = self._get_instance(PullRequest, pull_request)
 
        pull_request = PullRequest.guess_instance(pull_request)
 
        current_reviewers = PullRequestReviewers.query() \
 
            .options(joinedload('user')) \
 
            .filter_by(pull_request=pull_request) \
 
@@ -220,11 +220,11 @@ class PullRequestModel(BaseModel):
 
                Session().delete(prr)
 

	
 
    def delete(self, pull_request):
 
        pull_request = self._get_instance(PullRequest, pull_request)
 
        pull_request = PullRequest.guess_instance(pull_request)
 
        Session().delete(pull_request)
 

	
 
    def close_pull_request(self, pull_request):
 
        pull_request = self._get_instance(PullRequest, pull_request)
 
        pull_request = PullRequest.guess_instance(pull_request)
 
        pull_request.status = PullRequest.STATUS_CLOSED
 
        pull_request.updated_on = datetime.datetime.now()
 
        Session().add(pull_request)
kallithea/model/repo.py
Show inline comments
 
@@ -59,11 +59,11 @@ class RepoModel(BaseModel):
 
    URL_SEPARATOR = Repository.url_sep()
 

	
 
    def _get_user_group(self, users_group):
 
        return self._get_instance(UserGroup, users_group,
 
        return UserGroup.guess_instance(users_group,
 
                                  callback=UserGroup.get_by_group_name)
 

	
 
    def _get_repo_group(self, repo_group):
 
        return self._get_instance(RepoGroup, repo_group,
 
        return RepoGroup.guess_instance(repo_group,
 
                                  callback=RepoGroup.get_by_group_name)
 

	
 
    def _create_default_perms(self, repository, private):
kallithea/model/repo_group.py
Show inline comments
 
@@ -44,11 +44,11 @@ log = logging.getLogger(__name__)
 
class RepoGroupModel(BaseModel):
 

	
 
    def _get_user_group(self, users_group):
 
        return self._get_instance(UserGroup, users_group,
 
        return UserGroup.guess_instance(users_group,
 
                                  callback=UserGroup.get_by_group_name)
 

	
 
    def _get_repo_group(self, repo_group):
 
        return self._get_instance(RepoGroup, repo_group,
 
        return RepoGroup.guess_instance(repo_group,
 
                                  callback=RepoGroup.get_by_group_name)
 

	
 
    @LazyProperty
kallithea/model/user_group.py
Show inline comments
 
@@ -40,7 +40,7 @@ log = logging.getLogger(__name__)
 
class UserGroupModel(BaseModel):
 

	
 
    def _get_user_group(self, user_group):
 
        return self._get_instance(UserGroup, user_group,
 
        return UserGroup.guess_instance(user_group,
 
                                  callback=UserGroup.get_by_group_name)
 

	
 
    def _create_default_perms(self, user_group):
0 comments (0 inline, 0 general)