##// END OF EJS Templates
added isoformat() that removes space from the renamed directory
marcink -
r1020:26114d18 beta
parent child Browse files
Show More
@@ -1,329 +1,330 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.repo
4 4 ~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Repository model for rhodecode
7 7
8 8 :created_on: Jun 5, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 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
14 14 # modify it under the terms of the GNU General Public License
15 15 # as published by the Free Software Foundation; version 2
16 16 # of the License or (at your opinion) any later version of the license.
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, write to the Free Software
25 25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26 26 # MA 02110-1301, USA.
27 27 import os
28 28 import shutil
29 29 import logging
30 30 import traceback
31 31 from datetime import datetime
32 32
33 33 from rhodecode.model import BaseModel
34 34 from rhodecode.model.caching_query import FromCache
35 35 from rhodecode.model.db import Repository, RepoToPerm, User, Permission, \
36 36 Statistics, UsersGroup, UsersGroupToPerm
37 37 from rhodecode.model.user import UserModel
38 38 from rhodecode.model.users_group import UsersGroupMember, UsersGroupModel
39 39
40 40 from vcs.backends import get_backend
41 41
42 42 log = logging.getLogger(__name__)
43 43
44 44 class RepoModel(BaseModel):
45 45
46 46 def __init__(self, sa=None):
47 47 try:
48 48 from pylons import app_globals
49 49 self._base_path = app_globals.base_path
50 50 except:
51 51 self._base_path = None
52 52
53 53 super(RepoModel, self).__init__(sa)
54 54
55 55 @property
56 56 def base_path(self):
57 57 if self._base_path is None:
58 58 raise Exception('Base Path is empty, try set this after'
59 59 'class initialization when not having '
60 60 'app_globals available')
61 61 return self._base_path
62 62
63 63 super(RepoModel, self).__init__()
64 64
65 65
66 66 def get(self, repo_id, cache=False):
67 67 repo = self.sa.query(Repository)\
68 68 .filter(Repository.repo_id == repo_id)
69 69
70 70 if cache:
71 71 repo = repo.options(FromCache("sql_cache_short",
72 72 "get_repo_%s" % repo_id))
73 73 return repo.scalar()
74 74
75 75
76 76 def get_by_repo_name(self, repo_name, cache=False):
77 77 repo = self.sa.query(Repository)\
78 78 .filter(Repository.repo_name == repo_name)
79 79
80 80 if cache:
81 81 repo = repo.options(FromCache("sql_cache_short",
82 82 "get_repo_%s" % repo_name))
83 83 return repo.scalar()
84 84
85 85 def get_users_js(self):
86 86
87 87 users = self.sa.query(User).filter(User.active == True).all()
88 88 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
89 89 users_array = '[%s]' % '\n'.join([u_tmpl % (u.user_id, u.name,
90 90 u.lastname, u.username)
91 91 for u in users])
92 92 return users_array
93 93
94 94
95 95 def get_users_groups_js(self):
96 96 users_groups = self.sa.query(UsersGroup)\
97 97 .filter(UsersGroup.users_group_active == True).all()
98 98
99 99 g_tmpl = '''{id:%s, grname:"%s",grmembers:"%s"},'''
100 100
101 101 users_groups_array = '[%s]' % '\n'.join([g_tmpl % \
102 102 (gr.users_group_id, gr.users_group_name,
103 103 len(gr.members))
104 104 for gr in users_groups])
105 105 return users_groups_array
106 106
107 107 def update(self, repo_name, form_data):
108 108 try:
109 109 cur_repo = self.get_by_repo_name(repo_name, cache=False)
110 110 user_model = UserModel(self.sa)
111 111 users_group_model = UsersGroupModel(self.sa)
112 112
113 113 #update permissions
114 114 for member, perm, member_type in form_data['perms_updates']:
115 115 if member_type == 'user':
116 116 r2p = self.sa.query(RepoToPerm)\
117 117 .filter(RepoToPerm.user == user_model.get_by_username(member))\
118 118 .filter(RepoToPerm.repository == cur_repo)\
119 119 .one()
120 120
121 121 r2p.permission = self.sa.query(Permission)\
122 122 .filter(Permission.permission_name == perm)\
123 123 .scalar()
124 124 self.sa.add(r2p)
125 125 else:
126 126 g2p = self.sa.query(UsersGroupToPerm)\
127 127 .filter(UsersGroupToPerm.users_group == users_group_model.get_by_groupname(member))\
128 128 .filter(UsersGroupToPerm.repository == cur_repo)\
129 129 .one()
130 130
131 131 g2p.permission = self.sa.query(Permission)\
132 132 .filter(Permission.permission_name == perm)\
133 133 .scalar()
134 134 self.sa.add(g2p)
135 135
136 136 #set new permissions
137 137 for member, perm, member_type in form_data['perms_new']:
138 138 if member_type == 'user':
139 139 r2p = RepoToPerm()
140 140 r2p.repository = cur_repo
141 141 r2p.user = user_model.get_by_username(member)
142 142
143 143 r2p.permission = self.sa.query(Permission)\
144 144 .filter(Permission.permission_name == perm)\
145 145 .scalar()
146 146 self.sa.add(r2p)
147 147 else:
148 148 g2p = UsersGroupToPerm()
149 149 g2p.repository = cur_repo
150 150 g2p.users_group = users_group_model.get_by_groupname(member)
151 151
152 152 g2p.permission = self.sa.query(Permission)\
153 153 .filter(Permission.permission_name == perm)\
154 154 .scalar()
155 155 self.sa.add(g2p)
156 156
157 157 #update current repo
158 158 for k, v in form_data.items():
159 159 if k == 'user':
160 160 cur_repo.user = user_model.get(v)
161 161 else:
162 162 setattr(cur_repo, k, v)
163 163
164 164 self.sa.add(cur_repo)
165 165
166 166 if repo_name != form_data['repo_name']:
167 167 #rename our data
168 168 self.__rename_repo(repo_name, form_data['repo_name'])
169 169
170 170 self.sa.commit()
171 171 except:
172 172 log.error(traceback.format_exc())
173 173 self.sa.rollback()
174 174 raise
175 175
176 176 def create(self, form_data, cur_user, just_db=False, fork=False):
177 177 try:
178 178 if fork:
179 179 #force str since hg doesn't go with unicode
180 180 repo_name = str(form_data['fork_name'])
181 181 org_name = str(form_data['repo_name'])
182 182
183 183 else:
184 184 org_name = repo_name = str(form_data['repo_name'])
185 185 new_repo = Repository()
186 186 new_repo.enable_statistics = True
187 187 for k, v in form_data.items():
188 188 if k == 'repo_name':
189 189 v = repo_name
190 190 setattr(new_repo, k, v)
191 191
192 192 if fork:
193 193 parent_repo = self.sa.query(Repository)\
194 194 .filter(Repository.repo_name == org_name).scalar()
195 195 new_repo.fork = parent_repo
196 196
197 197 new_repo.user_id = cur_user.user_id
198 198 self.sa.add(new_repo)
199 199
200 200 #create default permission
201 201 repo_to_perm = RepoToPerm()
202 202 default = 'repository.read'
203 203 for p in UserModel(self.sa).get_by_username('default', cache=False).user_perms:
204 204 if p.permission.permission_name.startswith('repository.'):
205 205 default = p.permission.permission_name
206 206 break
207 207
208 208 default_perm = 'repository.none' if form_data['private'] else default
209 209
210 210 repo_to_perm.permission_id = self.sa.query(Permission)\
211 211 .filter(Permission.permission_name == default_perm)\
212 212 .one().permission_id
213 213
214 214 repo_to_perm.repository_id = new_repo.repo_id
215 215 repo_to_perm.user_id = UserModel(self.sa)\
216 216 .get_by_username('default', cache=False).user_id
217 217
218 218 self.sa.add(repo_to_perm)
219 219 self.sa.commit()
220 220
221 221
222 222 #now automatically start following this repository as owner
223 223 from rhodecode.model.scm import ScmModel
224 224 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
225 225 cur_user.user_id)
226 226
227 227 if not just_db:
228 228 self.__create_repo(repo_name, form_data['repo_type'])
229 229 except:
230 230 log.error(traceback.format_exc())
231 231 self.sa.rollback()
232 232 raise
233 233
234 234 def create_fork(self, form_data, cur_user):
235 235 from rhodecode.lib.celerylib import tasks, run_task
236 236 run_task(tasks.create_repo_fork, form_data, cur_user)
237 237
238 238 def delete(self, repo):
239 239 try:
240 240 self.sa.delete(repo)
241 241 self.__delete_repo(repo)
242 242 self.sa.commit()
243 243 except:
244 244 log.error(traceback.format_exc())
245 245 self.sa.rollback()
246 246 raise
247 247
248 248 def delete_perm_user(self, form_data, repo_name):
249 249 try:
250 250 self.sa.query(RepoToPerm)\
251 251 .filter(RepoToPerm.repository \
252 252 == self.get_by_repo_name(repo_name))\
253 253 .filter(RepoToPerm.user_id == form_data['user_id']).delete()
254 254 self.sa.commit()
255 255 except:
256 256 log.error(traceback.format_exc())
257 257 self.sa.rollback()
258 258 raise
259 259
260 260 def delete_perm_users_group(self, form_data, repo_name):
261 261 try:
262 262 self.sa.query(UsersGroupToPerm)\
263 263 .filter(UsersGroupToPerm.repository \
264 264 == self.get_by_repo_name(repo_name))\
265 265 .filter(UsersGroupToPerm.users_group_id \
266 266 == form_data['users_group_id']).delete()
267 267 self.sa.commit()
268 268 except:
269 269 log.error(traceback.format_exc())
270 270 self.sa.rollback()
271 271 raise
272 272
273 273 def delete_stats(self, repo_name):
274 274 try:
275 275 self.sa.query(Statistics)\
276 276 .filter(Statistics.repository == \
277 277 self.get_by_repo_name(repo_name)).delete()
278 278 self.sa.commit()
279 279 except:
280 280 log.error(traceback.format_exc())
281 281 self.sa.rollback()
282 282 raise
283 283
284 284
285 285 def __create_repo(self, repo_name, alias):
286 286 """
287 287 makes repository on filesystem
288 288 :param repo_name:
289 289 :param alias:
290 290 """
291 291 from rhodecode.lib.utils import check_repo
292 292 repo_path = os.path.join(self.base_path, repo_name)
293 293 if check_repo(repo_name, self.base_path):
294 294 log.info('creating repo %s in %s', repo_name, repo_path)
295 295 backend = get_backend(alias)
296 296 backend(repo_path, create=True)
297 297
298 298 def __rename_repo(self, old, new):
299 299 """
300 300 renames repository on filesystem
301 301 :param old: old name
302 302 :param new: new name
303 303 """
304 304 log.info('renaming repo from %s to %s', old, new)
305 305
306 306 old_path = os.path.join(self.base_path, old)
307 307 new_path = os.path.join(self.base_path, new)
308 308 if os.path.isdir(new_path):
309 309 raise Exception('Was trying to rename to already existing dir %s',
310 310 new_path)
311 311 shutil.move(old_path, new_path)
312 312
313 313 def __delete_repo(self, repo):
314 314 """
315 315 removes repo from filesystem, the removal is acctually made by
316 316 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
317 317 repository is no longer valid for rhodecode, can be undeleted later on
318 318 by reverting the renames on this repository
319 319 :param repo: repo object
320 320 """
321 321 rm_path = os.path.join(self.base_path, repo.repo_name)
322 322 log.info("Removing %s", rm_path)
323 323 #disable hg/git
324 324 alias = repo.repo_type
325 325 shutil.move(os.path.join(rm_path, '.%s' % alias),
326 326 os.path.join(rm_path, 'rm__.%s' % alias))
327 327 #disable repo
328 328 shutil.move(rm_path, os.path.join(self.base_path, 'rm__%s__%s' \
329 % (datetime.today(), repo.repo_name)))
329 % (datetime.today().isoformat(),
330 repo.repo_name)))
General Comments 0
You need to be logged in to leave comments. Login now