Mercurial > kallithea
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) |