##// END OF EJS Templates
stay on repo after forking and show full path to new fork...
Mads Kiilerich -
r3566:5068bb49 beta
parent child Browse files
Show More
@@ -1,185 +1,185 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.controllers.forks
4 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 5
6 6 forks controller for rhodecode
7 7
8 8 :created_on: Apr 23, 2011
9 9 :author: marcink
10 10 :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25 import logging
26 26 import formencode
27 27 import traceback
28 28 from formencode import htmlfill
29 29
30 30 from pylons import tmpl_context as c, request, url
31 31 from pylons.controllers.util import redirect
32 32 from pylons.i18n.translation import _
33 33
34 34 import rhodecode.lib.helpers as h
35 35
36 36 from rhodecode.lib.helpers import Page
37 37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator, \
38 38 NotAnonymous, HasRepoPermissionAny, HasPermissionAllDecorator,\
39 39 HasPermissionAnyDecorator
40 40 from rhodecode.lib.base import BaseRepoController, render
41 41 from rhodecode.model.db import Repository, RepoGroup, UserFollowing, User
42 42 from rhodecode.model.repo import RepoModel
43 43 from rhodecode.model.forms import RepoForkForm
44 44 from rhodecode.model.scm import ScmModel, GroupList
45 45 from rhodecode.lib.utils2 import safe_int
46 46
47 47 log = logging.getLogger(__name__)
48 48
49 49
50 50 class ForksController(BaseRepoController):
51 51
52 52 @LoginRequired()
53 53 def __before__(self):
54 54 super(ForksController, self).__before__()
55 55
56 56 def __load_defaults(self):
57 57 acl_groups = GroupList(RepoGroup.query().all(),
58 58 perm_set=['group.write', 'group.admin'])
59 59 c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
60 60 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
61 61 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
62 62 c.landing_revs_choices = choices
63 63
64 64 def __load_data(self, repo_name=None):
65 65 """
66 66 Load defaults settings for edit, and update
67 67
68 68 :param repo_name:
69 69 """
70 70 self.__load_defaults()
71 71
72 72 c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
73 73 repo = db_repo.scm_instance
74 74
75 75 if c.repo_info is None:
76 76 h.not_mapped_error(repo_name)
77 77 return redirect(url('repos'))
78 78
79 79 c.default_user_id = User.get_by_username('default').user_id
80 80 c.in_public_journal = UserFollowing.query()\
81 81 .filter(UserFollowing.user_id == c.default_user_id)\
82 82 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
83 83
84 84 if c.repo_info.stats:
85 85 last_rev = c.repo_info.stats.stat_on_revision+1
86 86 else:
87 87 last_rev = 0
88 88 c.stats_revision = last_rev
89 89
90 90 c.repo_last_rev = repo.count() if repo.revisions else 0
91 91
92 92 if last_rev == 0 or c.repo_last_rev == 0:
93 93 c.stats_percentage = 0
94 94 else:
95 95 c.stats_percentage = '%.2f' % ((float((last_rev)) /
96 96 c.repo_last_rev) * 100)
97 97
98 98 defaults = RepoModel()._get_defaults(repo_name)
99 99 # alter the description to indicate a fork
100 100 defaults['description'] = ('fork of repository: %s \n%s'
101 101 % (defaults['repo_name'],
102 102 defaults['description']))
103 103 # add suffix to fork
104 104 defaults['repo_name'] = '%s-fork' % defaults['repo_name']
105 105
106 106 return defaults
107 107
108 108 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
109 109 'repository.admin')
110 110 def forks(self, repo_name):
111 111 p = safe_int(request.params.get('page', 1), 1)
112 112 repo_id = c.rhodecode_db_repo.repo_id
113 113 d = []
114 114 for r in Repository.get_repo_forks(repo_id):
115 115 if not HasRepoPermissionAny(
116 116 'repository.read', 'repository.write', 'repository.admin'
117 117 )(r.repo_name, 'get forks check'):
118 118 continue
119 119 d.append(r)
120 120 c.forks_pager = Page(d, page=p, items_per_page=20)
121 121
122 122 c.forks_data = render('/forks/forks_data.html')
123 123
124 124 if request.environ.get('HTTP_X_PARTIAL_XHR'):
125 125 return c.forks_data
126 126
127 127 return render('/forks/forks.html')
128 128
129 129 @NotAnonymous()
130 130 @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
131 131 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
132 132 'repository.admin')
133 133 def fork(self, repo_name):
134 134 c.repo_info = Repository.get_by_repo_name(repo_name)
135 135 if not c.repo_info:
136 136 h.not_mapped_error(repo_name)
137 137 return redirect(url('home'))
138 138
139 139 defaults = self.__load_data(repo_name)
140 140
141 141 return htmlfill.render(
142 142 render('forks/fork.html'),
143 143 defaults=defaults,
144 144 encoding="UTF-8",
145 145 force_defaults=False
146 146 )
147 147
148 148 @NotAnonymous()
149 149 @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
150 150 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
151 151 'repository.admin')
152 152 def fork_create(self, repo_name):
153 153 self.__load_defaults()
154 154 c.repo_info = Repository.get_by_repo_name(repo_name)
155 155 _form = RepoForkForm(old_data={'repo_type': c.repo_info.repo_type},
156 156 repo_groups=c.repo_groups_choices,
157 157 landing_revs=c.landing_revs_choices)()
158 158 form_result = {}
159 159 try:
160 160 form_result = _form.to_python(dict(request.POST))
161 161
162 162 # create fork is done sometimes async on celery, db transaction
163 163 # management is handled there.
164 164 RepoModel().create_fork(form_result, self.rhodecode_user.user_id)
165 fork_url = h.link_to(form_result['repo_name'],
165 fork_url = h.link_to(form_result['repo_name_full'],
166 166 h.url('summary_home', repo_name=form_result['repo_name_full']))
167 167
168 168 h.flash(h.literal(_('Forked repository %s as %s') \
169 169 % (repo_name, fork_url)),
170 170 category='success')
171 171 except formencode.Invalid, errors:
172 172 c.new_repo = errors.value['repo_name']
173 173
174 174 return htmlfill.render(
175 175 render('forks/fork.html'),
176 176 defaults=errors.value,
177 177 errors=errors.error_dict or {},
178 178 prefix_error=False,
179 179 encoding="UTF-8")
180 180 except Exception:
181 181 log.error(traceback.format_exc())
182 182 h.flash(_('An error occurred during repository forking %s') %
183 183 repo_name, category='error')
184 184
185 return redirect(url('home'))
185 return redirect(h.url('summary_home', repo_name=repo_name))
General Comments 0
You need to be logged in to leave comments. Login now