comparison rhodecode/model/changeset_status.py @ 2677:4fbbc65e8cd5 beta

Forbid changing changset status when it is associated with a closed pull request - fixed some issues with cascade deleting repos with changeset statuses attached
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 30 Jul 2012 23:29:03 +0200
parents 17893d61792a
children 9640c1c6399b
comparison
equal deleted inserted replaced
2676:1f4d4b8d72f5 2677:4fbbc65e8cd5
26 import logging 26 import logging
27 from collections import defaultdict 27 from collections import defaultdict
28 28
29 from rhodecode.model import BaseModel 29 from rhodecode.model import BaseModel
30 from rhodecode.model.db import ChangesetStatus, PullRequest 30 from rhodecode.model.db import ChangesetStatus, PullRequest
31 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
31 32
32 log = logging.getLogger(__name__) 33 log = logging.getLogger(__name__)
33 34
34 35
35 class ChangesetStatusModel(BaseModel): 36 class ChangesetStatusModel(BaseModel):
109 status = status.status if status else status 110 status = status.status if status else status
110 st = status or ChangesetStatus.DEFAULT 111 st = status or ChangesetStatus.DEFAULT
111 return str(st) 112 return str(st)
112 113
113 def set_status(self, repo, status, user, comment, revision=None, 114 def set_status(self, repo, status, user, comment, revision=None,
114 pull_request=None): 115 pull_request=None, dont_allow_on_closed_pull_request=False):
115 """ 116 """
116 Creates new status for changeset or updates the old ones bumping their 117 Creates new status for changeset or updates the old ones bumping their
117 version, leaving the current status at 118 version, leaving the current status at
118 119
119 :param repo: 120 :param repo:
124 :type status: 125 :type status:
125 :param user: 126 :param user:
126 :type user: 127 :type user:
127 :param comment: 128 :param comment:
128 :type comment: 129 :type comment:
130 :param dont_allow_on_closed_pull_request: don't allow a status change
131 if last status was for pull request and it's closed. We shouldn't
132 mess around this manually
129 """ 133 """
130 repo = self._get_repo(repo) 134 repo = self._get_repo(repo)
131 135
132 q = ChangesetStatus.query() 136 q = ChangesetStatus.query()
133 137
137 elif pull_request: 141 elif pull_request:
138 pull_request = self.__get_pull_request(pull_request) 142 pull_request = self.__get_pull_request(pull_request)
139 q = q.filter(ChangesetStatus.repo == pull_request.org_repo) 143 q = q.filter(ChangesetStatus.repo == pull_request.org_repo)
140 q = q.filter(ChangesetStatus.pull_request == pull_request) 144 q = q.filter(ChangesetStatus.pull_request == pull_request)
141 cur_statuses = q.all() 145 cur_statuses = q.all()
146
147 #if statuses exists and last is associated with a closed pull request
148 # we need to check if we can allow this status change
149 if (dont_allow_on_closed_pull_request and cur_statuses
150 and cur_statuses[0].pull_request.status == PullRequest.STATUS_CLOSED):
151 raise StatusChangeOnClosedPullRequestError(
152 'Changing status on closed pull request is not allowed'
153 )
142 154
143 if cur_statuses: 155 if cur_statuses:
144 for st in cur_statuses: 156 for st in cur_statuses:
145 st.version += 1 157 st.version += 1
146 self.sa.add(st) 158 self.sa.add(st)