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