##// END OF EJS Templates
Remove dead code
Nicolas VINOT -
r1585:56276c71 beta
parent child Browse files
Show More
@@ -1,1054 +1,1015 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.model.db
3 rhodecode.model.db
4 ~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~
5
5
6 Database Models for RhodeCode
6 Database Models for RhodeCode
7
7
8 :created_on: Apr 08, 2010
8 :created_on: Apr 08, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2009-2011 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
25
26 import os
26 import os
27 import logging
27 import logging
28 import datetime
28 import datetime
29 import traceback
29 import traceback
30 from datetime import date
30 from datetime import date
31
31
32 from sqlalchemy import *
32 from sqlalchemy import *
33 from sqlalchemy.exc import DatabaseError
33 from sqlalchemy.exc import DatabaseError
34 from sqlalchemy.orm import relationship, backref, joinedload, class_mapper
34 from sqlalchemy.orm import relationship, backref, joinedload, class_mapper
35 from sqlalchemy.orm.interfaces import MapperExtension
35 from sqlalchemy.orm.interfaces import MapperExtension
36
36
37 from beaker.cache import cache_region, region_invalidate
37 from beaker.cache import cache_region, region_invalidate
38
38
39 from vcs import get_backend
39 from vcs import get_backend
40 from vcs.utils.helpers import get_scm
40 from vcs.utils.helpers import get_scm
41 from vcs.exceptions import VCSError
41 from vcs.exceptions import VCSError
42 from vcs.utils.lazy import LazyProperty
42 from vcs.utils.lazy import LazyProperty
43
43
44 from rhodecode.lib.exceptions import UsersGroupsAssignedException
44 from rhodecode.lib.exceptions import UsersGroupsAssignedException
45 from rhodecode.lib import str2bool, json, safe_str, get_changeset_safe,\
45 from rhodecode.lib import str2bool, json, safe_str, get_changeset_safe,\
46 generate_api_key
46 generate_api_key
47
47
48 from rhodecode.model.meta import Base, Session
48 from rhodecode.model.meta import Base, Session
49 from rhodecode.model.caching_query import FromCache
49 from rhodecode.model.caching_query import FromCache
50
50
51 log = logging.getLogger(__name__)
51 log = logging.getLogger(__name__)
52
52
53 #==============================================================================
53 #==============================================================================
54 # BASE CLASSES
54 # BASE CLASSES
55 #==============================================================================
55 #==============================================================================
56
56
57 class ModelSerializer(json.JSONEncoder):
57 class ModelSerializer(json.JSONEncoder):
58 """
58 """
59 Simple Serializer for JSON,
59 Simple Serializer for JSON,
60
60
61 usage::
61 usage::
62
62
63 to make object customized for serialization implement a __json__
63 to make object customized for serialization implement a __json__
64 method that will return a dict for serialization into json
64 method that will return a dict for serialization into json
65
65
66 example::
66 example::
67
67
68 class Task(object):
68 class Task(object):
69
69
70 def __init__(self, name, value):
70 def __init__(self, name, value):
71 self.name = name
71 self.name = name
72 self.value = value
72 self.value = value
73
73
74 def __json__(self):
74 def __json__(self):
75 return dict(name=self.name,
75 return dict(name=self.name,
76 value=self.value)
76 value=self.value)
77
77
78 """
78 """
79
79
80 def default(self, obj):
80 def default(self, obj):
81
81
82 if hasattr(obj, '__json__'):
82 if hasattr(obj, '__json__'):
83 return obj.__json__()
83 return obj.__json__()
84 else:
84 else:
85 return json.JSONEncoder.default(self, obj)
85 return json.JSONEncoder.default(self, obj)
86
86
87 class BaseModel(object):
87 class BaseModel(object):
88 """Base Model for all classess
88 """Base Model for all classess
89
89
90 """
90 """
91
91
92 @classmethod
92 @classmethod
93 def _get_keys(cls):
93 def _get_keys(cls):
94 """return column names for this model """
94 """return column names for this model """
95 return class_mapper(cls).c.keys()
95 return class_mapper(cls).c.keys()
96
96
97 def get_dict(self):
97 def get_dict(self):
98 """return dict with keys and values corresponding
98 """return dict with keys and values corresponding
99 to this model data """
99 to this model data """
100
100
101 d = {}
101 d = {}
102 for k in self._get_keys():
102 for k in self._get_keys():
103 d[k] = getattr(self, k)
103 d[k] = getattr(self, k)
104 return d
104 return d
105
105
106 def get_appstruct(self):
106 def get_appstruct(self):
107 """return list with keys and values tupples corresponding
107 """return list with keys and values tupples corresponding
108 to this model data """
108 to this model data """
109
109
110 l = []
110 l = []
111 for k in self._get_keys():
111 for k in self._get_keys():
112 l.append((k, getattr(self, k),))
112 l.append((k, getattr(self, k),))
113 return l
113 return l
114
114
115 def populate_obj(self, populate_dict):
115 def populate_obj(self, populate_dict):
116 """populate model with data from given populate_dict"""
116 """populate model with data from given populate_dict"""
117
117
118 for k in self._get_keys():
118 for k in self._get_keys():
119 if k in populate_dict:
119 if k in populate_dict:
120 setattr(self, k, populate_dict[k])
120 setattr(self, k, populate_dict[k])
121
121
122 @classmethod
122 @classmethod
123 def query(cls):
123 def query(cls):
124 return Session.query(cls)
124 return Session.query(cls)
125
125
126 @classmethod
126 @classmethod
127 def get(cls, id_):
127 def get(cls, id_):
128 return cls.query().get(id_)
128 return cls.query().get(id_)
129
129
130 @classmethod
130 @classmethod
131 def getAll(cls):
131 def getAll(cls):
132 return cls.query().all()
132 return cls.query().all()
133
133
134 @classmethod
134 @classmethod
135 def delete(cls, id_):
135 def delete(cls, id_):
136 obj = cls.query().get(id_)
136 obj = cls.query().get(id_)
137 Session.delete(obj)
137 Session.delete(obj)
138 Session.commit()
138 Session.commit()
139
139
140
140
141 class RhodeCodeSettings(Base, BaseModel):
141 class RhodeCodeSettings(Base, BaseModel):
142 __tablename__ = 'rhodecode_settings'
142 __tablename__ = 'rhodecode_settings'
143 __table_args__ = (UniqueConstraint('app_settings_name'), {'extend_existing':True})
143 __table_args__ = (UniqueConstraint('app_settings_name'), {'extend_existing':True})
144 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
144 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
145 app_settings_name = Column("app_settings_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
145 app_settings_name = Column("app_settings_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
146 app_settings_value = Column("app_settings_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
146 app_settings_value = Column("app_settings_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
147
147
148 def __init__(self, k='', v=''):
148 def __init__(self, k='', v=''):
149 self.app_settings_name = k
149 self.app_settings_name = k
150 self.app_settings_value = v
150 self.app_settings_value = v
151
151
152 def __repr__(self):
152 def __repr__(self):
153 return "<%s('%s:%s')>" % (self.__class__.__name__,
153 return "<%s('%s:%s')>" % (self.__class__.__name__,
154 self.app_settings_name, self.app_settings_value)
154 self.app_settings_name, self.app_settings_value)
155
155
156
156
157 @classmethod
157 @classmethod
158 def get_by_name(cls, ldap_key):
158 def get_by_name(cls, ldap_key):
159 return cls.query()\
159 return cls.query()\
160 .filter(cls.app_settings_name == ldap_key).scalar()
160 .filter(cls.app_settings_name == ldap_key).scalar()
161
161
162 @classmethod
162 @classmethod
163 def get_app_settings(cls, cache=False):
163 def get_app_settings(cls, cache=False):
164
164
165 ret = cls.query()
165 ret = cls.query()
166
166
167 if cache:
167 if cache:
168 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
168 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
169
169
170 if not ret:
170 if not ret:
171 raise Exception('Could not get application settings !')
171 raise Exception('Could not get application settings !')
172 settings = {}
172 settings = {}
173 for each in ret:
173 for each in ret:
174 settings['rhodecode_' + each.app_settings_name] = \
174 settings['rhodecode_' + each.app_settings_name] = \
175 each.app_settings_value
175 each.app_settings_value
176
176
177 return settings
177 return settings
178
178
179 @classmethod
179 @classmethod
180 def get_ldap_settings(cls, cache=False):
180 def get_ldap_settings(cls, cache=False):
181 ret = cls.query()\
181 ret = cls.query()\
182 .filter(cls.app_settings_name.startswith('ldap_'))\
182 .filter(cls.app_settings_name.startswith('ldap_'))\
183 .all()
183 .all()
184 fd = {}
184 fd = {}
185 for row in ret:
185 for row in ret:
186 fd.update({row.app_settings_name:row.app_settings_value})
186 fd.update({row.app_settings_name:row.app_settings_value})
187
187
188 fd.update({'ldap_active':str2bool(fd.get('ldap_active'))})
188 fd.update({'ldap_active':str2bool(fd.get('ldap_active'))})
189
189
190 return fd
190 return fd
191
191
192
192
193 class RhodeCodeUi(Base, BaseModel):
193 class RhodeCodeUi(Base, BaseModel):
194 __tablename__ = 'rhodecode_ui'
194 __tablename__ = 'rhodecode_ui'
195 __table_args__ = (UniqueConstraint('ui_key'), {'extend_existing':True})
195 __table_args__ = (UniqueConstraint('ui_key'), {'extend_existing':True})
196
196
197 HOOK_UPDATE = 'changegroup.update'
197 HOOK_UPDATE = 'changegroup.update'
198 HOOK_REPO_SIZE = 'changegroup.repo_size'
198 HOOK_REPO_SIZE = 'changegroup.repo_size'
199 HOOK_PUSH = 'pretxnchangegroup.push_logger'
199 HOOK_PUSH = 'pretxnchangegroup.push_logger'
200 HOOK_PULL = 'preoutgoing.pull_logger'
200 HOOK_PULL = 'preoutgoing.pull_logger'
201
201
202 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
202 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
203 ui_section = Column("ui_section", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
203 ui_section = Column("ui_section", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
204 ui_key = Column("ui_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
204 ui_key = Column("ui_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
205 ui_value = Column("ui_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
205 ui_value = Column("ui_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
206 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
206 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
207
207
208
208
209 @classmethod
209 @classmethod
210 def get_by_key(cls, key):
210 def get_by_key(cls, key):
211 return cls.query().filter(cls.ui_key == key)
211 return cls.query().filter(cls.ui_key == key)
212
212
213
213
214 @classmethod
214 @classmethod
215 def get_builtin_hooks(cls):
215 def get_builtin_hooks(cls):
216 q = cls.query()
216 q = cls.query()
217 q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE,
217 q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE,
218 cls.HOOK_REPO_SIZE,
218 cls.HOOK_REPO_SIZE,
219 cls.HOOK_PUSH, cls.HOOK_PULL]))
219 cls.HOOK_PUSH, cls.HOOK_PULL]))
220 return q.all()
220 return q.all()
221
221
222 @classmethod
222 @classmethod
223 def get_custom_hooks(cls):
223 def get_custom_hooks(cls):
224 q = cls.query()
224 q = cls.query()
225 q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE,
225 q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE,
226 cls.HOOK_REPO_SIZE,
226 cls.HOOK_REPO_SIZE,
227 cls.HOOK_PUSH, cls.HOOK_PULL]))
227 cls.HOOK_PUSH, cls.HOOK_PULL]))
228 q = q.filter(cls.ui_section == 'hooks')
228 q = q.filter(cls.ui_section == 'hooks')
229 return q.all()
229 return q.all()
230
230
231 @classmethod
231 @classmethod
232 def create_or_update_hook(cls, key, val):
232 def create_or_update_hook(cls, key, val):
233 new_ui = cls.get_by_key(key).scalar() or cls()
233 new_ui = cls.get_by_key(key).scalar() or cls()
234 new_ui.ui_section = 'hooks'
234 new_ui.ui_section = 'hooks'
235 new_ui.ui_active = True
235 new_ui.ui_active = True
236 new_ui.ui_key = key
236 new_ui.ui_key = key
237 new_ui.ui_value = val
237 new_ui.ui_value = val
238
238
239 Session.add(new_ui)
239 Session.add(new_ui)
240 Session.commit()
240 Session.commit()
241
241
242
242
243 class User(Base, BaseModel):
243 class User(Base, BaseModel):
244 __tablename__ = 'users'
244 __tablename__ = 'users'
245 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'extend_existing':True})
245 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'extend_existing':True})
246 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
246 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
247 username = Column("username", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
247 username = Column("username", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
248 password = Column("password", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
248 password = Column("password", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
249 active = Column("active", Boolean(), nullable=True, unique=None, default=None)
249 active = Column("active", Boolean(), nullable=True, unique=None, default=None)
250 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
250 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
251 name = Column("name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
251 name = Column("name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
252 lastname = Column("lastname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
252 lastname = Column("lastname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
253 email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
253 email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
254 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
254 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
255 ldap_dn = Column("ldap_dn", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
255 ldap_dn = Column("ldap_dn", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
256 api_key = Column("api_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
256 api_key = Column("api_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
257
257
258 user_log = relationship('UserLog', cascade='all')
258 user_log = relationship('UserLog', cascade='all')
259 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
259 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
260
260
261 repositories = relationship('Repository')
261 repositories = relationship('Repository')
262 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
262 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
263 repo_to_perm = relationship('RepoToPerm', primaryjoin='RepoToPerm.user_id==User.user_id', cascade='all')
263 repo_to_perm = relationship('RepoToPerm', primaryjoin='RepoToPerm.user_id==User.user_id', cascade='all')
264
264
265 group_member = relationship('UsersGroupMember', cascade='all')
265 group_member = relationship('UsersGroupMember', cascade='all')
266
266
267 @property
267 @property
268 def full_contact(self):
268 def full_contact(self):
269 return '%s %s <%s>' % (self.name, self.lastname, self.email)
269 return '%s %s <%s>' % (self.name, self.lastname, self.email)
270
270
271 @property
271 @property
272 def short_contact(self):
272 def short_contact(self):
273 return '%s %s' % (self.name, self.lastname)
273 return '%s %s' % (self.name, self.lastname)
274
274
275 @property
275 @property
276 def is_admin(self):
276 def is_admin(self):
277 return self.admin
277 return self.admin
278
278
279 def __repr__(self):
279 def __repr__(self):
280 try:
280 try:
281 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
281 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
282 self.user_id, self.username)
282 self.user_id, self.username)
283 except:
283 except:
284 return self.__class__.__name__
284 return self.__class__.__name__
285
285
286 @classmethod
286 @classmethod
287 def by_username(cls, username, case_insensitive=False):
287 def by_username(cls, username, case_insensitive=False):
288 if case_insensitive:
288 if case_insensitive:
289 return cls.query().filter(cls.username.like(username)).one()
289 return cls.query().filter(cls.username.like(username)).one()
290 else:
290 else:
291 return cls.query().filter(cls.username == username).one()
291 return cls.query().filter(cls.username == username).one()
292
292
293 @classmethod
293 @classmethod
294 def get_by_api_key(cls, api_key):
294 def get_by_api_key(cls, api_key):
295 return cls.query().filter(cls.api_key == api_key).one()
295 return cls.query().filter(cls.api_key == api_key).one()
296
296
297 def update_lastlogin(self):
297 def update_lastlogin(self):
298 """Update user lastlogin"""
298 """Update user lastlogin"""
299
299
300 self.last_login = datetime.datetime.now()
300 self.last_login = datetime.datetime.now()
301 Session.add(self)
301 Session.add(self)
302 Session.commit()
302 Session.commit()
303 log.debug('updated user %s lastlogin', self.username)
303 log.debug('updated user %s lastlogin', self.username)
304
304
305 @classmethod
305 @classmethod
306 def create(cls, form_data):
306 def create(cls, form_data):
307 from rhodecode.lib.auth import get_crypt_password
307 from rhodecode.lib.auth import get_crypt_password
308
308
309 try:
309 try:
310 new_user = cls()
310 new_user = cls()
311 for k, v in form_data.items():
311 for k, v in form_data.items():
312 if k == 'password':
312 if k == 'password':
313 v = get_crypt_password(v)
313 v = get_crypt_password(v)
314 setattr(new_user, k, v)
314 setattr(new_user, k, v)
315
315
316 new_user.api_key = generate_api_key(form_data['username'])
316 new_user.api_key = generate_api_key(form_data['username'])
317 Session.add(new_user)
317 Session.add(new_user)
318 Session.commit()
318 Session.commit()
319 return new_user
319 return new_user
320 except:
320 except:
321 log.error(traceback.format_exc())
321 log.error(traceback.format_exc())
322 Session.rollback()
322 Session.rollback()
323 raise
323 raise
324
324
325 class UserLog(Base, BaseModel):
325 class UserLog(Base, BaseModel):
326 __tablename__ = 'user_logs'
326 __tablename__ = 'user_logs'
327 __table_args__ = {'extend_existing':True}
327 __table_args__ = {'extend_existing':True}
328 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
328 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
329 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
329 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
330 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
330 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
331 repository_name = Column("repository_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
331 repository_name = Column("repository_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
332 user_ip = Column("user_ip", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
332 user_ip = Column("user_ip", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
333 action = Column("action", UnicodeText(length=1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
333 action = Column("action", UnicodeText(length=1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
334 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
334 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
335
335
336 @property
336 @property
337 def action_as_day(self):
337 def action_as_day(self):
338 return date(*self.action_date.timetuple()[:3])
338 return date(*self.action_date.timetuple()[:3])
339
339
340 user = relationship('User')
340 user = relationship('User')
341 repository = relationship('Repository')
341 repository = relationship('Repository')
342
342
343
343
344 class UsersGroup(Base, BaseModel):
344 class UsersGroup(Base, BaseModel):
345 __tablename__ = 'users_groups'
345 __tablename__ = 'users_groups'
346 __table_args__ = {'extend_existing':True}
346 __table_args__ = {'extend_existing':True}
347
347
348 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
348 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
349 users_group_name = Column("users_group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
349 users_group_name = Column("users_group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
350 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
350 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
351
351
352 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
352 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
353
353
354 def __repr__(self):
354 def __repr__(self):
355 return '<userGroup(%s)>' % (self.users_group_name)
355 return '<userGroup(%s)>' % (self.users_group_name)
356
356
357 @classmethod
357 @classmethod
358 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
358 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
359 if case_insensitive:
359 if case_insensitive:
360 gr = cls.query()\
360 gr = cls.query()\
361 .filter(cls.users_group_name.ilike(group_name))
361 .filter(cls.users_group_name.ilike(group_name))
362 else:
362 else:
363 gr = cls.query()\
363 gr = cls.query()\
364 .filter(cls.users_group_name == group_name)
364 .filter(cls.users_group_name == group_name)
365 if cache:
365 if cache:
366 gr = gr.options(FromCache("sql_cache_short",
366 gr = gr.options(FromCache("sql_cache_short",
367 "get_user_%s" % group_name))
367 "get_user_%s" % group_name))
368 return gr.scalar()
368 return gr.scalar()
369
369
370
370
371 @classmethod
371 @classmethod
372 def get(cls, users_group_id, cache=False):
372 def get(cls, users_group_id, cache=False):
373 users_group = cls.query()
373 users_group = cls.query()
374 if cache:
374 if cache:
375 users_group = users_group.options(FromCache("sql_cache_short",
375 users_group = users_group.options(FromCache("sql_cache_short",
376 "get_users_group_%s" % users_group_id))
376 "get_users_group_%s" % users_group_id))
377 return users_group.get(users_group_id)
377 return users_group.get(users_group_id)
378
378
379 @classmethod
379 @classmethod
380 def create(cls, form_data):
380 def create(cls, form_data):
381 try:
381 try:
382 new_users_group = cls()
382 new_users_group = cls()
383 for k, v in form_data.items():
383 for k, v in form_data.items():
384 setattr(new_users_group, k, v)
384 setattr(new_users_group, k, v)
385
385
386 Session.add(new_users_group)
386 Session.add(new_users_group)
387 Session.commit()
387 Session.commit()
388 return new_users_group
388 return new_users_group
389 except:
389 except:
390 log.error(traceback.format_exc())
390 log.error(traceback.format_exc())
391 Session.rollback()
391 Session.rollback()
392 raise
392 raise
393
393
394 @classmethod
394 @classmethod
395 def update(cls, users_group_id, form_data):
395 def update(cls, users_group_id, form_data):
396
396
397 try:
397 try:
398 users_group = cls.get(users_group_id, cache=False)
398 users_group = cls.get(users_group_id, cache=False)
399
399
400 for k, v in form_data.items():
400 for k, v in form_data.items():
401 if k == 'users_group_members':
401 if k == 'users_group_members':
402 users_group.members = []
402 users_group.members = []
403 Session.flush()
403 Session.flush()
404 members_list = []
404 members_list = []
405 if v:
405 if v:
406 for u_id in set(v):
406 for u_id in set(v):
407 members_list.append(UsersGroupMember(
407 members_list.append(UsersGroupMember(
408 users_group_id,
408 users_group_id,
409 u_id))
409 u_id))
410 setattr(users_group, 'members', members_list)
410 setattr(users_group, 'members', members_list)
411 setattr(users_group, k, v)
411 setattr(users_group, k, v)
412
412
413 Session.add(users_group)
413 Session.add(users_group)
414 Session.commit()
414 Session.commit()
415 except:
415 except:
416 log.error(traceback.format_exc())
416 log.error(traceback.format_exc())
417 Session.rollback()
417 Session.rollback()
418 raise
418 raise
419
419
420 @classmethod
420 @classmethod
421 def delete(cls, users_group_id):
421 def delete(cls, users_group_id):
422 try:
422 try:
423
423
424 # check if this group is not assigned to repo
424 # check if this group is not assigned to repo
425 assigned_groups = UsersGroupRepoToPerm.query()\
425 assigned_groups = UsersGroupRepoToPerm.query()\
426 .filter(UsersGroupRepoToPerm.users_group_id ==
426 .filter(UsersGroupRepoToPerm.users_group_id ==
427 users_group_id).all()
427 users_group_id).all()
428
428
429 if assigned_groups:
429 if assigned_groups:
430 raise UsersGroupsAssignedException('Group assigned to %s' %
430 raise UsersGroupsAssignedException('Group assigned to %s' %
431 assigned_groups)
431 assigned_groups)
432
432
433 users_group = cls.get(users_group_id, cache=False)
433 users_group = cls.get(users_group_id, cache=False)
434 Session.delete(users_group)
434 Session.delete(users_group)
435 Session.commit()
435 Session.commit()
436 except:
436 except:
437 log.error(traceback.format_exc())
437 log.error(traceback.format_exc())
438 Session.rollback()
438 Session.rollback()
439 raise
439 raise
440
440
441
441
442 class UsersGroupMember(Base, BaseModel):
442 class UsersGroupMember(Base, BaseModel):
443 __tablename__ = 'users_groups_members'
443 __tablename__ = 'users_groups_members'
444 __table_args__ = {'extend_existing':True}
444 __table_args__ = {'extend_existing':True}
445
445
446 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
446 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
447 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
447 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
448 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
448 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
449
449
450 user = relationship('User', lazy='joined')
450 user = relationship('User', lazy='joined')
451 users_group = relationship('UsersGroup')
451 users_group = relationship('UsersGroup')
452
452
453 def __init__(self, gr_id='', u_id=''):
453 def __init__(self, gr_id='', u_id=''):
454 self.users_group_id = gr_id
454 self.users_group_id = gr_id
455 self.user_id = u_id
455 self.user_id = u_id
456
456
457 @classmethod
457 @classmethod
458 def create(cls, user, users_group):
458 def create(cls, user, users_group):
459 try:
459 try:
460 users_group_member = cls()
460 users_group_member = cls()
461 users_group_member.user = user
461 users_group_member.user = user
462 users_group_member.users_group = users_group
462 users_group_member.users_group = users_group
463
463
464 Session.add(users_group_member)
464 Session.add(users_group_member)
465 Session.commit()
465 Session.commit()
466 return users_group_member
466 return users_group_member
467 except:
467 except:
468 log.error(traceback.format_exc())
468 log.error(traceback.format_exc())
469 Session.rollback()
469 Session.rollback()
470 raise
470 raise
471
471
472
472
473 class Repository(Base, BaseModel):
473 class Repository(Base, BaseModel):
474 __tablename__ = 'repositories'
474 __tablename__ = 'repositories'
475 __table_args__ = (UniqueConstraint('repo_name'), {'extend_existing':True},)
475 __table_args__ = (UniqueConstraint('repo_name'), {'extend_existing':True},)
476
476
477 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
477 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
478 repo_name = Column("repo_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
478 repo_name = Column("repo_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
479 clone_uri = Column("clone_uri", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
479 clone_uri = Column("clone_uri", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
480 repo_type = Column("repo_type", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
480 repo_type = Column("repo_type", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
481 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
481 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
482 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
482 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
483 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
483 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
484 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
484 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
485 description = Column("description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
485 description = Column("description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
486 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
486 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
487
487
488 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
488 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
489 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
489 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
490
490
491
491
492 user = relationship('User')
492 user = relationship('User')
493 fork = relationship('Repository', remote_side=repo_id)
493 fork = relationship('Repository', remote_side=repo_id)
494 group = relationship('Group')
494 group = relationship('Group')
495 repo_to_perm = relationship('RepoToPerm', cascade='all', order_by='RepoToPerm.repo_to_perm_id')
495 repo_to_perm = relationship('RepoToPerm', cascade='all', order_by='RepoToPerm.repo_to_perm_id')
496 users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
496 users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
497 stats = relationship('Statistics', cascade='all', uselist=False)
497 stats = relationship('Statistics', cascade='all', uselist=False)
498
498
499 followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
499 followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
500
500
501 logs = relationship('UserLog', cascade='all')
501 logs = relationship('UserLog', cascade='all')
502
502
503 def __repr__(self):
503 def __repr__(self):
504 return "<%s('%s:%s')>" % (self.__class__.__name__,
504 return "<%s('%s:%s')>" % (self.__class__.__name__,
505 self.repo_id, self.repo_name)
505 self.repo_id, self.repo_name)
506
506
507 @staticmethod
508 def create(name, description, repo_type, private, owner, group, clone):
509 try:
510 repo = Repository()
511 repo.repo_name = name
512 repo.clone_uri = clone
513 repo.repo_type = repo_type
514 repo.user = owner
515 repo.private = private
516 repo.description = description
517 repo.group = group
518
519 Session.add(repo)
520 Session.commit()
521
522 RepoToPerm.create(repo, owner, Permission.get_by_name('repository.write'))
523 return repo
524 except:
525 log.error(traceback.format_exc())
526 Session.rollback()
527 raise
528
529 @classmethod
507 @classmethod
530 def by_repo_name(cls, repo_name):
508 def by_repo_name(cls, repo_name):
531 q = cls.query().filter(cls.repo_name == repo_name)
509 q = cls.query().filter(cls.repo_name == repo_name)
532
510
533 q = q.options(joinedload(Repository.fork))\
511 q = q.options(joinedload(Repository.fork))\
534 .options(joinedload(Repository.user))\
512 .options(joinedload(Repository.user))\
535 .options(joinedload(Repository.group))\
513 .options(joinedload(Repository.group))\
536
514
537 return q.one()
515 return q.one()
538
516
539 @classmethod
517 @classmethod
540 def get_repo_forks(cls, repo_id):
518 def get_repo_forks(cls, repo_id):
541 return cls.query().filter(Repository.fork_id == repo_id)
519 return cls.query().filter(Repository.fork_id == repo_id)
542
520
543 @classmethod
521 @classmethod
544 def base_path(cls):
522 def base_path(cls):
545 """
523 """
546 Returns base path when all repos are stored
524 Returns base path when all repos are stored
547
525
548 :param cls:
526 :param cls:
549 """
527 """
550 q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/')
528 q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/')
551 q.options(FromCache("sql_cache_short", "repository_repo_path"))
529 q.options(FromCache("sql_cache_short", "repository_repo_path"))
552 return q.one().ui_value
530 return q.one().ui_value
553
531
554 @property
532 @property
555 def just_name(self):
533 def just_name(self):
556 return self.repo_name.split(os.sep)[-1]
534 return self.repo_name.split(os.sep)[-1]
557
535
558 @property
536 @property
559 def groups_with_parents(self):
537 def groups_with_parents(self):
560 groups = []
538 groups = []
561 if self.group is None:
539 if self.group is None:
562 return groups
540 return groups
563
541
564 cur_gr = self.group
542 cur_gr = self.group
565 groups.insert(0, cur_gr)
543 groups.insert(0, cur_gr)
566 while 1:
544 while 1:
567 gr = getattr(cur_gr, 'parent_group', None)
545 gr = getattr(cur_gr, 'parent_group', None)
568 cur_gr = cur_gr.parent_group
546 cur_gr = cur_gr.parent_group
569 if gr is None:
547 if gr is None:
570 break
548 break
571 groups.insert(0, gr)
549 groups.insert(0, gr)
572
550
573 return groups
551 return groups
574
552
575 @property
553 @property
576 def groups_and_repo(self):
554 def groups_and_repo(self):
577 return self.groups_with_parents, self.just_name
555 return self.groups_with_parents, self.just_name
578
556
579 @LazyProperty
557 @LazyProperty
580 def repo_path(self):
558 def repo_path(self):
581 """
559 """
582 Returns base full path for that repository means where it actually
560 Returns base full path for that repository means where it actually
583 exists on a filesystem
561 exists on a filesystem
584 """
562 """
585 q = RhodeCodeUi.query().filter(RhodeCodeUi.ui_key == '/')
563 q = RhodeCodeUi.query().filter(RhodeCodeUi.ui_key == '/')
586 q.options(FromCache("sql_cache_short", "repository_repo_path"))
564 q.options(FromCache("sql_cache_short", "repository_repo_path"))
587 return q.one().ui_value
565 return q.one().ui_value
588
566
589 @property
567 @property
590 def repo_full_path(self):
568 def repo_full_path(self):
591 p = [self.repo_path]
569 p = [self.repo_path]
592 # we need to split the name by / since this is how we store the
570 # we need to split the name by / since this is how we store the
593 # names in the database, but that eventually needs to be converted
571 # names in the database, but that eventually needs to be converted
594 # into a valid system path
572 # into a valid system path
595 p += self.repo_name.split('/')
573 p += self.repo_name.split('/')
596 return os.path.join(*p)
574 return os.path.join(*p)
597
575
598 @property
576 @property
599 def _ui(self):
577 def _ui(self):
600 """
578 """
601 Creates an db based ui object for this repository
579 Creates an db based ui object for this repository
602 """
580 """
603 from mercurial import ui
581 from mercurial import ui
604 from mercurial import config
582 from mercurial import config
605 baseui = ui.ui()
583 baseui = ui.ui()
606
584
607 #clean the baseui object
585 #clean the baseui object
608 baseui._ocfg = config.config()
586 baseui._ocfg = config.config()
609 baseui._ucfg = config.config()
587 baseui._ucfg = config.config()
610 baseui._tcfg = config.config()
588 baseui._tcfg = config.config()
611
589
612
590
613 ret = RhodeCodeUi.query()\
591 ret = RhodeCodeUi.query()\
614 .options(FromCache("sql_cache_short", "repository_repo_ui")).all()
592 .options(FromCache("sql_cache_short", "repository_repo_ui")).all()
615
593
616 hg_ui = ret
594 hg_ui = ret
617 for ui_ in hg_ui:
595 for ui_ in hg_ui:
618 if ui_.ui_active:
596 if ui_.ui_active:
619 log.debug('settings ui from db[%s]%s:%s', ui_.ui_section,
597 log.debug('settings ui from db[%s]%s:%s', ui_.ui_section,
620 ui_.ui_key, ui_.ui_value)
598 ui_.ui_key, ui_.ui_value)
621 baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value)
599 baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value)
622
600
623 return baseui
601 return baseui
624
602
625 @classmethod
603 @classmethod
626 def is_valid(cls, repo_name):
604 def is_valid(cls, repo_name):
627 """
605 """
628 returns True if given repo name is a valid filesystem repository
606 returns True if given repo name is a valid filesystem repository
629
607
630 @param cls:
608 @param cls:
631 @param repo_name:
609 @param repo_name:
632 """
610 """
633 from rhodecode.lib.utils import is_valid_repo
611 from rhodecode.lib.utils import is_valid_repo
634
612
635 return is_valid_repo(repo_name, cls.base_path())
613 return is_valid_repo(repo_name, cls.base_path())
636
614
637
615
638 #==========================================================================
616 #==========================================================================
639 # SCM PROPERTIES
617 # SCM PROPERTIES
640 #==========================================================================
618 #==========================================================================
641
619
642 def get_changeset(self, rev):
620 def get_changeset(self, rev):
643 return get_changeset_safe(self.scm_instance, rev)
621 return get_changeset_safe(self.scm_instance, rev)
644
622
645 @property
623 @property
646 def tip(self):
624 def tip(self):
647 return self.get_changeset('tip')
625 return self.get_changeset('tip')
648
626
649 @property
627 @property
650 def author(self):
628 def author(self):
651 return self.tip.author
629 return self.tip.author
652
630
653 @property
631 @property
654 def last_change(self):
632 def last_change(self):
655 return self.scm_instance.last_change
633 return self.scm_instance.last_change
656
634
657 #==========================================================================
635 #==========================================================================
658 # SCM CACHE INSTANCE
636 # SCM CACHE INSTANCE
659 #==========================================================================
637 #==========================================================================
660
638
661 @property
639 @property
662 def invalidate(self):
640 def invalidate(self):
663 """
641 """
664 Returns Invalidation object if this repo should be invalidated
642 Returns Invalidation object if this repo should be invalidated
665 None otherwise. `cache_active = False` means that this cache
643 None otherwise. `cache_active = False` means that this cache
666 state is not valid and needs to be invalidated
644 state is not valid and needs to be invalidated
667 """
645 """
668 return CacheInvalidation.query()\
646 return CacheInvalidation.query()\
669 .filter(CacheInvalidation.cache_key == self.repo_name)\
647 .filter(CacheInvalidation.cache_key == self.repo_name)\
670 .filter(CacheInvalidation.cache_active == False)\
648 .filter(CacheInvalidation.cache_active == False)\
671 .scalar()
649 .scalar()
672
650
673 def set_invalidate(self):
651 def set_invalidate(self):
674 """
652 """
675 set a cache for invalidation for this instance
653 set a cache for invalidation for this instance
676 """
654 """
677 inv = CacheInvalidation.query()\
655 inv = CacheInvalidation.query()\
678 .filter(CacheInvalidation.cache_key == self.repo_name)\
656 .filter(CacheInvalidation.cache_key == self.repo_name)\
679 .scalar()
657 .scalar()
680
658
681 if inv is None:
659 if inv is None:
682 inv = CacheInvalidation(self.repo_name)
660 inv = CacheInvalidation(self.repo_name)
683 inv.cache_active = True
661 inv.cache_active = True
684 Session.add(inv)
662 Session.add(inv)
685 Session.commit()
663 Session.commit()
686
664
687 @LazyProperty
665 @LazyProperty
688 def scm_instance(self):
666 def scm_instance(self):
689 return self.__get_instance()
667 return self.__get_instance()
690
668
691 @property
669 @property
692 def scm_instance_cached(self):
670 def scm_instance_cached(self):
693 @cache_region('long_term')
671 @cache_region('long_term')
694 def _c(repo_name):
672 def _c(repo_name):
695 return self.__get_instance()
673 return self.__get_instance()
696
674
697 # TODO: remove this trick when beaker 1.6 is released
675 # TODO: remove this trick when beaker 1.6 is released
698 # and have fixed this issue with not supporting unicode keys
676 # and have fixed this issue with not supporting unicode keys
699 rn = safe_str(self.repo_name)
677 rn = safe_str(self.repo_name)
700
678
701 inv = self.invalidate
679 inv = self.invalidate
702 if inv is not None:
680 if inv is not None:
703 region_invalidate(_c, None, rn)
681 region_invalidate(_c, None, rn)
704 # update our cache
682 # update our cache
705 inv.cache_active = True
683 inv.cache_active = True
706 Session.add(inv)
684 Session.add(inv)
707 Session.commit()
685 Session.commit()
708
686
709 return _c(rn)
687 return _c(rn)
710
688
711 def __get_instance(self):
689 def __get_instance(self):
712
690
713 repo_full_path = self.repo_full_path
691 repo_full_path = self.repo_full_path
714
692
715 try:
693 try:
716 alias = get_scm(repo_full_path)[0]
694 alias = get_scm(repo_full_path)[0]
717 log.debug('Creating instance of %s repository', alias)
695 log.debug('Creating instance of %s repository', alias)
718 backend = get_backend(alias)
696 backend = get_backend(alias)
719 except VCSError:
697 except VCSError:
720 log.error(traceback.format_exc())
698 log.error(traceback.format_exc())
721 log.error('Perhaps this repository is in db and not in '
699 log.error('Perhaps this repository is in db and not in '
722 'filesystem run rescan repositories with '
700 'filesystem run rescan repositories with '
723 '"destroy old data " option from admin panel')
701 '"destroy old data " option from admin panel')
724 return
702 return
725
703
726 if alias == 'hg':
704 if alias == 'hg':
727
705
728 repo = backend(safe_str(repo_full_path), create=False,
706 repo = backend(safe_str(repo_full_path), create=False,
729 baseui=self._ui)
707 baseui=self._ui)
730 #skip hidden web repository
708 #skip hidden web repository
731 if repo._get_hidden():
709 if repo._get_hidden():
732 return
710 return
733 else:
711 else:
734 repo = backend(repo_full_path, create=False)
712 repo = backend(repo_full_path, create=False)
735
713
736 return repo
714 return repo
737
715
738
716
739 class Group(Base, BaseModel):
717 class Group(Base, BaseModel):
740 __tablename__ = 'groups'
718 __tablename__ = 'groups'
741 __table_args__ = (UniqueConstraint('group_name', 'group_parent_id'),
719 __table_args__ = (UniqueConstraint('group_name', 'group_parent_id'),
742 CheckConstraint('group_id != group_parent_id'), {'extend_existing':True},)
720 CheckConstraint('group_id != group_parent_id'), {'extend_existing':True},)
743 __mapper_args__ = {'order_by':'group_name'}
721 __mapper_args__ = {'order_by':'group_name'}
744
722
745 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
723 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
746 group_name = Column("group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
724 group_name = Column("group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
747 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
725 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
748 group_description = Column("group_description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
726 group_description = Column("group_description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
749
727
750 parent_group = relationship('Group', remote_side=group_id)
728 parent_group = relationship('Group', remote_side=group_id)
751
729
752
730
753 def __init__(self, group_name='', parent_group=None):
731 def __init__(self, group_name='', parent_group=None):
754 self.group_name = group_name
732 self.group_name = group_name
755 self.parent_group = parent_group
733 self.parent_group = parent_group
756
734
757 def __repr__(self):
735 def __repr__(self):
758 return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
736 return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
759 self.group_name)
737 self.group_name)
760
738
761 @classmethod
739 @classmethod
762 def url_sep(cls):
740 def url_sep(cls):
763 return '/'
741 return '/'
764
742
765 @classmethod
743 @classmethod
766 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
744 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
767 if case_insensitive:
745 if case_insensitive:
768 gr = cls.query()\
746 gr = cls.query()\
769 .filter(cls.group_name.ilike(group_name))
747 .filter(cls.group_name.ilike(group_name))
770 else:
748 else:
771 gr = cls.query()\
749 gr = cls.query()\
772 .filter(cls.group_name == group_name)
750 .filter(cls.group_name == group_name)
773 if cache:
751 if cache:
774 gr = gr.options(FromCache("sql_cache_short",
752 gr = gr.options(FromCache("sql_cache_short",
775 "get_group_%s" % group_name))
753 "get_group_%s" % group_name))
776 return gr.scalar()
754 return gr.scalar()
777
755
778 @property
756 @property
779 def parents(self):
757 def parents(self):
780 parents_recursion_limit = 5
758 parents_recursion_limit = 5
781 groups = []
759 groups = []
782 if self.parent_group is None:
760 if self.parent_group is None:
783 return groups
761 return groups
784 cur_gr = self.parent_group
762 cur_gr = self.parent_group
785 groups.insert(0, cur_gr)
763 groups.insert(0, cur_gr)
786 cnt = 0
764 cnt = 0
787 while 1:
765 while 1:
788 cnt += 1
766 cnt += 1
789 gr = getattr(cur_gr, 'parent_group', None)
767 gr = getattr(cur_gr, 'parent_group', None)
790 cur_gr = cur_gr.parent_group
768 cur_gr = cur_gr.parent_group
791 if gr is None:
769 if gr is None:
792 break
770 break
793 if cnt == parents_recursion_limit:
771 if cnt == parents_recursion_limit:
794 # this will prevent accidental infinit loops
772 # this will prevent accidental infinit loops
795 log.error('group nested more than %s' %
773 log.error('group nested more than %s' %
796 parents_recursion_limit)
774 parents_recursion_limit)
797 break
775 break
798
776
799 groups.insert(0, gr)
777 groups.insert(0, gr)
800 return groups
778 return groups
801
779
802 @property
780 @property
803 def children(self):
781 def children(self):
804 return Group.query().filter(Group.parent_group == self)
782 return Group.query().filter(Group.parent_group == self)
805
783
806 @property
784 @property
807 def full_path(self):
785 def full_path(self):
808 return Group.url_sep().join([g.group_name for g in self.parents] +
786 return Group.url_sep().join([g.group_name for g in self.parents] +
809 [self.group_name])
787 [self.group_name])
810
788
811 @property
789 @property
812 def repositories(self):
790 def repositories(self):
813 return Repository.query().filter(Repository.group == self)
791 return Repository.query().filter(Repository.group == self)
814
792
815 @property
793 @property
816 def repositories_recursive_count(self):
794 def repositories_recursive_count(self):
817 cnt = self.repositories.count()
795 cnt = self.repositories.count()
818
796
819 def children_count(group):
797 def children_count(group):
820 cnt = 0
798 cnt = 0
821 for child in group.children:
799 for child in group.children:
822 cnt += child.repositories.count()
800 cnt += child.repositories.count()
823 cnt += children_count(child)
801 cnt += children_count(child)
824 return cnt
802 return cnt
825
803
826 return cnt + children_count(self)
804 return cnt + children_count(self)
827
805
828 class Permission(Base, BaseModel):
806 class Permission(Base, BaseModel):
829 __tablename__ = 'permissions'
807 __tablename__ = 'permissions'
830 __table_args__ = {'extend_existing':True}
808 __table_args__ = {'extend_existing':True}
831 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
809 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
832 permission_name = Column("permission_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
810 permission_name = Column("permission_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
833 permission_longname = Column("permission_longname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
811 permission_longname = Column("permission_longname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
834
812
835 def __repr__(self):
813 def __repr__(self):
836 return "<%s('%s:%s')>" % (self.__class__.__name__,
814 return "<%s('%s:%s')>" % (self.__class__.__name__,
837 self.permission_id, self.permission_name)
815 self.permission_id, self.permission_name)
838
816
839 @classmethod
817 @classmethod
840 def get_by_key(cls, key):
818 def get_by_key(cls, key):
841 return cls.query().filter(cls.permission_name == key).scalar()
819 return cls.query().filter(cls.permission_name == key).scalar()
842
820
843 @classmethod
821 @classmethod
844 def get_by_name(cls, name):
822 def get_by_name(cls, name):
845 return cls.query().filter(cls.permission_name == name).one()
823 return cls.query().filter(cls.permission_name == name).one()
846
824
847 class RepoToPerm(Base, BaseModel):
825 class RepoToPerm(Base, BaseModel):
848 __tablename__ = 'repo_to_perm'
826 __tablename__ = 'repo_to_perm'
849 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'extend_existing':True})
827 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'extend_existing':True})
850 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
828 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
851 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
829 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
852 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
830 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
853 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
831 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
854
832
855 user = relationship('User')
833 user = relationship('User')
856 permission = relationship('Permission')
834 permission = relationship('Permission')
857 repository = relationship('Repository')
835 repository = relationship('Repository')
858
836
859 @staticmethod
860 def create(repo, user, p):
861 try:
862 perm = RepoToPerm()
863 perm.repository = repo
864 perm.user = user
865 perm.permission = p
866
867 Session.add(perm)
868 Session.commit()
869
870 return perm
871 except:
872 log.error(traceback.format_exc())
873 Session.rollback()
874 raise
875
876 class UserToPerm(Base, BaseModel):
837 class UserToPerm(Base, BaseModel):
877 __tablename__ = 'user_to_perm'
838 __tablename__ = 'user_to_perm'
878 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'extend_existing':True})
839 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'extend_existing':True})
879 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
840 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
841 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
881 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
842 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
882
843
883 user = relationship('User')
844 user = relationship('User')
884 permission = relationship('Permission')
845 permission = relationship('Permission')
885
846
886 @classmethod
847 @classmethod
887 def has_perm(cls, user_id, perm):
848 def has_perm(cls, user_id, perm):
888 if not isinstance(perm, Permission):
849 if not isinstance(perm, Permission):
889 raise Exception('perm needs to be an instance of Permission class')
850 raise Exception('perm needs to be an instance of Permission class')
890
851
891 return cls.query().filter(cls.user_id == user_id)\
852 return cls.query().filter(cls.user_id == user_id)\
892 .filter(cls.permission == perm).scalar() is not None
853 .filter(cls.permission == perm).scalar() is not None
893
854
894 @classmethod
855 @classmethod
895 def grant_perm(cls, user_id, perm):
856 def grant_perm(cls, user_id, perm):
896 if not isinstance(perm, Permission):
857 if not isinstance(perm, Permission):
897 raise Exception('perm needs to be an instance of Permission class')
858 raise Exception('perm needs to be an instance of Permission class')
898
859
899 new = cls()
860 new = cls()
900 new.user_id = user_id
861 new.user_id = user_id
901 new.permission = perm
862 new.permission = perm
902 try:
863 try:
903 Session.add(new)
864 Session.add(new)
904 Session.commit()
865 Session.commit()
905 except:
866 except:
906 Session.rollback()
867 Session.rollback()
907
868
908
869
909 @classmethod
870 @classmethod
910 def revoke_perm(cls, user_id, perm):
871 def revoke_perm(cls, user_id, perm):
911 if not isinstance(perm, Permission):
872 if not isinstance(perm, Permission):
912 raise Exception('perm needs to be an instance of Permission class')
873 raise Exception('perm needs to be an instance of Permission class')
913
874
914 try:
875 try:
915 cls.query().filter(cls.user_id == user_id)\
876 cls.query().filter(cls.user_id == user_id)\
916 .filter(cls.permission == perm).delete()
877 .filter(cls.permission == perm).delete()
917 Session.commit()
878 Session.commit()
918 except:
879 except:
919 Session.rollback()
880 Session.rollback()
920
881
921 class UsersGroupRepoToPerm(Base, BaseModel):
882 class UsersGroupRepoToPerm(Base, BaseModel):
922 __tablename__ = 'users_group_repo_to_perm'
883 __tablename__ = 'users_group_repo_to_perm'
923 __table_args__ = (UniqueConstraint('repository_id', 'users_group_id', 'permission_id'), {'extend_existing':True})
884 __table_args__ = (UniqueConstraint('repository_id', 'users_group_id', 'permission_id'), {'extend_existing':True})
924 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
885 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
925 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
886 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
926 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
887 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
927 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
888 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
928
889
929 users_group = relationship('UsersGroup')
890 users_group = relationship('UsersGroup')
930 permission = relationship('Permission')
891 permission = relationship('Permission')
931 repository = relationship('Repository')
892 repository = relationship('Repository')
932
893
933 def __repr__(self):
894 def __repr__(self):
934 return '<userGroup:%s => %s >' % (self.users_group, self.repository)
895 return '<userGroup:%s => %s >' % (self.users_group, self.repository)
935
896
936 class UsersGroupToPerm(Base, BaseModel):
897 class UsersGroupToPerm(Base, BaseModel):
937 __tablename__ = 'users_group_to_perm'
898 __tablename__ = 'users_group_to_perm'
938 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
899 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
939 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
900 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
940 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
901 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
941
902
942 users_group = relationship('UsersGroup')
903 users_group = relationship('UsersGroup')
943 permission = relationship('Permission')
904 permission = relationship('Permission')
944
905
945
906
946 @classmethod
907 @classmethod
947 def has_perm(cls, users_group_id, perm):
908 def has_perm(cls, users_group_id, perm):
948 if not isinstance(perm, Permission):
909 if not isinstance(perm, Permission):
949 raise Exception('perm needs to be an instance of Permission class')
910 raise Exception('perm needs to be an instance of Permission class')
950
911
951 return cls.query().filter(cls.users_group_id ==
912 return cls.query().filter(cls.users_group_id ==
952 users_group_id)\
913 users_group_id)\
953 .filter(cls.permission == perm)\
914 .filter(cls.permission == perm)\
954 .scalar() is not None
915 .scalar() is not None
955
916
956 @classmethod
917 @classmethod
957 def grant_perm(cls, users_group_id, perm):
918 def grant_perm(cls, users_group_id, perm):
958 if not isinstance(perm, Permission):
919 if not isinstance(perm, Permission):
959 raise Exception('perm needs to be an instance of Permission class')
920 raise Exception('perm needs to be an instance of Permission class')
960
921
961 new = cls()
922 new = cls()
962 new.users_group_id = users_group_id
923 new.users_group_id = users_group_id
963 new.permission = perm
924 new.permission = perm
964 try:
925 try:
965 Session.add(new)
926 Session.add(new)
966 Session.commit()
927 Session.commit()
967 except:
928 except:
968 Session.rollback()
929 Session.rollback()
969
930
970
931
971 @classmethod
932 @classmethod
972 def revoke_perm(cls, users_group_id, perm):
933 def revoke_perm(cls, users_group_id, perm):
973 if not isinstance(perm, Permission):
934 if not isinstance(perm, Permission):
974 raise Exception('perm needs to be an instance of Permission class')
935 raise Exception('perm needs to be an instance of Permission class')
975
936
976 try:
937 try:
977 cls.query().filter(cls.users_group_id == users_group_id)\
938 cls.query().filter(cls.users_group_id == users_group_id)\
978 .filter(cls.permission == perm).delete()
939 .filter(cls.permission == perm).delete()
979 Session.commit()
940 Session.commit()
980 except:
941 except:
981 Session.rollback()
942 Session.rollback()
982
943
983
944
984 class GroupToPerm(Base, BaseModel):
945 class GroupToPerm(Base, BaseModel):
985 __tablename__ = 'group_to_perm'
946 __tablename__ = 'group_to_perm'
986 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'extend_existing':True})
947 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'extend_existing':True})
987
948
988 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
949 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
989 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
950 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
990 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
951 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
991 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
952 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
992
953
993 user = relationship('User')
954 user = relationship('User')
994 permission = relationship('Permission')
955 permission = relationship('Permission')
995 group = relationship('Group')
956 group = relationship('Group')
996
957
997 class Statistics(Base, BaseModel):
958 class Statistics(Base, BaseModel):
998 __tablename__ = 'statistics'
959 __tablename__ = 'statistics'
999 __table_args__ = (UniqueConstraint('repository_id'), {'extend_existing':True})
960 __table_args__ = (UniqueConstraint('repository_id'), {'extend_existing':True})
1000 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
961 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1001 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
962 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
1002 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
963 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
1003 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
964 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
1004 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
965 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
1005 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
966 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
1006
967
1007 repository = relationship('Repository', single_parent=True)
968 repository = relationship('Repository', single_parent=True)
1008
969
1009 class UserFollowing(Base, BaseModel):
970 class UserFollowing(Base, BaseModel):
1010 __tablename__ = 'user_followings'
971 __tablename__ = 'user_followings'
1011 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
972 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
1012 UniqueConstraint('user_id', 'follows_user_id')
973 UniqueConstraint('user_id', 'follows_user_id')
1013 , {'extend_existing':True})
974 , {'extend_existing':True})
1014
975
1015 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
976 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1016 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
977 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1017 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
978 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
1018 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
979 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
1019 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
980 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
1020
981
1021 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
982 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
1022
983
1023 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
984 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
1024 follows_repository = relationship('Repository', order_by='Repository.repo_name')
985 follows_repository = relationship('Repository', order_by='Repository.repo_name')
1025
986
1026
987
1027 @classmethod
988 @classmethod
1028 def get_repo_followers(cls, repo_id):
989 def get_repo_followers(cls, repo_id):
1029 return cls.query().filter(cls.follows_repo_id == repo_id)
990 return cls.query().filter(cls.follows_repo_id == repo_id)
1030
991
1031 class CacheInvalidation(Base, BaseModel):
992 class CacheInvalidation(Base, BaseModel):
1032 __tablename__ = 'cache_invalidation'
993 __tablename__ = 'cache_invalidation'
1033 __table_args__ = (UniqueConstraint('cache_key'), {'extend_existing':True})
994 __table_args__ = (UniqueConstraint('cache_key'), {'extend_existing':True})
1034 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
995 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1035 cache_key = Column("cache_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
996 cache_key = Column("cache_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1036 cache_args = Column("cache_args", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
997 cache_args = Column("cache_args", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1037 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
998 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
1038
999
1039
1000
1040 def __init__(self, cache_key, cache_args=''):
1001 def __init__(self, cache_key, cache_args=''):
1041 self.cache_key = cache_key
1002 self.cache_key = cache_key
1042 self.cache_args = cache_args
1003 self.cache_args = cache_args
1043 self.cache_active = False
1004 self.cache_active = False
1044
1005
1045 def __repr__(self):
1006 def __repr__(self):
1046 return "<%s('%s:%s')>" % (self.__class__.__name__,
1007 return "<%s('%s:%s')>" % (self.__class__.__name__,
1047 self.cache_id, self.cache_key)
1008 self.cache_id, self.cache_key)
1048
1009
1049 class DbMigrateVersion(Base, BaseModel):
1010 class DbMigrateVersion(Base, BaseModel):
1050 __tablename__ = 'db_migrate_version'
1011 __tablename__ = 'db_migrate_version'
1051 __table_args__ = {'extend_existing':True}
1012 __table_args__ = {'extend_existing':True}
1052 repository_id = Column('repository_id', String(250), primary_key=True)
1013 repository_id = Column('repository_id', String(250), primary_key=True)
1053 repository_path = Column('repository_path', Text)
1014 repository_path = Column('repository_path', Text)
1054 version = Column('version', Integer)
1015 version = Column('version', Integer)
General Comments 0
You need to be logged in to leave comments. Login now