##// END OF EJS Templates
codecleaner
marcink -
r3473:b30a842b beta
parent child Browse files
Show More
@@ -1,2061 +1,2061 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) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2010-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
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 import hashlib
30 import hashlib
31 import time
31 import time
32 from collections import defaultdict
32 from collections import defaultdict
33
33
34 from sqlalchemy import *
34 from sqlalchemy import *
35 from sqlalchemy.ext.hybrid import hybrid_property
35 from sqlalchemy.ext.hybrid import hybrid_property
36 from sqlalchemy.orm import relationship, joinedload, class_mapper, validates
36 from sqlalchemy.orm import relationship, joinedload, class_mapper, validates
37 from sqlalchemy.exc import DatabaseError
37 from sqlalchemy.exc import DatabaseError
38 from beaker.cache import cache_region, region_invalidate
38 from beaker.cache import cache_region, region_invalidate
39 from webob.exc import HTTPNotFound
39 from webob.exc import HTTPNotFound
40
40
41 from pylons.i18n.translation import lazy_ugettext as _
41 from pylons.i18n.translation import lazy_ugettext as _
42
42
43 from rhodecode.lib.vcs import get_backend
43 from rhodecode.lib.vcs import get_backend
44 from rhodecode.lib.vcs.utils.helpers import get_scm
44 from rhodecode.lib.vcs.utils.helpers import get_scm
45 from rhodecode.lib.vcs.exceptions import VCSError
45 from rhodecode.lib.vcs.exceptions import VCSError
46 from rhodecode.lib.vcs.utils.lazy import LazyProperty
46 from rhodecode.lib.vcs.utils.lazy import LazyProperty
47 from rhodecode.lib.vcs.backends.base import EmptyChangeset
47 from rhodecode.lib.vcs.backends.base import EmptyChangeset
48
48
49 from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
49 from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
50 safe_unicode, remove_suffix, remove_prefix
50 safe_unicode, remove_suffix, remove_prefix
51 from rhodecode.lib.compat import json
51 from rhodecode.lib.compat import json
52 from rhodecode.lib.caching_query import FromCache
52 from rhodecode.lib.caching_query import FromCache
53
53
54 from rhodecode.model.meta import Base, Session
54 from rhodecode.model.meta import Base, Session
55
55
56 URL_SEP = '/'
56 URL_SEP = '/'
57 log = logging.getLogger(__name__)
57 log = logging.getLogger(__name__)
58
58
59 #==============================================================================
59 #==============================================================================
60 # BASE CLASSES
60 # BASE CLASSES
61 #==============================================================================
61 #==============================================================================
62
62
63 _hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest()
63 _hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest()
64
64
65
65
66 class BaseModel(object):
66 class BaseModel(object):
67 """
67 """
68 Base Model for all classess
68 Base Model for all classess
69 """
69 """
70
70
71 @classmethod
71 @classmethod
72 def _get_keys(cls):
72 def _get_keys(cls):
73 """return column names for this model """
73 """return column names for this model """
74 return class_mapper(cls).c.keys()
74 return class_mapper(cls).c.keys()
75
75
76 def get_dict(self):
76 def get_dict(self):
77 """
77 """
78 return dict with keys and values corresponding
78 return dict with keys and values corresponding
79 to this model data """
79 to this model data """
80
80
81 d = {}
81 d = {}
82 for k in self._get_keys():
82 for k in self._get_keys():
83 d[k] = getattr(self, k)
83 d[k] = getattr(self, k)
84
84
85 # also use __json__() if present to get additional fields
85 # also use __json__() if present to get additional fields
86 _json_attr = getattr(self, '__json__', None)
86 _json_attr = getattr(self, '__json__', None)
87 if _json_attr:
87 if _json_attr:
88 # update with attributes from __json__
88 # update with attributes from __json__
89 if callable(_json_attr):
89 if callable(_json_attr):
90 _json_attr = _json_attr()
90 _json_attr = _json_attr()
91 for k, val in _json_attr.iteritems():
91 for k, val in _json_attr.iteritems():
92 d[k] = val
92 d[k] = val
93 return d
93 return d
94
94
95 def get_appstruct(self):
95 def get_appstruct(self):
96 """return list with keys and values tupples corresponding
96 """return list with keys and values tupples corresponding
97 to this model data """
97 to this model data """
98
98
99 l = []
99 l = []
100 for k in self._get_keys():
100 for k in self._get_keys():
101 l.append((k, getattr(self, k),))
101 l.append((k, getattr(self, k),))
102 return l
102 return l
103
103
104 def populate_obj(self, populate_dict):
104 def populate_obj(self, populate_dict):
105 """populate model with data from given populate_dict"""
105 """populate model with data from given populate_dict"""
106
106
107 for k in self._get_keys():
107 for k in self._get_keys():
108 if k in populate_dict:
108 if k in populate_dict:
109 setattr(self, k, populate_dict[k])
109 setattr(self, k, populate_dict[k])
110
110
111 @classmethod
111 @classmethod
112 def query(cls):
112 def query(cls):
113 return Session().query(cls)
113 return Session().query(cls)
114
114
115 @classmethod
115 @classmethod
116 def get(cls, id_):
116 def get(cls, id_):
117 if id_:
117 if id_:
118 return cls.query().get(id_)
118 return cls.query().get(id_)
119
119
120 @classmethod
120 @classmethod
121 def get_or_404(cls, id_):
121 def get_or_404(cls, id_):
122 try:
122 try:
123 id_ = int(id_)
123 id_ = int(id_)
124 except (TypeError, ValueError):
124 except (TypeError, ValueError):
125 raise HTTPNotFound
125 raise HTTPNotFound
126
126
127 res = cls.query().get(id_)
127 res = cls.query().get(id_)
128 if not res:
128 if not res:
129 raise HTTPNotFound
129 raise HTTPNotFound
130 return res
130 return res
131
131
132 @classmethod
132 @classmethod
133 def getAll(cls):
133 def getAll(cls):
134 return cls.query().all()
134 return cls.query().all()
135
135
136 @classmethod
136 @classmethod
137 def delete(cls, id_):
137 def delete(cls, id_):
138 obj = cls.query().get(id_)
138 obj = cls.query().get(id_)
139 Session().delete(obj)
139 Session().delete(obj)
140
140
141 def __repr__(self):
141 def __repr__(self):
142 if hasattr(self, '__unicode__'):
142 if hasattr(self, '__unicode__'):
143 # python repr needs to return str
143 # python repr needs to return str
144 return safe_str(self.__unicode__())
144 return safe_str(self.__unicode__())
145 return '<DB:%s>' % (self.__class__.__name__)
145 return '<DB:%s>' % (self.__class__.__name__)
146
146
147
147
148 class RhodeCodeSetting(Base, BaseModel):
148 class RhodeCodeSetting(Base, BaseModel):
149 __tablename__ = 'rhodecode_settings'
149 __tablename__ = 'rhodecode_settings'
150 __table_args__ = (
150 __table_args__ = (
151 UniqueConstraint('app_settings_name'),
151 UniqueConstraint('app_settings_name'),
152 {'extend_existing': True, 'mysql_engine': 'InnoDB',
152 {'extend_existing': True, 'mysql_engine': 'InnoDB',
153 'mysql_charset': 'utf8'}
153 'mysql_charset': 'utf8'}
154 )
154 )
155 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
155 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
156 app_settings_name = Column("app_settings_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
156 app_settings_name = Column("app_settings_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
157 _app_settings_value = Column("app_settings_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
157 _app_settings_value = Column("app_settings_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
158
158
159 def __init__(self, k='', v=''):
159 def __init__(self, k='', v=''):
160 self.app_settings_name = k
160 self.app_settings_name = k
161 self.app_settings_value = v
161 self.app_settings_value = v
162
162
163 @validates('_app_settings_value')
163 @validates('_app_settings_value')
164 def validate_settings_value(self, key, val):
164 def validate_settings_value(self, key, val):
165 assert type(val) == unicode
165 assert type(val) == unicode
166 return val
166 return val
167
167
168 @hybrid_property
168 @hybrid_property
169 def app_settings_value(self):
169 def app_settings_value(self):
170 v = self._app_settings_value
170 v = self._app_settings_value
171 if self.app_settings_name in ["ldap_active",
171 if self.app_settings_name in ["ldap_active",
172 "default_repo_enable_statistics",
172 "default_repo_enable_statistics",
173 "default_repo_enable_locking",
173 "default_repo_enable_locking",
174 "default_repo_private",
174 "default_repo_private",
175 "default_repo_enable_downloads"]:
175 "default_repo_enable_downloads"]:
176 v = str2bool(v)
176 v = str2bool(v)
177 return v
177 return v
178
178
179 @app_settings_value.setter
179 @app_settings_value.setter
180 def app_settings_value(self, val):
180 def app_settings_value(self, val):
181 """
181 """
182 Setter that will always make sure we use unicode in app_settings_value
182 Setter that will always make sure we use unicode in app_settings_value
183
183
184 :param val:
184 :param val:
185 """
185 """
186 self._app_settings_value = safe_unicode(val)
186 self._app_settings_value = safe_unicode(val)
187
187
188 def __unicode__(self):
188 def __unicode__(self):
189 return u"<%s('%s:%s')>" % (
189 return u"<%s('%s:%s')>" % (
190 self.__class__.__name__,
190 self.__class__.__name__,
191 self.app_settings_name, self.app_settings_value
191 self.app_settings_name, self.app_settings_value
192 )
192 )
193
193
194 @classmethod
194 @classmethod
195 def get_by_name(cls, key):
195 def get_by_name(cls, key):
196 return cls.query()\
196 return cls.query()\
197 .filter(cls.app_settings_name == key).scalar()
197 .filter(cls.app_settings_name == key).scalar()
198
198
199 @classmethod
199 @classmethod
200 def get_by_name_or_create(cls, key):
200 def get_by_name_or_create(cls, key):
201 res = cls.get_by_name(key)
201 res = cls.get_by_name(key)
202 if not res:
202 if not res:
203 res = cls(key)
203 res = cls(key)
204 return res
204 return res
205
205
206 @classmethod
206 @classmethod
207 def get_app_settings(cls, cache=False):
207 def get_app_settings(cls, cache=False):
208
208
209 ret = cls.query()
209 ret = cls.query()
210
210
211 if cache:
211 if cache:
212 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
212 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
213
213
214 if not ret:
214 if not ret:
215 raise Exception('Could not get application settings !')
215 raise Exception('Could not get application settings !')
216 settings = {}
216 settings = {}
217 for each in ret:
217 for each in ret:
218 settings['rhodecode_' + each.app_settings_name] = \
218 settings['rhodecode_' + each.app_settings_name] = \
219 each.app_settings_value
219 each.app_settings_value
220
220
221 return settings
221 return settings
222
222
223 @classmethod
223 @classmethod
224 def get_ldap_settings(cls, cache=False):
224 def get_ldap_settings(cls, cache=False):
225 ret = cls.query()\
225 ret = cls.query()\
226 .filter(cls.app_settings_name.startswith('ldap_')).all()
226 .filter(cls.app_settings_name.startswith('ldap_')).all()
227 fd = {}
227 fd = {}
228 for row in ret:
228 for row in ret:
229 fd.update({row.app_settings_name: row.app_settings_value})
229 fd.update({row.app_settings_name: row.app_settings_value})
230
230
231 return fd
231 return fd
232
232
233 @classmethod
233 @classmethod
234 def get_default_repo_settings(cls, cache=False, strip_prefix=False):
234 def get_default_repo_settings(cls, cache=False, strip_prefix=False):
235 ret = cls.query()\
235 ret = cls.query()\
236 .filter(cls.app_settings_name.startswith('default_')).all()
236 .filter(cls.app_settings_name.startswith('default_')).all()
237 fd = {}
237 fd = {}
238 for row in ret:
238 for row in ret:
239 key = row.app_settings_name
239 key = row.app_settings_name
240 if strip_prefix:
240 if strip_prefix:
241 key = remove_prefix(key, prefix='default_')
241 key = remove_prefix(key, prefix='default_')
242 fd.update({key: row.app_settings_value})
242 fd.update({key: row.app_settings_value})
243
243
244 return fd
244 return fd
245
245
246
246
247 class RhodeCodeUi(Base, BaseModel):
247 class RhodeCodeUi(Base, BaseModel):
248 __tablename__ = 'rhodecode_ui'
248 __tablename__ = 'rhodecode_ui'
249 __table_args__ = (
249 __table_args__ = (
250 UniqueConstraint('ui_key'),
250 UniqueConstraint('ui_key'),
251 {'extend_existing': True, 'mysql_engine': 'InnoDB',
251 {'extend_existing': True, 'mysql_engine': 'InnoDB',
252 'mysql_charset': 'utf8'}
252 'mysql_charset': 'utf8'}
253 )
253 )
254
254
255 HOOK_UPDATE = 'changegroup.update'
255 HOOK_UPDATE = 'changegroup.update'
256 HOOK_REPO_SIZE = 'changegroup.repo_size'
256 HOOK_REPO_SIZE = 'changegroup.repo_size'
257 HOOK_PUSH = 'changegroup.push_logger'
257 HOOK_PUSH = 'changegroup.push_logger'
258 HOOK_PRE_PUSH = 'prechangegroup.pre_push'
258 HOOK_PRE_PUSH = 'prechangegroup.pre_push'
259 HOOK_PULL = 'outgoing.pull_logger'
259 HOOK_PULL = 'outgoing.pull_logger'
260 HOOK_PRE_PULL = 'preoutgoing.pre_pull'
260 HOOK_PRE_PULL = 'preoutgoing.pre_pull'
261
261
262 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
262 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
263 ui_section = Column("ui_section", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
263 ui_section = Column("ui_section", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
264 ui_key = Column("ui_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
264 ui_key = Column("ui_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
265 ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
265 ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
266 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
266 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
267
267
268 @classmethod
268 @classmethod
269 def get_by_key(cls, key):
269 def get_by_key(cls, key):
270 return cls.query().filter(cls.ui_key == key).scalar()
270 return cls.query().filter(cls.ui_key == key).scalar()
271
271
272 @classmethod
272 @classmethod
273 def get_builtin_hooks(cls):
273 def get_builtin_hooks(cls):
274 q = cls.query()
274 q = cls.query()
275 q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
275 q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
276 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
276 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
277 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
277 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
278 return q.all()
278 return q.all()
279
279
280 @classmethod
280 @classmethod
281 def get_custom_hooks(cls):
281 def get_custom_hooks(cls):
282 q = cls.query()
282 q = cls.query()
283 q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
283 q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
284 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
284 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
285 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
285 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
286 q = q.filter(cls.ui_section == 'hooks')
286 q = q.filter(cls.ui_section == 'hooks')
287 return q.all()
287 return q.all()
288
288
289 @classmethod
289 @classmethod
290 def get_repos_location(cls):
290 def get_repos_location(cls):
291 return cls.get_by_key('/').ui_value
291 return cls.get_by_key('/').ui_value
292
292
293 @classmethod
293 @classmethod
294 def create_or_update_hook(cls, key, val):
294 def create_or_update_hook(cls, key, val):
295 new_ui = cls.get_by_key(key) or cls()
295 new_ui = cls.get_by_key(key) or cls()
296 new_ui.ui_section = 'hooks'
296 new_ui.ui_section = 'hooks'
297 new_ui.ui_active = True
297 new_ui.ui_active = True
298 new_ui.ui_key = key
298 new_ui.ui_key = key
299 new_ui.ui_value = val
299 new_ui.ui_value = val
300
300
301 Session().add(new_ui)
301 Session().add(new_ui)
302
302
303 def __repr__(self):
303 def __repr__(self):
304 return '<DB:%s[%s:%s]>' % (self.__class__.__name__, self.ui_key,
304 return '<DB:%s[%s:%s]>' % (self.__class__.__name__, self.ui_key,
305 self.ui_value)
305 self.ui_value)
306
306
307
307
308 class User(Base, BaseModel):
308 class User(Base, BaseModel):
309 __tablename__ = 'users'
309 __tablename__ = 'users'
310 __table_args__ = (
310 __table_args__ = (
311 UniqueConstraint('username'), UniqueConstraint('email'),
311 UniqueConstraint('username'), UniqueConstraint('email'),
312 Index('u_username_idx', 'username'),
312 Index('u_username_idx', 'username'),
313 Index('u_email_idx', 'email'),
313 Index('u_email_idx', 'email'),
314 {'extend_existing': True, 'mysql_engine': 'InnoDB',
314 {'extend_existing': True, 'mysql_engine': 'InnoDB',
315 'mysql_charset': 'utf8'}
315 'mysql_charset': 'utf8'}
316 )
316 )
317 DEFAULT_USER = 'default'
317 DEFAULT_USER = 'default'
318 DEFAULT_PERMISSIONS = [
318 DEFAULT_PERMISSIONS = [
319 'hg.register.manual_activate', 'hg.create.repository',
319 'hg.register.manual_activate', 'hg.create.repository',
320 'hg.fork.repository', 'repository.read', 'group.read'
320 'hg.fork.repository', 'repository.read', 'group.read'
321 ]
321 ]
322 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
322 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
323 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
323 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
324 password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
324 password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
325 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
325 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
326 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
326 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
327 name = Column("firstname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
327 name = Column("firstname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
328 lastname = Column("lastname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
328 lastname = Column("lastname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
329 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
329 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
330 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
330 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
331 ldap_dn = Column("ldap_dn", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
331 ldap_dn = Column("ldap_dn", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
332 api_key = Column("api_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
332 api_key = Column("api_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
333 inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
333 inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
334
334
335 user_log = relationship('UserLog')
335 user_log = relationship('UserLog')
336 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
336 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
337
337
338 repositories = relationship('Repository')
338 repositories = relationship('Repository')
339 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
339 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
340 followings = relationship('UserFollowing', primaryjoin='UserFollowing.user_id==User.user_id', cascade='all')
340 followings = relationship('UserFollowing', primaryjoin='UserFollowing.user_id==User.user_id', cascade='all')
341
341
342 repo_to_perm = relationship('UserRepoToPerm', primaryjoin='UserRepoToPerm.user_id==User.user_id', cascade='all')
342 repo_to_perm = relationship('UserRepoToPerm', primaryjoin='UserRepoToPerm.user_id==User.user_id', cascade='all')
343 repo_group_to_perm = relationship('UserRepoGroupToPerm', primaryjoin='UserRepoGroupToPerm.user_id==User.user_id', cascade='all')
343 repo_group_to_perm = relationship('UserRepoGroupToPerm', primaryjoin='UserRepoGroupToPerm.user_id==User.user_id', cascade='all')
344
344
345 group_member = relationship('UserGroupMember', cascade='all')
345 group_member = relationship('UserGroupMember', cascade='all')
346
346
347 notifications = relationship('UserNotification', cascade='all')
347 notifications = relationship('UserNotification', cascade='all')
348 # notifications assigned to this user
348 # notifications assigned to this user
349 user_created_notifications = relationship('Notification', cascade='all')
349 user_created_notifications = relationship('Notification', cascade='all')
350 # comments created by this user
350 # comments created by this user
351 user_comments = relationship('ChangesetComment', cascade='all')
351 user_comments = relationship('ChangesetComment', cascade='all')
352 #extra emails for this user
352 #extra emails for this user
353 user_emails = relationship('UserEmailMap', cascade='all')
353 user_emails = relationship('UserEmailMap', cascade='all')
354
354
355 @hybrid_property
355 @hybrid_property
356 def email(self):
356 def email(self):
357 return self._email
357 return self._email
358
358
359 @email.setter
359 @email.setter
360 def email(self, val):
360 def email(self, val):
361 self._email = val.lower() if val else None
361 self._email = val.lower() if val else None
362
362
363 @property
363 @property
364 def firstname(self):
364 def firstname(self):
365 # alias for future
365 # alias for future
366 return self.name
366 return self.name
367
367
368 @property
368 @property
369 def emails(self):
369 def emails(self):
370 other = UserEmailMap.query().filter(UserEmailMap.user==self).all()
370 other = UserEmailMap.query().filter(UserEmailMap.user==self).all()
371 return [self.email] + [x.email for x in other]
371 return [self.email] + [x.email for x in other]
372
372
373 @property
373 @property
374 def ip_addresses(self):
374 def ip_addresses(self):
375 ret = UserIpMap.query().filter(UserIpMap.user == self).all()
375 ret = UserIpMap.query().filter(UserIpMap.user == self).all()
376 return [x.ip_addr for x in ret]
376 return [x.ip_addr for x in ret]
377
377
378 @property
378 @property
379 def username_and_name(self):
379 def username_and_name(self):
380 return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
380 return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
381
381
382 @property
382 @property
383 def full_name(self):
383 def full_name(self):
384 return '%s %s' % (self.firstname, self.lastname)
384 return '%s %s' % (self.firstname, self.lastname)
385
385
386 @property
386 @property
387 def full_name_or_username(self):
387 def full_name_or_username(self):
388 return ('%s %s' % (self.firstname, self.lastname)
388 return ('%s %s' % (self.firstname, self.lastname)
389 if (self.firstname and self.lastname) else self.username)
389 if (self.firstname and self.lastname) else self.username)
390
390
391 @property
391 @property
392 def full_contact(self):
392 def full_contact(self):
393 return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
393 return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
394
394
395 @property
395 @property
396 def short_contact(self):
396 def short_contact(self):
397 return '%s %s' % (self.firstname, self.lastname)
397 return '%s %s' % (self.firstname, self.lastname)
398
398
399 @property
399 @property
400 def is_admin(self):
400 def is_admin(self):
401 return self.admin
401 return self.admin
402
402
403 @property
403 @property
404 def AuthUser(self):
404 def AuthUser(self):
405 """
405 """
406 Returns instance of AuthUser for this user
406 Returns instance of AuthUser for this user
407 """
407 """
408 from rhodecode.lib.auth import AuthUser
408 from rhodecode.lib.auth import AuthUser
409 return AuthUser(user_id=self.user_id, api_key=self.api_key,
409 return AuthUser(user_id=self.user_id, api_key=self.api_key,
410 username=self.username)
410 username=self.username)
411
411
412 def __unicode__(self):
412 def __unicode__(self):
413 return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
413 return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
414 self.user_id, self.username)
414 self.user_id, self.username)
415
415
416 @classmethod
416 @classmethod
417 def get_by_username(cls, username, case_insensitive=False, cache=False):
417 def get_by_username(cls, username, case_insensitive=False, cache=False):
418 if case_insensitive:
418 if case_insensitive:
419 q = cls.query().filter(cls.username.ilike(username))
419 q = cls.query().filter(cls.username.ilike(username))
420 else:
420 else:
421 q = cls.query().filter(cls.username == username)
421 q = cls.query().filter(cls.username == username)
422
422
423 if cache:
423 if cache:
424 q = q.options(FromCache(
424 q = q.options(FromCache(
425 "sql_cache_short",
425 "sql_cache_short",
426 "get_user_%s" % _hash_key(username)
426 "get_user_%s" % _hash_key(username)
427 )
427 )
428 )
428 )
429 return q.scalar()
429 return q.scalar()
430
430
431 @classmethod
431 @classmethod
432 def get_by_api_key(cls, api_key, cache=False):
432 def get_by_api_key(cls, api_key, cache=False):
433 q = cls.query().filter(cls.api_key == api_key)
433 q = cls.query().filter(cls.api_key == api_key)
434
434
435 if cache:
435 if cache:
436 q = q.options(FromCache("sql_cache_short",
436 q = q.options(FromCache("sql_cache_short",
437 "get_api_key_%s" % api_key))
437 "get_api_key_%s" % api_key))
438 return q.scalar()
438 return q.scalar()
439
439
440 @classmethod
440 @classmethod
441 def get_by_email(cls, email, case_insensitive=False, cache=False):
441 def get_by_email(cls, email, case_insensitive=False, cache=False):
442 if case_insensitive:
442 if case_insensitive:
443 q = cls.query().filter(cls.email.ilike(email))
443 q = cls.query().filter(cls.email.ilike(email))
444 else:
444 else:
445 q = cls.query().filter(cls.email == email)
445 q = cls.query().filter(cls.email == email)
446
446
447 if cache:
447 if cache:
448 q = q.options(FromCache("sql_cache_short",
448 q = q.options(FromCache("sql_cache_short",
449 "get_email_key_%s" % email))
449 "get_email_key_%s" % email))
450
450
451 ret = q.scalar()
451 ret = q.scalar()
452 if ret is None:
452 if ret is None:
453 q = UserEmailMap.query()
453 q = UserEmailMap.query()
454 # try fetching in alternate email map
454 # try fetching in alternate email map
455 if case_insensitive:
455 if case_insensitive:
456 q = q.filter(UserEmailMap.email.ilike(email))
456 q = q.filter(UserEmailMap.email.ilike(email))
457 else:
457 else:
458 q = q.filter(UserEmailMap.email == email)
458 q = q.filter(UserEmailMap.email == email)
459 q = q.options(joinedload(UserEmailMap.user))
459 q = q.options(joinedload(UserEmailMap.user))
460 if cache:
460 if cache:
461 q = q.options(FromCache("sql_cache_short",
461 q = q.options(FromCache("sql_cache_short",
462 "get_email_map_key_%s" % email))
462 "get_email_map_key_%s" % email))
463 ret = getattr(q.scalar(), 'user', None)
463 ret = getattr(q.scalar(), 'user', None)
464
464
465 return ret
465 return ret
466
466
467 @classmethod
467 @classmethod
468 def get_from_cs_author(cls, author):
468 def get_from_cs_author(cls, author):
469 """
469 """
470 Tries to get User objects out of commit author string
470 Tries to get User objects out of commit author string
471
471
472 :param author:
472 :param author:
473 """
473 """
474 from rhodecode.lib.helpers import email, author_name
474 from rhodecode.lib.helpers import email, author_name
475 # Valid email in the attribute passed, see if they're in the system
475 # Valid email in the attribute passed, see if they're in the system
476 _email = email(author)
476 _email = email(author)
477 if _email:
477 if _email:
478 user = cls.get_by_email(_email, case_insensitive=True)
478 user = cls.get_by_email(_email, case_insensitive=True)
479 if user:
479 if user:
480 return user
480 return user
481 # Maybe we can match by username?
481 # Maybe we can match by username?
482 _author = author_name(author)
482 _author = author_name(author)
483 user = cls.get_by_username(_author, case_insensitive=True)
483 user = cls.get_by_username(_author, case_insensitive=True)
484 if user:
484 if user:
485 return user
485 return user
486
486
487 def update_lastlogin(self):
487 def update_lastlogin(self):
488 """Update user lastlogin"""
488 """Update user lastlogin"""
489 self.last_login = datetime.datetime.now()
489 self.last_login = datetime.datetime.now()
490 Session().add(self)
490 Session().add(self)
491 log.debug('updated user %s lastlogin' % self.username)
491 log.debug('updated user %s lastlogin' % self.username)
492
492
493 def get_api_data(self):
493 def get_api_data(self):
494 """
494 """
495 Common function for generating user related data for API
495 Common function for generating user related data for API
496 """
496 """
497 user = self
497 user = self
498 data = dict(
498 data = dict(
499 user_id=user.user_id,
499 user_id=user.user_id,
500 username=user.username,
500 username=user.username,
501 firstname=user.name,
501 firstname=user.name,
502 lastname=user.lastname,
502 lastname=user.lastname,
503 email=user.email,
503 email=user.email,
504 emails=user.emails,
504 emails=user.emails,
505 api_key=user.api_key,
505 api_key=user.api_key,
506 active=user.active,
506 active=user.active,
507 admin=user.admin,
507 admin=user.admin,
508 ldap_dn=user.ldap_dn,
508 ldap_dn=user.ldap_dn,
509 last_login=user.last_login,
509 last_login=user.last_login,
510 ip_addresses=user.ip_addresses
510 ip_addresses=user.ip_addresses
511 )
511 )
512 return data
512 return data
513
513
514 def __json__(self):
514 def __json__(self):
515 data = dict(
515 data = dict(
516 full_name=self.full_name,
516 full_name=self.full_name,
517 full_name_or_username=self.full_name_or_username,
517 full_name_or_username=self.full_name_or_username,
518 short_contact=self.short_contact,
518 short_contact=self.short_contact,
519 full_contact=self.full_contact
519 full_contact=self.full_contact
520 )
520 )
521 data.update(self.get_api_data())
521 data.update(self.get_api_data())
522 return data
522 return data
523
523
524
524
525 class UserEmailMap(Base, BaseModel):
525 class UserEmailMap(Base, BaseModel):
526 __tablename__ = 'user_email_map'
526 __tablename__ = 'user_email_map'
527 __table_args__ = (
527 __table_args__ = (
528 Index('uem_email_idx', 'email'),
528 Index('uem_email_idx', 'email'),
529 UniqueConstraint('email'),
529 UniqueConstraint('email'),
530 {'extend_existing': True, 'mysql_engine': 'InnoDB',
530 {'extend_existing': True, 'mysql_engine': 'InnoDB',
531 'mysql_charset': 'utf8'}
531 'mysql_charset': 'utf8'}
532 )
532 )
533 __mapper_args__ = {}
533 __mapper_args__ = {}
534
534
535 email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
535 email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
536 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
536 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
537 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
537 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
538 user = relationship('User', lazy='joined')
538 user = relationship('User', lazy='joined')
539
539
540 @validates('_email')
540 @validates('_email')
541 def validate_email(self, key, email):
541 def validate_email(self, key, email):
542 # check if this email is not main one
542 # check if this email is not main one
543 main_email = Session().query(User).filter(User.email == email).scalar()
543 main_email = Session().query(User).filter(User.email == email).scalar()
544 if main_email is not None:
544 if main_email is not None:
545 raise AttributeError('email %s is present is user table' % email)
545 raise AttributeError('email %s is present is user table' % email)
546 return email
546 return email
547
547
548 @hybrid_property
548 @hybrid_property
549 def email(self):
549 def email(self):
550 return self._email
550 return self._email
551
551
552 @email.setter
552 @email.setter
553 def email(self, val):
553 def email(self, val):
554 self._email = val.lower() if val else None
554 self._email = val.lower() if val else None
555
555
556
556
557 class UserIpMap(Base, BaseModel):
557 class UserIpMap(Base, BaseModel):
558 __tablename__ = 'user_ip_map'
558 __tablename__ = 'user_ip_map'
559 __table_args__ = (
559 __table_args__ = (
560 UniqueConstraint('user_id', 'ip_addr'),
560 UniqueConstraint('user_id', 'ip_addr'),
561 {'extend_existing': True, 'mysql_engine': 'InnoDB',
561 {'extend_existing': True, 'mysql_engine': 'InnoDB',
562 'mysql_charset': 'utf8'}
562 'mysql_charset': 'utf8'}
563 )
563 )
564 __mapper_args__ = {}
564 __mapper_args__ = {}
565
565
566 ip_id = Column("ip_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
566 ip_id = Column("ip_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
567 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
567 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
568 ip_addr = Column("ip_addr", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
568 ip_addr = Column("ip_addr", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
569 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
569 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
570 user = relationship('User', lazy='joined')
570 user = relationship('User', lazy='joined')
571
571
572 @classmethod
572 @classmethod
573 def _get_ip_range(cls, ip_addr):
573 def _get_ip_range(cls, ip_addr):
574 from rhodecode.lib import ipaddr
574 from rhodecode.lib import ipaddr
575 net = ipaddr.IPNetwork(address=ip_addr)
575 net = ipaddr.IPNetwork(address=ip_addr)
576 return [str(net.network), str(net.broadcast)]
576 return [str(net.network), str(net.broadcast)]
577
577
578 def __json__(self):
578 def __json__(self):
579 return dict(
579 return dict(
580 ip_addr=self.ip_addr,
580 ip_addr=self.ip_addr,
581 ip_range=self._get_ip_range(self.ip_addr)
581 ip_range=self._get_ip_range(self.ip_addr)
582 )
582 )
583
583
584
584
585 class UserLog(Base, BaseModel):
585 class UserLog(Base, BaseModel):
586 __tablename__ = 'user_logs'
586 __tablename__ = 'user_logs'
587 __table_args__ = (
587 __table_args__ = (
588 {'extend_existing': True, 'mysql_engine': 'InnoDB',
588 {'extend_existing': True, 'mysql_engine': 'InnoDB',
589 'mysql_charset': 'utf8'},
589 'mysql_charset': 'utf8'},
590 )
590 )
591 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
591 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
592 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
592 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
593 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
593 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
594 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
594 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
595 repository_name = Column("repository_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
595 repository_name = Column("repository_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
596 user_ip = Column("user_ip", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
596 user_ip = Column("user_ip", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
597 action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
597 action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
598 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
598 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
599
599
600 @property
600 @property
601 def action_as_day(self):
601 def action_as_day(self):
602 return datetime.date(*self.action_date.timetuple()[:3])
602 return datetime.date(*self.action_date.timetuple()[:3])
603
603
604 user = relationship('User')
604 user = relationship('User')
605 repository = relationship('Repository', cascade='')
605 repository = relationship('Repository', cascade='')
606
606
607
607
608 class UserGroup(Base, BaseModel):
608 class UserGroup(Base, BaseModel):
609 __tablename__ = 'users_groups'
609 __tablename__ = 'users_groups'
610 __table_args__ = (
610 __table_args__ = (
611 {'extend_existing': True, 'mysql_engine': 'InnoDB',
611 {'extend_existing': True, 'mysql_engine': 'InnoDB',
612 'mysql_charset': 'utf8'},
612 'mysql_charset': 'utf8'},
613 )
613 )
614
614
615 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
615 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
616 users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
616 users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
617 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
617 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
618 inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
618 inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
619
619
620 members = relationship('UserGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
620 members = relationship('UserGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
621 users_group_to_perm = relationship('UserGroupToPerm', cascade='all')
621 users_group_to_perm = relationship('UserGroupToPerm', cascade='all')
622 users_group_repo_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
622 users_group_repo_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
623
623
624 def __unicode__(self):
624 def __unicode__(self):
625 return u'<userGroup(%s)>' % (self.users_group_name)
625 return u'<userGroup(%s)>' % (self.users_group_name)
626
626
627 @classmethod
627 @classmethod
628 def get_by_group_name(cls, group_name, cache=False,
628 def get_by_group_name(cls, group_name, cache=False,
629 case_insensitive=False):
629 case_insensitive=False):
630 if case_insensitive:
630 if case_insensitive:
631 q = cls.query().filter(cls.users_group_name.ilike(group_name))
631 q = cls.query().filter(cls.users_group_name.ilike(group_name))
632 else:
632 else:
633 q = cls.query().filter(cls.users_group_name == group_name)
633 q = cls.query().filter(cls.users_group_name == group_name)
634 if cache:
634 if cache:
635 q = q.options(FromCache(
635 q = q.options(FromCache(
636 "sql_cache_short",
636 "sql_cache_short",
637 "get_user_%s" % _hash_key(group_name)
637 "get_user_%s" % _hash_key(group_name)
638 )
638 )
639 )
639 )
640 return q.scalar()
640 return q.scalar()
641
641
642 @classmethod
642 @classmethod
643 def get(cls, users_group_id, cache=False):
643 def get(cls, users_group_id, cache=False):
644 users_group = cls.query()
644 users_group = cls.query()
645 if cache:
645 if cache:
646 users_group = users_group.options(FromCache("sql_cache_short",
646 users_group = users_group.options(FromCache("sql_cache_short",
647 "get_users_group_%s" % users_group_id))
647 "get_users_group_%s" % users_group_id))
648 return users_group.get(users_group_id)
648 return users_group.get(users_group_id)
649
649
650 def get_api_data(self):
650 def get_api_data(self):
651 users_group = self
651 users_group = self
652
652
653 data = dict(
653 data = dict(
654 users_group_id=users_group.users_group_id,
654 users_group_id=users_group.users_group_id,
655 group_name=users_group.users_group_name,
655 group_name=users_group.users_group_name,
656 active=users_group.users_group_active,
656 active=users_group.users_group_active,
657 )
657 )
658
658
659 return data
659 return data
660
660
661
661
662 class UserGroupMember(Base, BaseModel):
662 class UserGroupMember(Base, BaseModel):
663 __tablename__ = 'users_groups_members'
663 __tablename__ = 'users_groups_members'
664 __table_args__ = (
664 __table_args__ = (
665 {'extend_existing': True, 'mysql_engine': 'InnoDB',
665 {'extend_existing': True, 'mysql_engine': 'InnoDB',
666 'mysql_charset': 'utf8'},
666 'mysql_charset': 'utf8'},
667 )
667 )
668
668
669 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
669 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
670 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
670 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
671 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
671 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
672
672
673 user = relationship('User', lazy='joined')
673 user = relationship('User', lazy='joined')
674 users_group = relationship('UserGroup')
674 users_group = relationship('UserGroup')
675
675
676 def __init__(self, gr_id='', u_id=''):
676 def __init__(self, gr_id='', u_id=''):
677 self.users_group_id = gr_id
677 self.users_group_id = gr_id
678 self.user_id = u_id
678 self.user_id = u_id
679
679
680
680
681 class RepositoryField(Base, BaseModel):
681 class RepositoryField(Base, BaseModel):
682 __tablename__ = 'repositories_fields'
682 __tablename__ = 'repositories_fields'
683 __table_args__ = (
683 __table_args__ = (
684 UniqueConstraint('repository_id', 'field_key'), # no-multi field
684 UniqueConstraint('repository_id', 'field_key'), # no-multi field
685 {'extend_existing': True, 'mysql_engine': 'InnoDB',
685 {'extend_existing': True, 'mysql_engine': 'InnoDB',
686 'mysql_charset': 'utf8'},
686 'mysql_charset': 'utf8'},
687 )
687 )
688 PREFIX = 'ex_' # prefix used in form to not conflict with already existing fields
688 PREFIX = 'ex_' # prefix used in form to not conflict with already existing fields
689
689
690 repo_field_id = Column("repo_field_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
690 repo_field_id = Column("repo_field_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
691 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
691 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
692 field_key = Column("field_key", String(250, convert_unicode=False, assert_unicode=None))
692 field_key = Column("field_key", String(250, convert_unicode=False, assert_unicode=None))
693 field_label = Column("field_label", String(1024, convert_unicode=False, assert_unicode=None), nullable=False)
693 field_label = Column("field_label", String(1024, convert_unicode=False, assert_unicode=None), nullable=False)
694 field_value = Column("field_value", String(10000, convert_unicode=False, assert_unicode=None), nullable=False)
694 field_value = Column("field_value", String(10000, convert_unicode=False, assert_unicode=None), nullable=False)
695 field_desc = Column("field_desc", String(1024, convert_unicode=False, assert_unicode=None), nullable=False)
695 field_desc = Column("field_desc", String(1024, convert_unicode=False, assert_unicode=None), nullable=False)
696 field_type = Column("field_type", String(256), nullable=False, unique=None)
696 field_type = Column("field_type", String(256), nullable=False, unique=None)
697 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
697 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
698
698
699 repository = relationship('Repository')
699 repository = relationship('Repository')
700
700
701 @property
701 @property
702 def field_key_prefixed(self):
702 def field_key_prefixed(self):
703 return 'ex_%s' % self.field_key
703 return 'ex_%s' % self.field_key
704
704
705 @classmethod
705 @classmethod
706 def un_prefix_key(cls, key):
706 def un_prefix_key(cls, key):
707 if key.startswith(cls.PREFIX):
707 if key.startswith(cls.PREFIX):
708 return key[len(cls.PREFIX):]
708 return key[len(cls.PREFIX):]
709 return key
709 return key
710
710
711 @classmethod
711 @classmethod
712 def get_by_key_name(cls, key, repo):
712 def get_by_key_name(cls, key, repo):
713 row = cls.query()\
713 row = cls.query()\
714 .filter(cls.repository == repo)\
714 .filter(cls.repository == repo)\
715 .filter(cls.field_key == key).scalar()
715 .filter(cls.field_key == key).scalar()
716 return row
716 return row
717
717
718
718
719 class Repository(Base, BaseModel):
719 class Repository(Base, BaseModel):
720 __tablename__ = 'repositories'
720 __tablename__ = 'repositories'
721 __table_args__ = (
721 __table_args__ = (
722 UniqueConstraint('repo_name'),
722 UniqueConstraint('repo_name'),
723 Index('r_repo_name_idx', 'repo_name'),
723 Index('r_repo_name_idx', 'repo_name'),
724 {'extend_existing': True, 'mysql_engine': 'InnoDB',
724 {'extend_existing': True, 'mysql_engine': 'InnoDB',
725 'mysql_charset': 'utf8'},
725 'mysql_charset': 'utf8'},
726 )
726 )
727
727
728 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
728 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
729 repo_name = Column("repo_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
729 repo_name = Column("repo_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
730 clone_uri = Column("clone_uri", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
730 clone_uri = Column("clone_uri", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
731 repo_type = Column("repo_type", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
731 repo_type = Column("repo_type", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
732 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
732 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
733 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
733 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
734 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
734 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
735 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
735 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
736 description = Column("description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
736 description = Column("description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
737 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
737 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
738 updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
738 updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
739 landing_rev = Column("landing_revision", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
739 landing_rev = Column("landing_revision", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
740 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
740 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
741 _locked = Column("locked", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
741 _locked = Column("locked", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
742 _changeset_cache = Column("changeset_cache", LargeBinary(), nullable=True) #JSON data
742 _changeset_cache = Column("changeset_cache", LargeBinary(), nullable=True) #JSON data
743
743
744 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
744 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
745 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
745 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
746
746
747 user = relationship('User')
747 user = relationship('User')
748 fork = relationship('Repository', remote_side=repo_id)
748 fork = relationship('Repository', remote_side=repo_id)
749 group = relationship('RepoGroup')
749 group = relationship('RepoGroup')
750 repo_to_perm = relationship('UserRepoToPerm', cascade='all', order_by='UserRepoToPerm.repo_to_perm_id')
750 repo_to_perm = relationship('UserRepoToPerm', cascade='all', order_by='UserRepoToPerm.repo_to_perm_id')
751 users_group_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
751 users_group_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
752 stats = relationship('Statistics', cascade='all', uselist=False)
752 stats = relationship('Statistics', cascade='all', uselist=False)
753
753
754 followers = relationship('UserFollowing',
754 followers = relationship('UserFollowing',
755 primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id',
755 primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id',
756 cascade='all')
756 cascade='all')
757 extra_fields = relationship('RepositoryField',
757 extra_fields = relationship('RepositoryField',
758 cascade="all, delete, delete-orphan")
758 cascade="all, delete, delete-orphan")
759
759
760 logs = relationship('UserLog')
760 logs = relationship('UserLog')
761 comments = relationship('ChangesetComment', cascade="all, delete, delete-orphan")
761 comments = relationship('ChangesetComment', cascade="all, delete, delete-orphan")
762
762
763 pull_requests_org = relationship('PullRequest',
763 pull_requests_org = relationship('PullRequest',
764 primaryjoin='PullRequest.org_repo_id==Repository.repo_id',
764 primaryjoin='PullRequest.org_repo_id==Repository.repo_id',
765 cascade="all, delete, delete-orphan")
765 cascade="all, delete, delete-orphan")
766
766
767 pull_requests_other = relationship('PullRequest',
767 pull_requests_other = relationship('PullRequest',
768 primaryjoin='PullRequest.other_repo_id==Repository.repo_id',
768 primaryjoin='PullRequest.other_repo_id==Repository.repo_id',
769 cascade="all, delete, delete-orphan")
769 cascade="all, delete, delete-orphan")
770
770
771 def __unicode__(self):
771 def __unicode__(self):
772 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id,
772 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id,
773 self.repo_name)
773 self.repo_name)
774
774
775 @hybrid_property
775 @hybrid_property
776 def locked(self):
776 def locked(self):
777 # always should return [user_id, timelocked]
777 # always should return [user_id, timelocked]
778 if self._locked:
778 if self._locked:
779 _lock_info = self._locked.split(':')
779 _lock_info = self._locked.split(':')
780 return int(_lock_info[0]), _lock_info[1]
780 return int(_lock_info[0]), _lock_info[1]
781 return [None, None]
781 return [None, None]
782
782
783 @locked.setter
783 @locked.setter
784 def locked(self, val):
784 def locked(self, val):
785 if val and isinstance(val, (list, tuple)):
785 if val and isinstance(val, (list, tuple)):
786 self._locked = ':'.join(map(str, val))
786 self._locked = ':'.join(map(str, val))
787 else:
787 else:
788 self._locked = None
788 self._locked = None
789
789
790 @hybrid_property
790 @hybrid_property
791 def changeset_cache(self):
791 def changeset_cache(self):
792 from rhodecode.lib.vcs.backends.base import EmptyChangeset
792 from rhodecode.lib.vcs.backends.base import EmptyChangeset
793 dummy = EmptyChangeset().__json__()
793 dummy = EmptyChangeset().__json__()
794 if not self._changeset_cache:
794 if not self._changeset_cache:
795 return dummy
795 return dummy
796 try:
796 try:
797 return json.loads(self._changeset_cache)
797 return json.loads(self._changeset_cache)
798 except TypeError:
798 except TypeError:
799 return dummy
799 return dummy
800
800
801 @changeset_cache.setter
801 @changeset_cache.setter
802 def changeset_cache(self, val):
802 def changeset_cache(self, val):
803 try:
803 try:
804 self._changeset_cache = json.dumps(val)
804 self._changeset_cache = json.dumps(val)
805 except:
805 except:
806 log.error(traceback.format_exc())
806 log.error(traceback.format_exc())
807
807
808 @classmethod
808 @classmethod
809 def url_sep(cls):
809 def url_sep(cls):
810 return URL_SEP
810 return URL_SEP
811
811
812 @classmethod
812 @classmethod
813 def normalize_repo_name(cls, repo_name):
813 def normalize_repo_name(cls, repo_name):
814 """
814 """
815 Normalizes os specific repo_name to the format internally stored inside
815 Normalizes os specific repo_name to the format internally stored inside
816 dabatabase using URL_SEP
816 dabatabase using URL_SEP
817
817
818 :param cls:
818 :param cls:
819 :param repo_name:
819 :param repo_name:
820 """
820 """
821 return cls.url_sep().join(repo_name.split(os.sep))
821 return cls.url_sep().join(repo_name.split(os.sep))
822
822
823 @classmethod
823 @classmethod
824 def get_by_repo_name(cls, repo_name):
824 def get_by_repo_name(cls, repo_name):
825 q = Session().query(cls).filter(cls.repo_name == repo_name)
825 q = Session().query(cls).filter(cls.repo_name == repo_name)
826 q = q.options(joinedload(Repository.fork))\
826 q = q.options(joinedload(Repository.fork))\
827 .options(joinedload(Repository.user))\
827 .options(joinedload(Repository.user))\
828 .options(joinedload(Repository.group))
828 .options(joinedload(Repository.group))
829 return q.scalar()
829 return q.scalar()
830
830
831 @classmethod
831 @classmethod
832 def get_by_full_path(cls, repo_full_path):
832 def get_by_full_path(cls, repo_full_path):
833 repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
833 repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
834 repo_name = cls.normalize_repo_name(repo_name)
834 repo_name = cls.normalize_repo_name(repo_name)
835 return cls.get_by_repo_name(repo_name.strip(URL_SEP))
835 return cls.get_by_repo_name(repo_name.strip(URL_SEP))
836
836
837 @classmethod
837 @classmethod
838 def get_repo_forks(cls, repo_id):
838 def get_repo_forks(cls, repo_id):
839 return cls.query().filter(Repository.fork_id == repo_id)
839 return cls.query().filter(Repository.fork_id == repo_id)
840
840
841 @classmethod
841 @classmethod
842 def base_path(cls):
842 def base_path(cls):
843 """
843 """
844 Returns base path when all repos are stored
844 Returns base path when all repos are stored
845
845
846 :param cls:
846 :param cls:
847 """
847 """
848 q = Session().query(RhodeCodeUi)\
848 q = Session().query(RhodeCodeUi)\
849 .filter(RhodeCodeUi.ui_key == cls.url_sep())
849 .filter(RhodeCodeUi.ui_key == cls.url_sep())
850 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
850 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
851 return q.one().ui_value
851 return q.one().ui_value
852
852
853 @property
853 @property
854 def forks(self):
854 def forks(self):
855 """
855 """
856 Return forks of this repo
856 Return forks of this repo
857 """
857 """
858 return Repository.get_repo_forks(self.repo_id)
858 return Repository.get_repo_forks(self.repo_id)
859
859
860 @property
860 @property
861 def parent(self):
861 def parent(self):
862 """
862 """
863 Returns fork parent
863 Returns fork parent
864 """
864 """
865 return self.fork
865 return self.fork
866
866
867 @property
867 @property
868 def just_name(self):
868 def just_name(self):
869 return self.repo_name.split(Repository.url_sep())[-1]
869 return self.repo_name.split(Repository.url_sep())[-1]
870
870
871 @property
871 @property
872 def groups_with_parents(self):
872 def groups_with_parents(self):
873 groups = []
873 groups = []
874 if self.group is None:
874 if self.group is None:
875 return groups
875 return groups
876
876
877 cur_gr = self.group
877 cur_gr = self.group
878 groups.insert(0, cur_gr)
878 groups.insert(0, cur_gr)
879 while 1:
879 while 1:
880 gr = getattr(cur_gr, 'parent_group', None)
880 gr = getattr(cur_gr, 'parent_group', None)
881 cur_gr = cur_gr.parent_group
881 cur_gr = cur_gr.parent_group
882 if gr is None:
882 if gr is None:
883 break
883 break
884 groups.insert(0, gr)
884 groups.insert(0, gr)
885
885
886 return groups
886 return groups
887
887
888 @property
888 @property
889 def groups_and_repo(self):
889 def groups_and_repo(self):
890 return self.groups_with_parents, self.just_name
890 return self.groups_with_parents, self.just_name
891
891
892 @LazyProperty
892 @LazyProperty
893 def repo_path(self):
893 def repo_path(self):
894 """
894 """
895 Returns base full path for that repository means where it actually
895 Returns base full path for that repository means where it actually
896 exists on a filesystem
896 exists on a filesystem
897 """
897 """
898 q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
898 q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
899 Repository.url_sep())
899 Repository.url_sep())
900 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
900 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
901 return q.one().ui_value
901 return q.one().ui_value
902
902
903 @property
903 @property
904 def repo_full_path(self):
904 def repo_full_path(self):
905 p = [self.repo_path]
905 p = [self.repo_path]
906 # we need to split the name by / since this is how we store the
906 # we need to split the name by / since this is how we store the
907 # names in the database, but that eventually needs to be converted
907 # names in the database, but that eventually needs to be converted
908 # into a valid system path
908 # into a valid system path
909 p += self.repo_name.split(Repository.url_sep())
909 p += self.repo_name.split(Repository.url_sep())
910 return os.path.join(*p)
910 return os.path.join(*p)
911
911
912 @property
912 @property
913 def cache_keys(self):
913 def cache_keys(self):
914 """
914 """
915 Returns associated cache keys for that repo
915 Returns associated cache keys for that repo
916 """
916 """
917 return CacheInvalidation.query()\
917 return CacheInvalidation.query()\
918 .filter(CacheInvalidation.cache_args == self.repo_name)\
918 .filter(CacheInvalidation.cache_args == self.repo_name)\
919 .order_by(CacheInvalidation.cache_key)\
919 .order_by(CacheInvalidation.cache_key)\
920 .all()
920 .all()
921
921
922 def get_new_name(self, repo_name):
922 def get_new_name(self, repo_name):
923 """
923 """
924 returns new full repository name based on assigned group and new new
924 returns new full repository name based on assigned group and new new
925
925
926 :param group_name:
926 :param group_name:
927 """
927 """
928 path_prefix = self.group.full_path_splitted if self.group else []
928 path_prefix = self.group.full_path_splitted if self.group else []
929 return Repository.url_sep().join(path_prefix + [repo_name])
929 return Repository.url_sep().join(path_prefix + [repo_name])
930
930
931 @property
931 @property
932 def _ui(self):
932 def _ui(self):
933 """
933 """
934 Creates an db based ui object for this repository
934 Creates an db based ui object for this repository
935 """
935 """
936 from rhodecode.lib.utils import make_ui
936 from rhodecode.lib.utils import make_ui
937 return make_ui('db', clear_session=False)
937 return make_ui('db', clear_session=False)
938
938
939 @classmethod
939 @classmethod
940 def inject_ui(cls, repo, extras={}):
940 def inject_ui(cls, repo, extras={}):
941 from rhodecode.lib.vcs.backends.hg import MercurialRepository
941 from rhodecode.lib.vcs.backends.hg import MercurialRepository
942 from rhodecode.lib.vcs.backends.git import GitRepository
942 from rhodecode.lib.vcs.backends.git import GitRepository
943 required = (MercurialRepository, GitRepository)
943 required = (MercurialRepository, GitRepository)
944 if not isinstance(repo, required):
944 if not isinstance(repo, required):
945 raise Exception('repo must be instance of %s' % required)
945 raise Exception('repo must be instance of %s' % required)
946
946
947 # inject ui extra param to log this action via push logger
947 # inject ui extra param to log this action via push logger
948 for k, v in extras.items():
948 for k, v in extras.items():
949 repo._repo.ui.setconfig('rhodecode_extras', k, v)
949 repo._repo.ui.setconfig('rhodecode_extras', k, v)
950
950
951 @classmethod
951 @classmethod
952 def is_valid(cls, repo_name):
952 def is_valid(cls, repo_name):
953 """
953 """
954 returns True if given repo name is a valid filesystem repository
954 returns True if given repo name is a valid filesystem repository
955
955
956 :param cls:
956 :param cls:
957 :param repo_name:
957 :param repo_name:
958 """
958 """
959 from rhodecode.lib.utils import is_valid_repo
959 from rhodecode.lib.utils import is_valid_repo
960
960
961 return is_valid_repo(repo_name, cls.base_path())
961 return is_valid_repo(repo_name, cls.base_path())
962
962
963 def get_api_data(self):
963 def get_api_data(self):
964 """
964 """
965 Common function for generating repo api data
965 Common function for generating repo api data
966
966
967 """
967 """
968 repo = self
968 repo = self
969 data = dict(
969 data = dict(
970 repo_id=repo.repo_id,
970 repo_id=repo.repo_id,
971 repo_name=repo.repo_name,
971 repo_name=repo.repo_name,
972 repo_type=repo.repo_type,
972 repo_type=repo.repo_type,
973 clone_uri=repo.clone_uri,
973 clone_uri=repo.clone_uri,
974 private=repo.private,
974 private=repo.private,
975 created_on=repo.created_on,
975 created_on=repo.created_on,
976 description=repo.description,
976 description=repo.description,
977 landing_rev=repo.landing_rev,
977 landing_rev=repo.landing_rev,
978 owner=repo.user.username,
978 owner=repo.user.username,
979 fork_of=repo.fork.repo_name if repo.fork else None,
979 fork_of=repo.fork.repo_name if repo.fork else None,
980 enable_statistics=repo.enable_statistics,
980 enable_statistics=repo.enable_statistics,
981 enable_locking=repo.enable_locking,
981 enable_locking=repo.enable_locking,
982 enable_downloads=repo.enable_downloads,
982 enable_downloads=repo.enable_downloads,
983 last_changeset=repo.changeset_cache
983 last_changeset=repo.changeset_cache
984 )
984 )
985 rc_config = RhodeCodeSetting.get_app_settings()
985 rc_config = RhodeCodeSetting.get_app_settings()
986 repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
986 repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
987 if repository_fields:
987 if repository_fields:
988 for f in self.extra_fields:
988 for f in self.extra_fields:
989 data[f.field_key_prefixed] = f.field_value
989 data[f.field_key_prefixed] = f.field_value
990
990
991 return data
991 return data
992
992
993 @classmethod
993 @classmethod
994 def lock(cls, repo, user_id):
994 def lock(cls, repo, user_id):
995 repo.locked = [user_id, time.time()]
995 repo.locked = [user_id, time.time()]
996 Session().add(repo)
996 Session().add(repo)
997 Session().commit()
997 Session().commit()
998
998
999 @classmethod
999 @classmethod
1000 def unlock(cls, repo):
1000 def unlock(cls, repo):
1001 repo.locked = None
1001 repo.locked = None
1002 Session().add(repo)
1002 Session().add(repo)
1003 Session().commit()
1003 Session().commit()
1004
1004
1005 @classmethod
1005 @classmethod
1006 def getlock(cls, repo):
1006 def getlock(cls, repo):
1007 return repo.locked
1007 return repo.locked
1008
1008
1009 @property
1009 @property
1010 def last_db_change(self):
1010 def last_db_change(self):
1011 return self.updated_on
1011 return self.updated_on
1012
1012
1013 def clone_url(self, **override):
1013 def clone_url(self, **override):
1014 from pylons import url
1014 from pylons import url
1015 from urlparse import urlparse
1015 from urlparse import urlparse
1016 import urllib
1016 import urllib
1017 parsed_url = urlparse(url('home', qualified=True))
1017 parsed_url = urlparse(url('home', qualified=True))
1018 default_clone_uri = '%(scheme)s://%(user)s%(pass)s%(netloc)s%(prefix)s%(path)s'
1018 default_clone_uri = '%(scheme)s://%(user)s%(pass)s%(netloc)s%(prefix)s%(path)s'
1019 decoded_path = safe_unicode(urllib.unquote(parsed_url.path))
1019 decoded_path = safe_unicode(urllib.unquote(parsed_url.path))
1020 args = {
1020 args = {
1021 'user': '',
1021 'user': '',
1022 'pass': '',
1022 'pass': '',
1023 'scheme': parsed_url.scheme,
1023 'scheme': parsed_url.scheme,
1024 'netloc': parsed_url.netloc,
1024 'netloc': parsed_url.netloc,
1025 'prefix': decoded_path,
1025 'prefix': decoded_path,
1026 'path': self.repo_name
1026 'path': self.repo_name
1027 }
1027 }
1028
1028
1029 args.update(override)
1029 args.update(override)
1030 return default_clone_uri % args
1030 return default_clone_uri % args
1031
1031
1032 #==========================================================================
1032 #==========================================================================
1033 # SCM PROPERTIES
1033 # SCM PROPERTIES
1034 #==========================================================================
1034 #==========================================================================
1035
1035
1036 def get_changeset(self, rev=None):
1036 def get_changeset(self, rev=None):
1037 return get_changeset_safe(self.scm_instance, rev)
1037 return get_changeset_safe(self.scm_instance, rev)
1038
1038
1039 def get_landing_changeset(self):
1039 def get_landing_changeset(self):
1040 """
1040 """
1041 Returns landing changeset, or if that doesn't exist returns the tip
1041 Returns landing changeset, or if that doesn't exist returns the tip
1042 """
1042 """
1043 cs = self.get_changeset(self.landing_rev) or self.get_changeset()
1043 cs = self.get_changeset(self.landing_rev) or self.get_changeset()
1044 return cs
1044 return cs
1045
1045
1046 def update_changeset_cache(self, cs_cache=None):
1046 def update_changeset_cache(self, cs_cache=None):
1047 """
1047 """
1048 Update cache of last changeset for repository, keys should be::
1048 Update cache of last changeset for repository, keys should be::
1049
1049
1050 short_id
1050 short_id
1051 raw_id
1051 raw_id
1052 revision
1052 revision
1053 message
1053 message
1054 date
1054 date
1055 author
1055 author
1056
1056
1057 :param cs_cache:
1057 :param cs_cache:
1058 """
1058 """
1059 from rhodecode.lib.vcs.backends.base import BaseChangeset
1059 from rhodecode.lib.vcs.backends.base import BaseChangeset
1060 if cs_cache is None:
1060 if cs_cache is None:
1061 cs_cache = EmptyChangeset()
1061 cs_cache = EmptyChangeset()
1062 # use no-cache version here
1062 # use no-cache version here
1063 scm_repo = self.scm_instance_no_cache
1063 scm_repo = self.scm_instance_no_cache
1064 if scm_repo:
1064 if scm_repo:
1065 cs_cache = scm_repo.get_changeset()
1065 cs_cache = scm_repo.get_changeset()
1066
1066
1067 if isinstance(cs_cache, BaseChangeset):
1067 if isinstance(cs_cache, BaseChangeset):
1068 cs_cache = cs_cache.__json__()
1068 cs_cache = cs_cache.__json__()
1069
1069
1070 if (cs_cache != self.changeset_cache or not self.changeset_cache):
1070 if (cs_cache != self.changeset_cache or not self.changeset_cache):
1071 _default = datetime.datetime.fromtimestamp(0)
1071 _default = datetime.datetime.fromtimestamp(0)
1072 last_change = cs_cache.get('date') or _default
1072 last_change = cs_cache.get('date') or _default
1073 log.debug('updated repo %s with new cs cache %s' % (self, cs_cache))
1073 log.debug('updated repo %s with new cs cache %s' % (self, cs_cache))
1074 self.updated_on = last_change
1074 self.updated_on = last_change
1075 self.changeset_cache = cs_cache
1075 self.changeset_cache = cs_cache
1076 Session().add(self)
1076 Session().add(self)
1077 Session().commit()
1077 Session().commit()
1078 else:
1078 else:
1079 log.debug('Skipping repo:%s already with latest changes' % self)
1079 log.debug('Skipping repo:%s already with latest changes' % self)
1080
1080
1081 @property
1081 @property
1082 def tip(self):
1082 def tip(self):
1083 return self.get_changeset('tip')
1083 return self.get_changeset('tip')
1084
1084
1085 @property
1085 @property
1086 def author(self):
1086 def author(self):
1087 return self.tip.author
1087 return self.tip.author
1088
1088
1089 @property
1089 @property
1090 def last_change(self):
1090 def last_change(self):
1091 return self.scm_instance.last_change
1091 return self.scm_instance.last_change
1092
1092
1093 def get_comments(self, revisions=None):
1093 def get_comments(self, revisions=None):
1094 """
1094 """
1095 Returns comments for this repository grouped by revisions
1095 Returns comments for this repository grouped by revisions
1096
1096
1097 :param revisions: filter query by revisions only
1097 :param revisions: filter query by revisions only
1098 """
1098 """
1099 cmts = ChangesetComment.query()\
1099 cmts = ChangesetComment.query()\
1100 .filter(ChangesetComment.repo == self)
1100 .filter(ChangesetComment.repo == self)
1101 if revisions:
1101 if revisions:
1102 cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
1102 cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
1103 grouped = defaultdict(list)
1103 grouped = defaultdict(list)
1104 for cmt in cmts.all():
1104 for cmt in cmts.all():
1105 grouped[cmt.revision].append(cmt)
1105 grouped[cmt.revision].append(cmt)
1106 return grouped
1106 return grouped
1107
1107
1108 def statuses(self, revisions=None):
1108 def statuses(self, revisions=None):
1109 """
1109 """
1110 Returns statuses for this repository
1110 Returns statuses for this repository
1111
1111
1112 :param revisions: list of revisions to get statuses for
1112 :param revisions: list of revisions to get statuses for
1113 :type revisions: list
1113 :type revisions: list
1114 """
1114 """
1115
1115
1116 statuses = ChangesetStatus.query()\
1116 statuses = ChangesetStatus.query()\
1117 .filter(ChangesetStatus.repo == self)\
1117 .filter(ChangesetStatus.repo == self)\
1118 .filter(ChangesetStatus.version == 0)
1118 .filter(ChangesetStatus.version == 0)
1119 if revisions:
1119 if revisions:
1120 statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
1120 statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
1121 grouped = {}
1121 grouped = {}
1122
1122
1123 #maybe we have open new pullrequest without a status ?
1123 #maybe we have open new pullrequest without a status ?
1124 stat = ChangesetStatus.STATUS_UNDER_REVIEW
1124 stat = ChangesetStatus.STATUS_UNDER_REVIEW
1125 status_lbl = ChangesetStatus.get_status_lbl(stat)
1125 status_lbl = ChangesetStatus.get_status_lbl(stat)
1126 for pr in PullRequest.query().filter(PullRequest.org_repo == self).all():
1126 for pr in PullRequest.query().filter(PullRequest.org_repo == self).all():
1127 for rev in pr.revisions:
1127 for rev in pr.revisions:
1128 pr_id = pr.pull_request_id
1128 pr_id = pr.pull_request_id
1129 pr_repo = pr.other_repo.repo_name
1129 pr_repo = pr.other_repo.repo_name
1130 grouped[rev] = [stat, status_lbl, pr_id, pr_repo]
1130 grouped[rev] = [stat, status_lbl, pr_id, pr_repo]
1131
1131
1132 for stat in statuses.all():
1132 for stat in statuses.all():
1133 pr_id = pr_repo = None
1133 pr_id = pr_repo = None
1134 if stat.pull_request:
1134 if stat.pull_request:
1135 pr_id = stat.pull_request.pull_request_id
1135 pr_id = stat.pull_request.pull_request_id
1136 pr_repo = stat.pull_request.other_repo.repo_name
1136 pr_repo = stat.pull_request.other_repo.repo_name
1137 grouped[stat.revision] = [str(stat.status), stat.status_lbl,
1137 grouped[stat.revision] = [str(stat.status), stat.status_lbl,
1138 pr_id, pr_repo]
1138 pr_id, pr_repo]
1139 return grouped
1139 return grouped
1140
1140
1141 def _repo_size(self):
1141 def _repo_size(self):
1142 from rhodecode.lib import helpers as h
1142 from rhodecode.lib import helpers as h
1143 log.debug('calculating repository size...')
1143 log.debug('calculating repository size...')
1144 return h.format_byte_size(self.scm_instance.size)
1144 return h.format_byte_size(self.scm_instance.size)
1145
1145
1146 #==========================================================================
1146 #==========================================================================
1147 # SCM CACHE INSTANCE
1147 # SCM CACHE INSTANCE
1148 #==========================================================================
1148 #==========================================================================
1149
1149
1150 @property
1150 @property
1151 def invalidate(self):
1151 def invalidate(self):
1152 return CacheInvalidation.invalidate(self.repo_name)
1152 return CacheInvalidation.invalidate(self.repo_name)
1153
1153
1154 def set_invalidate(self):
1154 def set_invalidate(self):
1155 """
1155 """
1156 set a cache for invalidation for this instance
1156 set a cache for invalidation for this instance
1157 """
1157 """
1158 CacheInvalidation.set_invalidate(repo_name=self.repo_name)
1158 CacheInvalidation.set_invalidate(repo_name=self.repo_name)
1159
1159
1160 @LazyProperty
1160 @LazyProperty
1161 def scm_instance_no_cache(self):
1161 def scm_instance_no_cache(self):
1162 return self.__get_instance()
1162 return self.__get_instance()
1163
1163
1164 @LazyProperty
1164 @LazyProperty
1165 def scm_instance(self):
1165 def scm_instance(self):
1166 import rhodecode
1166 import rhodecode
1167 full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
1167 full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
1168 if full_cache:
1168 if full_cache:
1169 return self.scm_instance_cached()
1169 return self.scm_instance_cached()
1170 return self.__get_instance()
1170 return self.__get_instance()
1171
1171
1172 def scm_instance_cached(self, cache_map=None):
1172 def scm_instance_cached(self, cache_map=None):
1173 @cache_region('long_term')
1173 @cache_region('long_term')
1174 def _c(repo_name):
1174 def _c(repo_name):
1175 return self.__get_instance()
1175 return self.__get_instance()
1176 rn = self.repo_name
1176 rn = self.repo_name
1177 log.debug('Getting cached instance of repo')
1177 log.debug('Getting cached instance of repo')
1178
1178
1179 if cache_map:
1179 if cache_map:
1180 # get using prefilled cache_map
1180 # get using prefilled cache_map
1181 invalidate_repo = cache_map[self.repo_name]
1181 invalidate_repo = cache_map[self.repo_name]
1182 if invalidate_repo:
1182 if invalidate_repo:
1183 invalidate_repo = (None if invalidate_repo.cache_active
1183 invalidate_repo = (None if invalidate_repo.cache_active
1184 else invalidate_repo)
1184 else invalidate_repo)
1185 else:
1185 else:
1186 # get from invalidate
1186 # get from invalidate
1187 invalidate_repo = self.invalidate
1187 invalidate_repo = self.invalidate
1188
1188
1189 if invalidate_repo is not None:
1189 if invalidate_repo is not None:
1190 region_invalidate(_c, None, rn)
1190 region_invalidate(_c, None, rn)
1191 # update our cache
1191 # update our cache
1192 CacheInvalidation.set_valid(invalidate_repo.cache_key)
1192 CacheInvalidation.set_valid(invalidate_repo.cache_key)
1193 return _c(rn)
1193 return _c(rn)
1194
1194
1195 def __get_instance(self):
1195 def __get_instance(self):
1196 repo_full_path = self.repo_full_path
1196 repo_full_path = self.repo_full_path
1197 try:
1197 try:
1198 alias = get_scm(repo_full_path)[0]
1198 alias = get_scm(repo_full_path)[0]
1199 log.debug('Creating instance of %s repository from %s'
1199 log.debug('Creating instance of %s repository from %s'
1200 % (alias, repo_full_path))
1200 % (alias, repo_full_path))
1201 backend = get_backend(alias)
1201 backend = get_backend(alias)
1202 except VCSError:
1202 except VCSError:
1203 log.error(traceback.format_exc())
1203 log.error(traceback.format_exc())
1204 log.error('Perhaps this repository is in db and not in '
1204 log.error('Perhaps this repository is in db and not in '
1205 'filesystem run rescan repositories with '
1205 'filesystem run rescan repositories with '
1206 '"destroy old data " option from admin panel')
1206 '"destroy old data " option from admin panel')
1207 return
1207 return
1208
1208
1209 if alias == 'hg':
1209 if alias == 'hg':
1210
1210
1211 repo = backend(safe_str(repo_full_path), create=False,
1211 repo = backend(safe_str(repo_full_path), create=False,
1212 baseui=self._ui)
1212 baseui=self._ui)
1213 # skip hidden web repository
1213 # skip hidden web repository
1214 if repo._get_hidden():
1214 if repo._get_hidden():
1215 return
1215 return
1216 else:
1216 else:
1217 repo = backend(repo_full_path, create=False)
1217 repo = backend(repo_full_path, create=False)
1218
1218
1219 return repo
1219 return repo
1220
1220
1221
1221
1222 class RepoGroup(Base, BaseModel):
1222 class RepoGroup(Base, BaseModel):
1223 __tablename__ = 'groups'
1223 __tablename__ = 'groups'
1224 __table_args__ = (
1224 __table_args__ = (
1225 UniqueConstraint('group_name', 'group_parent_id'),
1225 UniqueConstraint('group_name', 'group_parent_id'),
1226 CheckConstraint('group_id != group_parent_id'),
1226 CheckConstraint('group_id != group_parent_id'),
1227 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1227 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1228 'mysql_charset': 'utf8'},
1228 'mysql_charset': 'utf8'},
1229 )
1229 )
1230 __mapper_args__ = {'order_by': 'group_name'}
1230 __mapper_args__ = {'order_by': 'group_name'}
1231
1231
1232 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1232 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1233 group_name = Column("group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
1233 group_name = Column("group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
1234 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
1234 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
1235 group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1235 group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1236 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
1236 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
1237
1237
1238 repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
1238 repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
1239 users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
1239 users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
1240
1240
1241 parent_group = relationship('RepoGroup', remote_side=group_id)
1241 parent_group = relationship('RepoGroup', remote_side=group_id)
1242
1242
1243 def __init__(self, group_name='', parent_group=None):
1243 def __init__(self, group_name='', parent_group=None):
1244 self.group_name = group_name
1244 self.group_name = group_name
1245 self.parent_group = parent_group
1245 self.parent_group = parent_group
1246
1246
1247 def __unicode__(self):
1247 def __unicode__(self):
1248 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
1248 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
1249 self.group_name)
1249 self.group_name)
1250
1250
1251 @classmethod
1251 @classmethod
1252 def groups_choices(cls, groups=None, show_empty_group=True):
1252 def groups_choices(cls, groups=None, show_empty_group=True):
1253 from webhelpers.html import literal as _literal
1253 from webhelpers.html import literal as _literal
1254 if not groups:
1254 if not groups:
1255 groups = cls.query().all()
1255 groups = cls.query().all()
1256
1256
1257 repo_groups = []
1257 repo_groups = []
1258 if show_empty_group:
1258 if show_empty_group:
1259 repo_groups = [('-1', '-- no parent --')]
1259 repo_groups = [('-1', '-- no parent --')]
1260 sep = ' &raquo; '
1260 sep = ' &raquo; '
1261 _name = lambda k: _literal(sep.join(k))
1261 _name = lambda k: _literal(sep.join(k))
1262
1262
1263 repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
1263 repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
1264 for x in groups])
1264 for x in groups])
1265
1265
1266 repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
1266 repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
1267 return repo_groups
1267 return repo_groups
1268
1268
1269 @classmethod
1269 @classmethod
1270 def url_sep(cls):
1270 def url_sep(cls):
1271 return URL_SEP
1271 return URL_SEP
1272
1272
1273 @classmethod
1273 @classmethod
1274 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
1274 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
1275 if case_insensitive:
1275 if case_insensitive:
1276 gr = cls.query()\
1276 gr = cls.query()\
1277 .filter(cls.group_name.ilike(group_name))
1277 .filter(cls.group_name.ilike(group_name))
1278 else:
1278 else:
1279 gr = cls.query()\
1279 gr = cls.query()\
1280 .filter(cls.group_name == group_name)
1280 .filter(cls.group_name == group_name)
1281 if cache:
1281 if cache:
1282 gr = gr.options(FromCache(
1282 gr = gr.options(FromCache(
1283 "sql_cache_short",
1283 "sql_cache_short",
1284 "get_group_%s" % _hash_key(group_name)
1284 "get_group_%s" % _hash_key(group_name)
1285 )
1285 )
1286 )
1286 )
1287 return gr.scalar()
1287 return gr.scalar()
1288
1288
1289 @property
1289 @property
1290 def parents(self):
1290 def parents(self):
1291 parents_recursion_limit = 5
1291 parents_recursion_limit = 5
1292 groups = []
1292 groups = []
1293 if self.parent_group is None:
1293 if self.parent_group is None:
1294 return groups
1294 return groups
1295 cur_gr = self.parent_group
1295 cur_gr = self.parent_group
1296 groups.insert(0, cur_gr)
1296 groups.insert(0, cur_gr)
1297 cnt = 0
1297 cnt = 0
1298 while 1:
1298 while 1:
1299 cnt += 1
1299 cnt += 1
1300 gr = getattr(cur_gr, 'parent_group', None)
1300 gr = getattr(cur_gr, 'parent_group', None)
1301 cur_gr = cur_gr.parent_group
1301 cur_gr = cur_gr.parent_group
1302 if gr is None:
1302 if gr is None:
1303 break
1303 break
1304 if cnt == parents_recursion_limit:
1304 if cnt == parents_recursion_limit:
1305 # this will prevent accidental infinit loops
1305 # this will prevent accidental infinit loops
1306 log.error('group nested more than %s' %
1306 log.error('group nested more than %s' %
1307 parents_recursion_limit)
1307 parents_recursion_limit)
1308 break
1308 break
1309
1309
1310 groups.insert(0, gr)
1310 groups.insert(0, gr)
1311 return groups
1311 return groups
1312
1312
1313 @property
1313 @property
1314 def children(self):
1314 def children(self):
1315 return RepoGroup.query().filter(RepoGroup.parent_group == self)
1315 return RepoGroup.query().filter(RepoGroup.parent_group == self)
1316
1316
1317 @property
1317 @property
1318 def name(self):
1318 def name(self):
1319 return self.group_name.split(RepoGroup.url_sep())[-1]
1319 return self.group_name.split(RepoGroup.url_sep())[-1]
1320
1320
1321 @property
1321 @property
1322 def full_path(self):
1322 def full_path(self):
1323 return self.group_name
1323 return self.group_name
1324
1324
1325 @property
1325 @property
1326 def full_path_splitted(self):
1326 def full_path_splitted(self):
1327 return self.group_name.split(RepoGroup.url_sep())
1327 return self.group_name.split(RepoGroup.url_sep())
1328
1328
1329 @property
1329 @property
1330 def repositories(self):
1330 def repositories(self):
1331 return Repository.query()\
1331 return Repository.query()\
1332 .filter(Repository.group == self)\
1332 .filter(Repository.group == self)\
1333 .order_by(Repository.repo_name)
1333 .order_by(Repository.repo_name)
1334
1334
1335 @property
1335 @property
1336 def repositories_recursive_count(self):
1336 def repositories_recursive_count(self):
1337 cnt = self.repositories.count()
1337 cnt = self.repositories.count()
1338
1338
1339 def children_count(group):
1339 def children_count(group):
1340 cnt = 0
1340 cnt = 0
1341 for child in group.children:
1341 for child in group.children:
1342 cnt += child.repositories.count()
1342 cnt += child.repositories.count()
1343 cnt += children_count(child)
1343 cnt += children_count(child)
1344 return cnt
1344 return cnt
1345
1345
1346 return cnt + children_count(self)
1346 return cnt + children_count(self)
1347
1347
1348 def _recursive_objects(self, include_repos=True):
1348 def _recursive_objects(self, include_repos=True):
1349 all_ = []
1349 all_ = []
1350
1350
1351 def _get_members(root_gr):
1351 def _get_members(root_gr):
1352 if include_repos:
1352 if include_repos:
1353 for r in root_gr.repositories:
1353 for r in root_gr.repositories:
1354 all_.append(r)
1354 all_.append(r)
1355 childs = root_gr.children.all()
1355 childs = root_gr.children.all()
1356 if childs:
1356 if childs:
1357 for gr in childs:
1357 for gr in childs:
1358 all_.append(gr)
1358 all_.append(gr)
1359 _get_members(gr)
1359 _get_members(gr)
1360
1360
1361 _get_members(self)
1361 _get_members(self)
1362 return [self] + all_
1362 return [self] + all_
1363
1363
1364 def recursive_groups_and_repos(self):
1364 def recursive_groups_and_repos(self):
1365 """
1365 """
1366 Recursive return all groups, with repositories in those groups
1366 Recursive return all groups, with repositories in those groups
1367 """
1367 """
1368 return self._recursive_objects()
1368 return self._recursive_objects()
1369
1369
1370 def recursive_groups(self):
1370 def recursive_groups(self):
1371 """
1371 """
1372 Returns all children groups for this group including children of children
1372 Returns all children groups for this group including children of children
1373 """
1373 """
1374 return self._recursive_objects(include_repos=False)
1374 return self._recursive_objects(include_repos=False)
1375
1375
1376 def get_new_name(self, group_name):
1376 def get_new_name(self, group_name):
1377 """
1377 """
1378 returns new full group name based on parent and new name
1378 returns new full group name based on parent and new name
1379
1379
1380 :param group_name:
1380 :param group_name:
1381 """
1381 """
1382 path_prefix = (self.parent_group.full_path_splitted if
1382 path_prefix = (self.parent_group.full_path_splitted if
1383 self.parent_group else [])
1383 self.parent_group else [])
1384 return RepoGroup.url_sep().join(path_prefix + [group_name])
1384 return RepoGroup.url_sep().join(path_prefix + [group_name])
1385
1385
1386
1386
1387 class Permission(Base, BaseModel):
1387 class Permission(Base, BaseModel):
1388 __tablename__ = 'permissions'
1388 __tablename__ = 'permissions'
1389 __table_args__ = (
1389 __table_args__ = (
1390 Index('p_perm_name_idx', 'permission_name'),
1390 Index('p_perm_name_idx', 'permission_name'),
1391 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1391 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1392 'mysql_charset': 'utf8'},
1392 'mysql_charset': 'utf8'},
1393 )
1393 )
1394 PERMS = [
1394 PERMS = [
1395 ('repository.none', _('Repository no access')),
1395 ('repository.none', _('Repository no access')),
1396 ('repository.read', _('Repository read access')),
1396 ('repository.read', _('Repository read access')),
1397 ('repository.write', _('Repository write access')),
1397 ('repository.write', _('Repository write access')),
1398 ('repository.admin', _('Repository admin access')),
1398 ('repository.admin', _('Repository admin access')),
1399
1399
1400 ('group.none', _('Repository group no access')),
1400 ('group.none', _('Repository group no access')),
1401 ('group.read', _('Repository group read access')),
1401 ('group.read', _('Repository group read access')),
1402 ('group.write', _('Repository group write access')),
1402 ('group.write', _('Repository group write access')),
1403 ('group.admin', _('Repository group admin access')),
1403 ('group.admin', _('Repository group admin access')),
1404
1404
1405 ('hg.admin', _('RhodeCode Administrator')),
1405 ('hg.admin', _('RhodeCode Administrator')),
1406 ('hg.create.none', _('Repository creation disabled')),
1406 ('hg.create.none', _('Repository creation disabled')),
1407 ('hg.create.repository', _('Repository creation enabled')),
1407 ('hg.create.repository', _('Repository creation enabled')),
1408 ('hg.fork.none', _('Repository forking disabled')),
1408 ('hg.fork.none', _('Repository forking disabled')),
1409 ('hg.fork.repository', _('Repository forking enabled')),
1409 ('hg.fork.repository', _('Repository forking enabled')),
1410 ('hg.register.none', _('Register disabled')),
1410 ('hg.register.none', _('Register disabled')),
1411 ('hg.register.manual_activate', _('Register new user with RhodeCode '
1411 ('hg.register.manual_activate', _('Register new user with RhodeCode '
1412 'with manual activation')),
1412 'with manual activation')),
1413
1413
1414 ('hg.register.auto_activate', _('Register new user with RhodeCode '
1414 ('hg.register.auto_activate', _('Register new user with RhodeCode '
1415 'with auto activation')),
1415 'with auto activation')),
1416 ]
1416 ]
1417
1417
1418 # defines which permissions are more important higher the more important
1418 # defines which permissions are more important higher the more important
1419 PERM_WEIGHTS = {
1419 PERM_WEIGHTS = {
1420 'repository.none': 0,
1420 'repository.none': 0,
1421 'repository.read': 1,
1421 'repository.read': 1,
1422 'repository.write': 3,
1422 'repository.write': 3,
1423 'repository.admin': 4,
1423 'repository.admin': 4,
1424
1424
1425 'group.none': 0,
1425 'group.none': 0,
1426 'group.read': 1,
1426 'group.read': 1,
1427 'group.write': 3,
1427 'group.write': 3,
1428 'group.admin': 4,
1428 'group.admin': 4,
1429
1429
1430 'hg.fork.none': 0,
1430 'hg.fork.none': 0,
1431 'hg.fork.repository': 1,
1431 'hg.fork.repository': 1,
1432 'hg.create.none': 0,
1432 'hg.create.none': 0,
1433 'hg.create.repository':1
1433 'hg.create.repository':1
1434 }
1434 }
1435
1435
1436 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1436 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1437 permission_name = Column("permission_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1437 permission_name = Column("permission_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1438 permission_longname = Column("permission_longname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1438 permission_longname = Column("permission_longname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1439
1439
1440 def __unicode__(self):
1440 def __unicode__(self):
1441 return u"<%s('%s:%s')>" % (
1441 return u"<%s('%s:%s')>" % (
1442 self.__class__.__name__, self.permission_id, self.permission_name
1442 self.__class__.__name__, self.permission_id, self.permission_name
1443 )
1443 )
1444
1444
1445 @classmethod
1445 @classmethod
1446 def get_by_key(cls, key):
1446 def get_by_key(cls, key):
1447 return cls.query().filter(cls.permission_name == key).scalar()
1447 return cls.query().filter(cls.permission_name == key).scalar()
1448
1448
1449 @classmethod
1449 @classmethod
1450 def get_default_perms(cls, default_user_id):
1450 def get_default_perms(cls, default_user_id):
1451 q = Session().query(UserRepoToPerm, Repository, cls)\
1451 q = Session().query(UserRepoToPerm, Repository, cls)\
1452 .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
1452 .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
1453 .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
1453 .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
1454 .filter(UserRepoToPerm.user_id == default_user_id)
1454 .filter(UserRepoToPerm.user_id == default_user_id)
1455
1455
1456 return q.all()
1456 return q.all()
1457
1457
1458 @classmethod
1458 @classmethod
1459 def get_default_group_perms(cls, default_user_id):
1459 def get_default_group_perms(cls, default_user_id):
1460 q = Session().query(UserRepoGroupToPerm, RepoGroup, cls)\
1460 q = Session().query(UserRepoGroupToPerm, RepoGroup, cls)\
1461 .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
1461 .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
1462 .join((cls, UserRepoGroupToPerm.permission_id == cls.permission_id))\
1462 .join((cls, UserRepoGroupToPerm.permission_id == cls.permission_id))\
1463 .filter(UserRepoGroupToPerm.user_id == default_user_id)
1463 .filter(UserRepoGroupToPerm.user_id == default_user_id)
1464
1464
1465 return q.all()
1465 return q.all()
1466
1466
1467
1467
1468 class UserRepoToPerm(Base, BaseModel):
1468 class UserRepoToPerm(Base, BaseModel):
1469 __tablename__ = 'repo_to_perm'
1469 __tablename__ = 'repo_to_perm'
1470 __table_args__ = (
1470 __table_args__ = (
1471 UniqueConstraint('user_id', 'repository_id', 'permission_id'),
1471 UniqueConstraint('user_id', 'repository_id', 'permission_id'),
1472 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1472 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1473 'mysql_charset': 'utf8'}
1473 'mysql_charset': 'utf8'}
1474 )
1474 )
1475 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1475 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1476 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1476 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1477 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1477 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1478 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1478 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1479
1479
1480 user = relationship('User')
1480 user = relationship('User')
1481 repository = relationship('Repository')
1481 repository = relationship('Repository')
1482 permission = relationship('Permission')
1482 permission = relationship('Permission')
1483
1483
1484 @classmethod
1484 @classmethod
1485 def create(cls, user, repository, permission):
1485 def create(cls, user, repository, permission):
1486 n = cls()
1486 n = cls()
1487 n.user = user
1487 n.user = user
1488 n.repository = repository
1488 n.repository = repository
1489 n.permission = permission
1489 n.permission = permission
1490 Session().add(n)
1490 Session().add(n)
1491 return n
1491 return n
1492
1492
1493 def __unicode__(self):
1493 def __unicode__(self):
1494 return u'<user:%s => %s >' % (self.user, self.repository)
1494 return u'<user:%s => %s >' % (self.user, self.repository)
1495
1495
1496
1496
1497 class UserToPerm(Base, BaseModel):
1497 class UserToPerm(Base, BaseModel):
1498 __tablename__ = 'user_to_perm'
1498 __tablename__ = 'user_to_perm'
1499 __table_args__ = (
1499 __table_args__ = (
1500 UniqueConstraint('user_id', 'permission_id'),
1500 UniqueConstraint('user_id', 'permission_id'),
1501 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1501 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1502 'mysql_charset': 'utf8'}
1502 'mysql_charset': 'utf8'}
1503 )
1503 )
1504 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1504 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1505 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1505 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1506 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1506 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1507
1507
1508 user = relationship('User')
1508 user = relationship('User')
1509 permission = relationship('Permission', lazy='joined')
1509 permission = relationship('Permission', lazy='joined')
1510
1510
1511
1511
1512 class UserGroupRepoToPerm(Base, BaseModel):
1512 class UserGroupRepoToPerm(Base, BaseModel):
1513 __tablename__ = 'users_group_repo_to_perm'
1513 __tablename__ = 'users_group_repo_to_perm'
1514 __table_args__ = (
1514 __table_args__ = (
1515 UniqueConstraint('repository_id', 'users_group_id', 'permission_id'),
1515 UniqueConstraint('repository_id', 'users_group_id', 'permission_id'),
1516 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1516 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1517 'mysql_charset': 'utf8'}
1517 'mysql_charset': 'utf8'}
1518 )
1518 )
1519 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1519 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1520 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1520 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1521 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1521 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1522 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1522 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1523
1523
1524 users_group = relationship('UserGroup')
1524 users_group = relationship('UserGroup')
1525 permission = relationship('Permission')
1525 permission = relationship('Permission')
1526 repository = relationship('Repository')
1526 repository = relationship('Repository')
1527
1527
1528 @classmethod
1528 @classmethod
1529 def create(cls, users_group, repository, permission):
1529 def create(cls, users_group, repository, permission):
1530 n = cls()
1530 n = cls()
1531 n.users_group = users_group
1531 n.users_group = users_group
1532 n.repository = repository
1532 n.repository = repository
1533 n.permission = permission
1533 n.permission = permission
1534 Session().add(n)
1534 Session().add(n)
1535 return n
1535 return n
1536
1536
1537 def __unicode__(self):
1537 def __unicode__(self):
1538 return u'<userGroup:%s => %s >' % (self.users_group, self.repository)
1538 return u'<userGroup:%s => %s >' % (self.users_group, self.repository)
1539
1539
1540
1540
1541 class UserGroupToPerm(Base, BaseModel):
1541 class UserGroupToPerm(Base, BaseModel):
1542 __tablename__ = 'users_group_to_perm'
1542 __tablename__ = 'users_group_to_perm'
1543 __table_args__ = (
1543 __table_args__ = (
1544 UniqueConstraint('users_group_id', 'permission_id',),
1544 UniqueConstraint('users_group_id', 'permission_id',),
1545 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1545 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1546 'mysql_charset': 'utf8'}
1546 'mysql_charset': 'utf8'}
1547 )
1547 )
1548 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1548 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1549 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1549 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1550 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1550 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1551
1551
1552 users_group = relationship('UserGroup')
1552 users_group = relationship('UserGroup')
1553 permission = relationship('Permission')
1553 permission = relationship('Permission')
1554
1554
1555
1555
1556 class UserRepoGroupToPerm(Base, BaseModel):
1556 class UserRepoGroupToPerm(Base, BaseModel):
1557 __tablename__ = 'user_repo_group_to_perm'
1557 __tablename__ = 'user_repo_group_to_perm'
1558 __table_args__ = (
1558 __table_args__ = (
1559 UniqueConstraint('user_id', 'group_id', 'permission_id'),
1559 UniqueConstraint('user_id', 'group_id', 'permission_id'),
1560 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1560 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1561 'mysql_charset': 'utf8'}
1561 'mysql_charset': 'utf8'}
1562 )
1562 )
1563
1563
1564 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1564 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1565 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1565 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1566 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1566 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1567 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1567 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1568
1568
1569 user = relationship('User')
1569 user = relationship('User')
1570 group = relationship('RepoGroup')
1570 group = relationship('RepoGroup')
1571 permission = relationship('Permission')
1571 permission = relationship('Permission')
1572
1572
1573
1573
1574 class UserGroupRepoGroupToPerm(Base, BaseModel):
1574 class UserGroupRepoGroupToPerm(Base, BaseModel):
1575 __tablename__ = 'users_group_repo_group_to_perm'
1575 __tablename__ = 'users_group_repo_group_to_perm'
1576 __table_args__ = (
1576 __table_args__ = (
1577 UniqueConstraint('users_group_id', 'group_id'),
1577 UniqueConstraint('users_group_id', 'group_id'),
1578 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1578 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1579 'mysql_charset': 'utf8'}
1579 'mysql_charset': 'utf8'}
1580 )
1580 )
1581
1581
1582 users_group_repo_group_to_perm_id = Column("users_group_repo_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1582 users_group_repo_group_to_perm_id = Column("users_group_repo_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1583 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1583 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1584 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1584 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1585 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1585 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1586
1586
1587 users_group = relationship('UserGroup')
1587 users_group = relationship('UserGroup')
1588 permission = relationship('Permission')
1588 permission = relationship('Permission')
1589 group = relationship('RepoGroup')
1589 group = relationship('RepoGroup')
1590
1590
1591
1591
1592 class Statistics(Base, BaseModel):
1592 class Statistics(Base, BaseModel):
1593 __tablename__ = 'statistics'
1593 __tablename__ = 'statistics'
1594 __table_args__ = (
1594 __table_args__ = (
1595 UniqueConstraint('repository_id'),
1595 UniqueConstraint('repository_id'),
1596 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1596 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1597 'mysql_charset': 'utf8'}
1597 'mysql_charset': 'utf8'}
1598 )
1598 )
1599 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1599 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1600 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
1600 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
1601 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
1601 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
1602 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
1602 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
1603 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
1603 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
1604 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
1604 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
1605
1605
1606 repository = relationship('Repository', single_parent=True)
1606 repository = relationship('Repository', single_parent=True)
1607
1607
1608
1608
1609 class UserFollowing(Base, BaseModel):
1609 class UserFollowing(Base, BaseModel):
1610 __tablename__ = 'user_followings'
1610 __tablename__ = 'user_followings'
1611 __table_args__ = (
1611 __table_args__ = (
1612 UniqueConstraint('user_id', 'follows_repository_id'),
1612 UniqueConstraint('user_id', 'follows_repository_id'),
1613 UniqueConstraint('user_id', 'follows_user_id'),
1613 UniqueConstraint('user_id', 'follows_user_id'),
1614 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1614 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1615 'mysql_charset': 'utf8'}
1615 'mysql_charset': 'utf8'}
1616 )
1616 )
1617
1617
1618 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1618 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1619 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1619 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1620 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
1620 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
1621 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
1621 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
1622 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
1622 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
1623
1623
1624 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
1624 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
1625
1625
1626 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
1626 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
1627 follows_repository = relationship('Repository', order_by='Repository.repo_name')
1627 follows_repository = relationship('Repository', order_by='Repository.repo_name')
1628
1628
1629 @classmethod
1629 @classmethod
1630 def get_repo_followers(cls, repo_id):
1630 def get_repo_followers(cls, repo_id):
1631 return cls.query().filter(cls.follows_repo_id == repo_id)
1631 return cls.query().filter(cls.follows_repo_id == repo_id)
1632
1632
1633
1633
1634 class CacheInvalidation(Base, BaseModel):
1634 class CacheInvalidation(Base, BaseModel):
1635 __tablename__ = 'cache_invalidation'
1635 __tablename__ = 'cache_invalidation'
1636 __table_args__ = (
1636 __table_args__ = (
1637 UniqueConstraint('cache_key'),
1637 UniqueConstraint('cache_key'),
1638 Index('key_idx', 'cache_key'),
1638 Index('key_idx', 'cache_key'),
1639 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1639 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1640 'mysql_charset': 'utf8'},
1640 'mysql_charset': 'utf8'},
1641 )
1641 )
1642 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1642 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1643 cache_key = Column("cache_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1643 cache_key = Column("cache_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1644 cache_args = Column("cache_args", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1644 cache_args = Column("cache_args", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1645 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
1645 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
1646
1646
1647 def __init__(self, cache_key, cache_args=''):
1647 def __init__(self, cache_key, cache_args=''):
1648 self.cache_key = cache_key
1648 self.cache_key = cache_key
1649 self.cache_args = cache_args
1649 self.cache_args = cache_args
1650 self.cache_active = False
1650 self.cache_active = False
1651
1651
1652 def __unicode__(self):
1652 def __unicode__(self):
1653 return u"<%s('%s:%s')>" % (self.__class__.__name__,
1653 return u"<%s('%s:%s')>" % (self.__class__.__name__,
1654 self.cache_id, self.cache_key)
1654 self.cache_id, self.cache_key)
1655
1655
1656 @property
1656 @property
1657 def prefix(self):
1657 def prefix(self):
1658 _split = self.cache_key.split(self.cache_args, 1)
1658 _split = self.cache_key.split(self.cache_args, 1)
1659 if _split and len(_split) == 2:
1659 if _split and len(_split) == 2:
1660 return _split[0]
1660 return _split[0]
1661 return ''
1661 return ''
1662
1662
1663 @classmethod
1663 @classmethod
1664 def clear_cache(cls):
1664 def clear_cache(cls):
1665 cls.query().delete()
1665 cls.query().delete()
1666
1666
1667 @classmethod
1667 @classmethod
1668 def _get_key(cls, key):
1668 def _get_key(cls, key):
1669 """
1669 """
1670 Wrapper for generating a key, together with a prefix
1670 Wrapper for generating a key, together with a prefix
1671
1671
1672 :param key:
1672 :param key:
1673 """
1673 """
1674 import rhodecode
1674 import rhodecode
1675 prefix = ''
1675 prefix = ''
1676 org_key = key
1676 org_key = key
1677 iid = rhodecode.CONFIG.get('instance_id')
1677 iid = rhodecode.CONFIG.get('instance_id')
1678 if iid:
1678 if iid:
1679 prefix = iid
1679 prefix = iid
1680
1680
1681 return "%s%s" % (prefix, key), prefix, org_key
1681 return "%s%s" % (prefix, key), prefix, org_key
1682
1682
1683 @classmethod
1683 @classmethod
1684 def get_by_key(cls, key):
1684 def get_by_key(cls, key):
1685 return cls.query().filter(cls.cache_key == key).scalar()
1685 return cls.query().filter(cls.cache_key == key).scalar()
1686
1686
1687 @classmethod
1687 @classmethod
1688 def get_by_repo_name(cls, repo_name):
1688 def get_by_repo_name(cls, repo_name):
1689 return cls.query().filter(cls.cache_args == repo_name).all()
1689 return cls.query().filter(cls.cache_args == repo_name).all()
1690
1690
1691 @classmethod
1691 @classmethod
1692 def _get_or_create_key(cls, key, repo_name, commit=True):
1692 def _get_or_create_key(cls, key, repo_name, commit=True):
1693 inv_obj = Session().query(cls).filter(cls.cache_key == key).scalar()
1693 inv_obj = Session().query(cls).filter(cls.cache_key == key).scalar()
1694 if not inv_obj:
1694 if not inv_obj:
1695 try:
1695 try:
1696 inv_obj = CacheInvalidation(key, repo_name)
1696 inv_obj = CacheInvalidation(key, repo_name)
1697 Session().add(inv_obj)
1697 Session().add(inv_obj)
1698 if commit:
1698 if commit:
1699 Session().commit()
1699 Session().commit()
1700 except Exception:
1700 except Exception:
1701 log.error(traceback.format_exc())
1701 log.error(traceback.format_exc())
1702 Session().rollback()
1702 Session().rollback()
1703 return inv_obj
1703 return inv_obj
1704
1704
1705 @classmethod
1705 @classmethod
1706 def invalidate(cls, key):
1706 def invalidate(cls, key):
1707 """
1707 """
1708 Returns Invalidation object if this given key should be invalidated
1708 Returns Invalidation object if this given key should be invalidated
1709 None otherwise. `cache_active = False` means that this cache
1709 None otherwise. `cache_active = False` means that this cache
1710 state is not valid and needs to be invalidated
1710 state is not valid and needs to be invalidated
1711
1711
1712 :param key:
1712 :param key:
1713 """
1713 """
1714 repo_name = key
1714 repo_name = key
1715 repo_name = remove_suffix(repo_name, '_README')
1715 repo_name = remove_suffix(repo_name, '_README')
1716 repo_name = remove_suffix(repo_name, '_RSS')
1716 repo_name = remove_suffix(repo_name, '_RSS')
1717 repo_name = remove_suffix(repo_name, '_ATOM')
1717 repo_name = remove_suffix(repo_name, '_ATOM')
1718
1718
1719 # adds instance prefix
1719 # adds instance prefix
1720 key, _prefix, _org_key = cls._get_key(key)
1720 key, _prefix, _org_key = cls._get_key(key)
1721 inv = cls._get_or_create_key(key, repo_name)
1721 inv = cls._get_or_create_key(key, repo_name)
1722
1722
1723 if inv and inv.cache_active is False:
1723 if inv and inv.cache_active is False:
1724 return inv
1724 return inv
1725
1725
1726 @classmethod
1726 @classmethod
1727 def set_invalidate(cls, key=None, repo_name=None):
1727 def set_invalidate(cls, key=None, repo_name=None):
1728 """
1728 """
1729 Mark this Cache key for invalidation, either by key or whole
1729 Mark this Cache key for invalidation, either by key or whole
1730 cache sets based on repo_name
1730 cache sets based on repo_name
1731
1731
1732 :param key:
1732 :param key:
1733 """
1733 """
1734 invalidated_keys = []
1734 invalidated_keys = []
1735 if key:
1735 if key:
1736 key, _prefix, _org_key = cls._get_key(key)
1736 key, _prefix, _org_key = cls._get_key(key)
1737 inv_objs = Session().query(cls).filter(cls.cache_key == key).all()
1737 inv_objs = Session().query(cls).filter(cls.cache_key == key).all()
1738 elif repo_name:
1738 elif repo_name:
1739 inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
1739 inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
1740
1740
1741 try:
1741 try:
1742 for inv_obj in inv_objs:
1742 for inv_obj in inv_objs:
1743 inv_obj.cache_active = False
1743 inv_obj.cache_active = False
1744 log.debug('marking %s key for invalidation based on key=%s,repo_name=%s'
1744 log.debug('marking %s key for invalidation based on key=%s,repo_name=%s'
1745 % (inv_obj, key, repo_name))
1745 % (inv_obj, key, repo_name))
1746 invalidated_keys.append(inv_obj.cache_key)
1746 invalidated_keys.append(inv_obj.cache_key)
1747 Session().add(inv_obj)
1747 Session().add(inv_obj)
1748 Session().commit()
1748 Session().commit()
1749 except Exception:
1749 except Exception:
1750 log.error(traceback.format_exc())
1750 log.error(traceback.format_exc())
1751 Session().rollback()
1751 Session().rollback()
1752 return invalidated_keys
1752 return invalidated_keys
1753
1753
1754 @classmethod
1754 @classmethod
1755 def set_valid(cls, key):
1755 def set_valid(cls, key):
1756 """
1756 """
1757 Mark this cache key as active and currently cached
1757 Mark this cache key as active and currently cached
1758
1758
1759 :param key:
1759 :param key:
1760 """
1760 """
1761 inv_obj = cls.get_by_key(key)
1761 inv_obj = cls.get_by_key(key)
1762 inv_obj.cache_active = True
1762 inv_obj.cache_active = True
1763 Session().add(inv_obj)
1763 Session().add(inv_obj)
1764 Session().commit()
1764 Session().commit()
1765
1765
1766 @classmethod
1766 @classmethod
1767 def get_cache_map(cls):
1767 def get_cache_map(cls):
1768
1768
1769 class cachemapdict(dict):
1769 class cachemapdict(dict):
1770
1770
1771 def __init__(self, *args, **kwargs):
1771 def __init__(self, *args, **kwargs):
1772 fixkey = kwargs.get('fixkey')
1772 fixkey = kwargs.get('fixkey')
1773 if fixkey:
1773 if fixkey:
1774 del kwargs['fixkey']
1774 del kwargs['fixkey']
1775 self.fixkey = fixkey
1775 self.fixkey = fixkey
1776 super(cachemapdict, self).__init__(*args, **kwargs)
1776 super(cachemapdict, self).__init__(*args, **kwargs)
1777
1777
1778 def __getattr__(self, name):
1778 def __getattr__(self, name):
1779 key = name
1779 key = name
1780 if self.fixkey:
1780 if self.fixkey:
1781 key, _prefix, _org_key = cls._get_key(key)
1781 key, _prefix, _org_key = cls._get_key(key)
1782 if key in self.__dict__:
1782 if key in self.__dict__:
1783 return self.__dict__[key]
1783 return self.__dict__[key]
1784 else:
1784 else:
1785 return self[key]
1785 return self[key]
1786
1786
1787 def __getitem__(self, key):
1787 def __getitem__(self, key):
1788 if self.fixkey:
1788 if self.fixkey:
1789 key, _prefix, _org_key = cls._get_key(key)
1789 key, _prefix, _org_key = cls._get_key(key)
1790 try:
1790 try:
1791 return super(cachemapdict, self).__getitem__(key)
1791 return super(cachemapdict, self).__getitem__(key)
1792 except KeyError:
1792 except KeyError:
1793 return
1793 return
1794
1794
1795 cache_map = cachemapdict(fixkey=True)
1795 cache_map = cachemapdict(fixkey=True)
1796 for obj in cls.query().all():
1796 for obj in cls.query().all():
1797 cache_map[obj.cache_key] = cachemapdict(obj.get_dict())
1797 cache_map[obj.cache_key] = cachemapdict(obj.get_dict())
1798 return cache_map
1798 return cache_map
1799
1799
1800
1800
1801 class ChangesetComment(Base, BaseModel):
1801 class ChangesetComment(Base, BaseModel):
1802 __tablename__ = 'changeset_comments'
1802 __tablename__ = 'changeset_comments'
1803 __table_args__ = (
1803 __table_args__ = (
1804 Index('cc_revision_idx', 'revision'),
1804 Index('cc_revision_idx', 'revision'),
1805 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1805 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1806 'mysql_charset': 'utf8'},
1806 'mysql_charset': 'utf8'},
1807 )
1807 )
1808 comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True)
1808 comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True)
1809 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1809 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1810 revision = Column('revision', String(40), nullable=True)
1810 revision = Column('revision', String(40), nullable=True)
1811 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1811 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1812 line_no = Column('line_no', Unicode(10), nullable=True)
1812 line_no = Column('line_no', Unicode(10), nullable=True)
1813 hl_lines = Column('hl_lines', Unicode(512), nullable=True)
1813 hl_lines = Column('hl_lines', Unicode(512), nullable=True)
1814 f_path = Column('f_path', Unicode(1000), nullable=True)
1814 f_path = Column('f_path', Unicode(1000), nullable=True)
1815 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False)
1815 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False)
1816 text = Column('text', UnicodeText(25000), nullable=False)
1816 text = Column('text', UnicodeText(25000), nullable=False)
1817 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1817 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1818 modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1818 modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1819
1819
1820 author = relationship('User', lazy='joined')
1820 author = relationship('User', lazy='joined')
1821 repo = relationship('Repository')
1821 repo = relationship('Repository')
1822 status_change = relationship('ChangesetStatus', cascade="all, delete, delete-orphan")
1822 status_change = relationship('ChangesetStatus', cascade="all, delete, delete-orphan")
1823 pull_request = relationship('PullRequest', lazy='joined')
1823 pull_request = relationship('PullRequest', lazy='joined')
1824
1824
1825 @classmethod
1825 @classmethod
1826 def get_users(cls, revision=None, pull_request_id=None):
1826 def get_users(cls, revision=None, pull_request_id=None):
1827 """
1827 """
1828 Returns user associated with this ChangesetComment. ie those
1828 Returns user associated with this ChangesetComment. ie those
1829 who actually commented
1829 who actually commented
1830
1830
1831 :param cls:
1831 :param cls:
1832 :param revision:
1832 :param revision:
1833 """
1833 """
1834 q = Session().query(User)\
1834 q = Session().query(User)\
1835 .join(ChangesetComment.author)
1835 .join(ChangesetComment.author)
1836 if revision:
1836 if revision:
1837 q = q.filter(cls.revision == revision)
1837 q = q.filter(cls.revision == revision)
1838 elif pull_request_id:
1838 elif pull_request_id:
1839 q = q.filter(cls.pull_request_id == pull_request_id)
1839 q = q.filter(cls.pull_request_id == pull_request_id)
1840 return q.all()
1840 return q.all()
1841
1841
1842
1842
1843 class ChangesetStatus(Base, BaseModel):
1843 class ChangesetStatus(Base, BaseModel):
1844 __tablename__ = 'changeset_statuses'
1844 __tablename__ = 'changeset_statuses'
1845 __table_args__ = (
1845 __table_args__ = (
1846 Index('cs_revision_idx', 'revision'),
1846 Index('cs_revision_idx', 'revision'),
1847 Index('cs_version_idx', 'version'),
1847 Index('cs_version_idx', 'version'),
1848 UniqueConstraint('repo_id', 'revision', 'version'),
1848 UniqueConstraint('repo_id', 'revision', 'version'),
1849 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1849 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1850 'mysql_charset': 'utf8'}
1850 'mysql_charset': 'utf8'}
1851 )
1851 )
1852 STATUS_NOT_REVIEWED = DEFAULT = 'not_reviewed'
1852 STATUS_NOT_REVIEWED = DEFAULT = 'not_reviewed'
1853 STATUS_APPROVED = 'approved'
1853 STATUS_APPROVED = 'approved'
1854 STATUS_REJECTED = 'rejected'
1854 STATUS_REJECTED = 'rejected'
1855 STATUS_UNDER_REVIEW = 'under_review'
1855 STATUS_UNDER_REVIEW = 'under_review'
1856
1856
1857 STATUSES = [
1857 STATUSES = [
1858 (STATUS_NOT_REVIEWED, _("Not Reviewed")), # (no icon) and default
1858 (STATUS_NOT_REVIEWED, _("Not Reviewed")), # (no icon) and default
1859 (STATUS_APPROVED, _("Approved")),
1859 (STATUS_APPROVED, _("Approved")),
1860 (STATUS_REJECTED, _("Rejected")),
1860 (STATUS_REJECTED, _("Rejected")),
1861 (STATUS_UNDER_REVIEW, _("Under Review")),
1861 (STATUS_UNDER_REVIEW, _("Under Review")),
1862 ]
1862 ]
1863
1863
1864 changeset_status_id = Column('changeset_status_id', Integer(), nullable=False, primary_key=True)
1864 changeset_status_id = Column('changeset_status_id', Integer(), nullable=False, primary_key=True)
1865 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1865 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1866 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1866 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1867 revision = Column('revision', String(40), nullable=False)
1867 revision = Column('revision', String(40), nullable=False)
1868 status = Column('status', String(128), nullable=False, default=DEFAULT)
1868 status = Column('status', String(128), nullable=False, default=DEFAULT)
1869 changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
1869 changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
1870 modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
1870 modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
1871 version = Column('version', Integer(), nullable=False, default=0)
1871 version = Column('version', Integer(), nullable=False, default=0)
1872 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1872 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1873
1873
1874 author = relationship('User', lazy='joined')
1874 author = relationship('User', lazy='joined')
1875 repo = relationship('Repository')
1875 repo = relationship('Repository')
1876 comment = relationship('ChangesetComment', lazy='joined')
1876 comment = relationship('ChangesetComment', lazy='joined')
1877 pull_request = relationship('PullRequest', lazy='joined')
1877 pull_request = relationship('PullRequest', lazy='joined')
1878
1878
1879 def __unicode__(self):
1879 def __unicode__(self):
1880 return u"<%s('%s:%s')>" % (
1880 return u"<%s('%s:%s')>" % (
1881 self.__class__.__name__,
1881 self.__class__.__name__,
1882 self.status, self.author
1882 self.status, self.author
1883 )
1883 )
1884
1884
1885 @classmethod
1885 @classmethod
1886 def get_status_lbl(cls, value):
1886 def get_status_lbl(cls, value):
1887 return dict(cls.STATUSES).get(value)
1887 return dict(cls.STATUSES).get(value)
1888
1888
1889 @property
1889 @property
1890 def status_lbl(self):
1890 def status_lbl(self):
1891 return ChangesetStatus.get_status_lbl(self.status)
1891 return ChangesetStatus.get_status_lbl(self.status)
1892
1892
1893
1893
1894 class PullRequest(Base, BaseModel):
1894 class PullRequest(Base, BaseModel):
1895 __tablename__ = 'pull_requests'
1895 __tablename__ = 'pull_requests'
1896 __table_args__ = (
1896 __table_args__ = (
1897 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1897 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1898 'mysql_charset': 'utf8'},
1898 'mysql_charset': 'utf8'},
1899 )
1899 )
1900
1900
1901 STATUS_NEW = u'new'
1901 STATUS_NEW = u'new'
1902 STATUS_OPEN = u'open'
1902 STATUS_OPEN = u'open'
1903 STATUS_CLOSED = u'closed'
1903 STATUS_CLOSED = u'closed'
1904
1904
1905 pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True)
1905 pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True)
1906 title = Column('title', Unicode(256), nullable=True)
1906 title = Column('title', Unicode(256), nullable=True)
1907 description = Column('description', UnicodeText(10240), nullable=True)
1907 description = Column('description', UnicodeText(10240), nullable=True)
1908 status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW)
1908 status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW)
1909 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1909 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1910 updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1910 updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1911 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1911 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1912 _revisions = Column('revisions', UnicodeText(20500)) # 500 revisions max
1912 _revisions = Column('revisions', UnicodeText(20500)) # 500 revisions max
1913 org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1913 org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1914 org_ref = Column('org_ref', Unicode(256), nullable=False)
1914 org_ref = Column('org_ref', Unicode(256), nullable=False)
1915 other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1915 other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1916 other_ref = Column('other_ref', Unicode(256), nullable=False)
1916 other_ref = Column('other_ref', Unicode(256), nullable=False)
1917
1917
1918 @hybrid_property
1918 @hybrid_property
1919 def revisions(self):
1919 def revisions(self):
1920 return self._revisions.split(':')
1920 return self._revisions.split(':')
1921
1921
1922 @revisions.setter
1922 @revisions.setter
1923 def revisions(self, val):
1923 def revisions(self, val):
1924 self._revisions = ':'.join(val)
1924 self._revisions = ':'.join(val)
1925
1925
1926 @property
1926 @property
1927 def org_ref_parts(self):
1927 def org_ref_parts(self):
1928 return self.org_ref.split(':')
1928 return self.org_ref.split(':')
1929
1929
1930 @property
1930 @property
1931 def other_ref_parts(self):
1931 def other_ref_parts(self):
1932 return self.other_ref.split(':')
1932 return self.other_ref.split(':')
1933
1933
1934 author = relationship('User', lazy='joined')
1934 author = relationship('User', lazy='joined')
1935 reviewers = relationship('PullRequestReviewers',
1935 reviewers = relationship('PullRequestReviewers',
1936 cascade="all, delete, delete-orphan")
1936 cascade="all, delete, delete-orphan")
1937 org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
1937 org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
1938 other_repo = relationship('Repository', primaryjoin='PullRequest.other_repo_id==Repository.repo_id')
1938 other_repo = relationship('Repository', primaryjoin='PullRequest.other_repo_id==Repository.repo_id')
1939 statuses = relationship('ChangesetStatus')
1939 statuses = relationship('ChangesetStatus')
1940 comments = relationship('ChangesetComment',
1940 comments = relationship('ChangesetComment',
1941 cascade="all, delete, delete-orphan")
1941 cascade="all, delete, delete-orphan")
1942
1942
1943 def is_closed(self):
1943 def is_closed(self):
1944 return self.status == self.STATUS_CLOSED
1944 return self.status == self.STATUS_CLOSED
1945
1945
1946 @property
1946 @property
1947 def last_review_status(self):
1947 def last_review_status(self):
1948 return self.statuses[-1].status if self.statuses else ''
1948 return self.statuses[-1].status if self.statuses else ''
1949
1949
1950 def __json__(self):
1950 def __json__(self):
1951 return dict(
1951 return dict(
1952 revisions=self.revisions
1952 revisions=self.revisions
1953 )
1953 )
1954
1954
1955
1955
1956 class PullRequestReviewers(Base, BaseModel):
1956 class PullRequestReviewers(Base, BaseModel):
1957 __tablename__ = 'pull_request_reviewers'
1957 __tablename__ = 'pull_request_reviewers'
1958 __table_args__ = (
1958 __table_args__ = (
1959 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1959 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1960 'mysql_charset': 'utf8'},
1960 'mysql_charset': 'utf8'},
1961 )
1961 )
1962
1962
1963 def __init__(self, user=None, pull_request=None):
1963 def __init__(self, user=None, pull_request=None):
1964 self.user = user
1964 self.user = user
1965 self.pull_request = pull_request
1965 self.pull_request = pull_request
1966
1966
1967 pull_requests_reviewers_id = Column('pull_requests_reviewers_id', Integer(), nullable=False, primary_key=True)
1967 pull_requests_reviewers_id = Column('pull_requests_reviewers_id', Integer(), nullable=False, primary_key=True)
1968 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
1968 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
1969 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True)
1969 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True)
1970
1970
1971 user = relationship('User')
1971 user = relationship('User')
1972 pull_request = relationship('PullRequest')
1972 pull_request = relationship('PullRequest')
1973
1973
1974
1974
1975 class Notification(Base, BaseModel):
1975 class Notification(Base, BaseModel):
1976 __tablename__ = 'notifications'
1976 __tablename__ = 'notifications'
1977 __table_args__ = (
1977 __table_args__ = (
1978 Index('notification_type_idx', 'type'),
1978 Index('notification_type_idx', 'type'),
1979 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1979 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1980 'mysql_charset': 'utf8'},
1980 'mysql_charset': 'utf8'},
1981 )
1981 )
1982
1982
1983 TYPE_CHANGESET_COMMENT = u'cs_comment'
1983 TYPE_CHANGESET_COMMENT = u'cs_comment'
1984 TYPE_MESSAGE = u'message'
1984 TYPE_MESSAGE = u'message'
1985 TYPE_MENTION = u'mention'
1985 TYPE_MENTION = u'mention'
1986 TYPE_REGISTRATION = u'registration'
1986 TYPE_REGISTRATION = u'registration'
1987 TYPE_PULL_REQUEST = u'pull_request'
1987 TYPE_PULL_REQUEST = u'pull_request'
1988 TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment'
1988 TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment'
1989
1989
1990 notification_id = Column('notification_id', Integer(), nullable=False, primary_key=True)
1990 notification_id = Column('notification_id', Integer(), nullable=False, primary_key=True)
1991 subject = Column('subject', Unicode(512), nullable=True)
1991 subject = Column('subject', Unicode(512), nullable=True)
1992 body = Column('body', UnicodeText(50000), nullable=True)
1992 body = Column('body', UnicodeText(50000), nullable=True)
1993 created_by = Column("created_by", Integer(), ForeignKey('users.user_id'), nullable=True)
1993 created_by = Column("created_by", Integer(), ForeignKey('users.user_id'), nullable=True)
1994 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1994 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1995 type_ = Column('type', Unicode(256))
1995 type_ = Column('type', Unicode(256))
1996
1996
1997 created_by_user = relationship('User')
1997 created_by_user = relationship('User')
1998 notifications_to_users = relationship('UserNotification', lazy='joined',
1998 notifications_to_users = relationship('UserNotification', lazy='joined',
1999 cascade="all, delete, delete-orphan")
1999 cascade="all, delete, delete-orphan")
2000
2000
2001 @property
2001 @property
2002 def recipients(self):
2002 def recipients(self):
2003 return [x.user for x in UserNotification.query()\
2003 return [x.user for x in UserNotification.query()\
2004 .filter(UserNotification.notification == self)\
2004 .filter(UserNotification.notification == self)\
2005 .order_by(UserNotification.user_id.asc()).all()]
2005 .order_by(UserNotification.user_id.asc()).all()]
2006
2006
2007 @classmethod
2007 @classmethod
2008 def create(cls, created_by, subject, body, recipients, type_=None):
2008 def create(cls, created_by, subject, body, recipients, type_=None):
2009 if type_ is None:
2009 if type_ is None:
2010 type_ = Notification.TYPE_MESSAGE
2010 type_ = Notification.TYPE_MESSAGE
2011
2011
2012 notification = cls()
2012 notification = cls()
2013 notification.created_by_user = created_by
2013 notification.created_by_user = created_by
2014 notification.subject = subject
2014 notification.subject = subject
2015 notification.body = body
2015 notification.body = body
2016 notification.type_ = type_
2016 notification.type_ = type_
2017 notification.created_on = datetime.datetime.now()
2017 notification.created_on = datetime.datetime.now()
2018
2018
2019 for u in recipients:
2019 for u in recipients:
2020 assoc = UserNotification()
2020 assoc = UserNotification()
2021 assoc.notification = notification
2021 assoc.notification = notification
2022 u.notifications.append(assoc)
2022 u.notifications.append(assoc)
2023 Session().add(notification)
2023 Session().add(notification)
2024 return notification
2024 return notification
2025
2025
2026 @property
2026 @property
2027 def description(self):
2027 def description(self):
2028 from rhodecode.model.notification import NotificationModel
2028 from rhodecode.model.notification import NotificationModel
2029 return NotificationModel().make_description(self)
2029 return NotificationModel().make_description(self)
2030
2030
2031
2031
2032 class UserNotification(Base, BaseModel):
2032 class UserNotification(Base, BaseModel):
2033 __tablename__ = 'user_to_notification'
2033 __tablename__ = 'user_to_notification'
2034 __table_args__ = (
2034 __table_args__ = (
2035 UniqueConstraint('user_id', 'notification_id'),
2035 UniqueConstraint('user_id', 'notification_id'),
2036 {'extend_existing': True, 'mysql_engine': 'InnoDB',
2036 {'extend_existing': True, 'mysql_engine': 'InnoDB',
2037 'mysql_charset': 'utf8'}
2037 'mysql_charset': 'utf8'}
2038 )
2038 )
2039 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), primary_key=True)
2039 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), primary_key=True)
2040 notification_id = Column("notification_id", Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
2040 notification_id = Column("notification_id", Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
2041 read = Column('read', Boolean, default=False)
2041 read = Column('read', Boolean, default=False)
2042 sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
2042 sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
2043
2043
2044 user = relationship('User', lazy="joined")
2044 user = relationship('User', lazy="joined")
2045 notification = relationship('Notification', lazy="joined",
2045 notification = relationship('Notification', lazy="joined",
2046 order_by=lambda: Notification.created_on.desc(),)
2046 order_by=lambda: Notification.created_on.desc(),)
2047
2047
2048 def mark_as_read(self):
2048 def mark_as_read(self):
2049 self.read = True
2049 self.read = True
2050 Session().add(self)
2050 Session().add(self)
2051
2051
2052
2052
2053 class DbMigrateVersion(Base, BaseModel):
2053 class DbMigrateVersion(Base, BaseModel):
2054 __tablename__ = 'db_migrate_version'
2054 __tablename__ = 'db_migrate_version'
2055 __table_args__ = (
2055 __table_args__ = (
2056 {'extend_existing': True, 'mysql_engine': 'InnoDB',
2056 {'extend_existing': True, 'mysql_engine': 'InnoDB',
2057 'mysql_charset': 'utf8'},
2057 'mysql_charset': 'utf8'},
2058 )
2058 )
2059 repository_id = Column('repository_id', String(250), primary_key=True)
2059 repository_id = Column('repository_id', String(250), primary_key=True)
2060 repository_path = Column('repository_path', Text)
2060 repository_path = Column('repository_path', Text)
2061 version = Column('version', Integer)
2061 version = Column('version', Integer)
@@ -1,4811 +1,4811 b''
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
2 border: 0;
2 border: 0;
3 outline: 0;
3 outline: 0;
4 font-size: 100%;
4 font-size: 100%;
5 vertical-align: baseline;
5 vertical-align: baseline;
6 background: transparent;
6 background: transparent;
7 margin: 0;
7 margin: 0;
8 padding: 0;
8 padding: 0;
9 }
9 }
10
10
11 body {
11 body {
12 line-height: 1;
12 line-height: 1;
13 height: 100%;
13 height: 100%;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 color: #000;
17 color: #000;
18 margin: 0;
18 margin: 0;
19 padding: 0;
19 padding: 0;
20 font-size: 12px;
20 font-size: 12px;
21 }
21 }
22
22
23 ol, ul {
23 ol, ul {
24 list-style: none;
24 list-style: none;
25 }
25 }
26
26
27 blockquote, q {
27 blockquote, q {
28 quotes: none;
28 quotes: none;
29 }
29 }
30
30
31 blockquote:before, blockquote:after, q:before, q:after {
31 blockquote:before, blockquote:after, q:before, q:after {
32 content: none;
32 content: none;
33 }
33 }
34
34
35 :focus {
35 :focus {
36 outline: 0;
36 outline: 0;
37 }
37 }
38
38
39 del {
39 del {
40 text-decoration: line-through;
40 text-decoration: line-through;
41 }
41 }
42
42
43 table {
43 table {
44 border-collapse: collapse;
44 border-collapse: collapse;
45 border-spacing: 0;
45 border-spacing: 0;
46 }
46 }
47
47
48 html {
48 html {
49 height: 100%;
49 height: 100%;
50 }
50 }
51
51
52 a {
52 a {
53 color: #003367;
53 color: #003367;
54 text-decoration: none;
54 text-decoration: none;
55 cursor: pointer;
55 cursor: pointer;
56 }
56 }
57
57
58 a:hover {
58 a:hover {
59 color: #316293;
59 color: #316293;
60 text-decoration: underline;
60 text-decoration: underline;
61 }
61 }
62
62
63 h1, h2, h3, h4, h5, h6,
63 h1, h2, h3, h4, h5, h6,
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
65 color: #292929;
65 color: #292929;
66 font-weight: 700;
66 font-weight: 700;
67 }
67 }
68
68
69 h1, div.h1 {
69 h1, div.h1 {
70 font-size: 22px;
70 font-size: 22px;
71 }
71 }
72
72
73 h2, div.h2 {
73 h2, div.h2 {
74 font-size: 20px;
74 font-size: 20px;
75 }
75 }
76
76
77 h3, div.h3 {
77 h3, div.h3 {
78 font-size: 18px;
78 font-size: 18px;
79 }
79 }
80
80
81 h4, div.h4 {
81 h4, div.h4 {
82 font-size: 16px;
82 font-size: 16px;
83 }
83 }
84
84
85 h5, div.h5 {
85 h5, div.h5 {
86 font-size: 14px;
86 font-size: 14px;
87 }
87 }
88
88
89 h6, div.h6 {
89 h6, div.h6 {
90 font-size: 11px;
90 font-size: 11px;
91 }
91 }
92
92
93 ul.circle {
93 ul.circle {
94 list-style-type: circle;
94 list-style-type: circle;
95 }
95 }
96
96
97 ul.disc {
97 ul.disc {
98 list-style-type: disc;
98 list-style-type: disc;
99 }
99 }
100
100
101 ul.square {
101 ul.square {
102 list-style-type: square;
102 list-style-type: square;
103 }
103 }
104
104
105 ol.lower-roman {
105 ol.lower-roman {
106 list-style-type: lower-roman;
106 list-style-type: lower-roman;
107 }
107 }
108
108
109 ol.upper-roman {
109 ol.upper-roman {
110 list-style-type: upper-roman;
110 list-style-type: upper-roman;
111 }
111 }
112
112
113 ol.lower-alpha {
113 ol.lower-alpha {
114 list-style-type: lower-alpha;
114 list-style-type: lower-alpha;
115 }
115 }
116
116
117 ol.upper-alpha {
117 ol.upper-alpha {
118 list-style-type: upper-alpha;
118 list-style-type: upper-alpha;
119 }
119 }
120
120
121 ol.decimal {
121 ol.decimal {
122 list-style-type: decimal;
122 list-style-type: decimal;
123 }
123 }
124
124
125 div.color {
125 div.color {
126 clear: both;
126 clear: both;
127 overflow: hidden;
127 overflow: hidden;
128 position: absolute;
128 position: absolute;
129 background: #FFF;
129 background: #FFF;
130 margin: 7px 0 0 60px;
130 margin: 7px 0 0 60px;
131 padding: 1px 1px 1px 0;
131 padding: 1px 1px 1px 0;
132 }
132 }
133
133
134 div.color a {
134 div.color a {
135 width: 15px;
135 width: 15px;
136 height: 15px;
136 height: 15px;
137 display: block;
137 display: block;
138 float: left;
138 float: left;
139 margin: 0 0 0 1px;
139 margin: 0 0 0 1px;
140 padding: 0;
140 padding: 0;
141 }
141 }
142
142
143 div.options {
143 div.options {
144 clear: both;
144 clear: both;
145 overflow: hidden;
145 overflow: hidden;
146 position: absolute;
146 position: absolute;
147 background: #FFF;
147 background: #FFF;
148 margin: 7px 0 0 162px;
148 margin: 7px 0 0 162px;
149 padding: 0;
149 padding: 0;
150 }
150 }
151
151
152 div.options a {
152 div.options a {
153 height: 1%;
153 height: 1%;
154 display: block;
154 display: block;
155 text-decoration: none;
155 text-decoration: none;
156 margin: 0;
156 margin: 0;
157 padding: 3px 8px;
157 padding: 3px 8px;
158 }
158 }
159
159
160 .top-left-rounded-corner {
160 .top-left-rounded-corner {
161 -webkit-border-top-left-radius: 8px;
161 -webkit-border-top-left-radius: 8px;
162 -khtml-border-radius-topleft: 8px;
162 -khtml-border-radius-topleft: 8px;
163 border-top-left-radius: 8px;
163 border-top-left-radius: 8px;
164 }
164 }
165
165
166 .top-right-rounded-corner {
166 .top-right-rounded-corner {
167 -webkit-border-top-right-radius: 8px;
167 -webkit-border-top-right-radius: 8px;
168 -khtml-border-radius-topright: 8px;
168 -khtml-border-radius-topright: 8px;
169 border-top-right-radius: 8px;
169 border-top-right-radius: 8px;
170 }
170 }
171
171
172 .bottom-left-rounded-corner {
172 .bottom-left-rounded-corner {
173 -webkit-border-bottom-left-radius: 8px;
173 -webkit-border-bottom-left-radius: 8px;
174 -khtml-border-radius-bottomleft: 8px;
174 -khtml-border-radius-bottomleft: 8px;
175 border-bottom-left-radius: 8px;
175 border-bottom-left-radius: 8px;
176 }
176 }
177
177
178 .bottom-right-rounded-corner {
178 .bottom-right-rounded-corner {
179 -webkit-border-bottom-right-radius: 8px;
179 -webkit-border-bottom-right-radius: 8px;
180 -khtml-border-radius-bottomright: 8px;
180 -khtml-border-radius-bottomright: 8px;
181 border-bottom-right-radius: 8px;
181 border-bottom-right-radius: 8px;
182 }
182 }
183
183
184 .top-left-rounded-corner-mid {
184 .top-left-rounded-corner-mid {
185 -webkit-border-top-left-radius: 4px;
185 -webkit-border-top-left-radius: 4px;
186 -khtml-border-radius-topleft: 4px;
186 -khtml-border-radius-topleft: 4px;
187 border-top-left-radius: 4px;
187 border-top-left-radius: 4px;
188 }
188 }
189
189
190 .top-right-rounded-corner-mid {
190 .top-right-rounded-corner-mid {
191 -webkit-border-top-right-radius: 4px;
191 -webkit-border-top-right-radius: 4px;
192 -khtml-border-radius-topright: 4px;
192 -khtml-border-radius-topright: 4px;
193 border-top-right-radius: 4px;
193 border-top-right-radius: 4px;
194 }
194 }
195
195
196 .bottom-left-rounded-corner-mid {
196 .bottom-left-rounded-corner-mid {
197 -webkit-border-bottom-left-radius: 4px;
197 -webkit-border-bottom-left-radius: 4px;
198 -khtml-border-radius-bottomleft: 4px;
198 -khtml-border-radius-bottomleft: 4px;
199 border-bottom-left-radius: 4px;
199 border-bottom-left-radius: 4px;
200 }
200 }
201
201
202 .bottom-right-rounded-corner-mid {
202 .bottom-right-rounded-corner-mid {
203 -webkit-border-bottom-right-radius: 4px;
203 -webkit-border-bottom-right-radius: 4px;
204 -khtml-border-radius-bottomright: 4px;
204 -khtml-border-radius-bottomright: 4px;
205 border-bottom-right-radius: 4px;
205 border-bottom-right-radius: 4px;
206 }
206 }
207
207
208 .help-block {
208 .help-block {
209 color: #999999;
209 color: #999999;
210 display: block;
210 display: block;
211 margin-bottom: 0;
211 margin-bottom: 0;
212 margin-top: 5px;
212 margin-top: 5px;
213 }
213 }
214
214
215 .empty_data {
215 .empty_data {
216 color: #B9B9B9;
216 color: #B9B9B9;
217 }
217 }
218
218
219 a.permalink {
219 a.permalink {
220 visibility: hidden;
220 visibility: hidden;
221 }
221 }
222
222
223 a.permalink:hover {
223 a.permalink:hover {
224 text-decoration: none;
224 text-decoration: none;
225 }
225 }
226
226
227 h1:hover > a.permalink,
227 h1:hover > a.permalink,
228 h2:hover > a.permalink,
228 h2:hover > a.permalink,
229 h3:hover > a.permalink,
229 h3:hover > a.permalink,
230 h4:hover > a.permalink,
230 h4:hover > a.permalink,
231 h5:hover > a.permalink,
231 h5:hover > a.permalink,
232 h6:hover > a.permalink,
232 h6:hover > a.permalink,
233 div:hover > a.permalink {
233 div:hover > a.permalink {
234 visibility: visible;
234 visibility: visible;
235 }
235 }
236
236
237 #header {
237 #header {
238 }
238 }
239 #header ul#logged-user {
239 #header ul#logged-user {
240 margin-bottom: 5px !important;
240 margin-bottom: 5px !important;
241 -webkit-border-radius: 0px 0px 8px 8px;
241 -webkit-border-radius: 0px 0px 8px 8px;
242 -khtml-border-radius: 0px 0px 8px 8px;
242 -khtml-border-radius: 0px 0px 8px 8px;
243 border-radius: 0px 0px 8px 8px;
243 border-radius: 0px 0px 8px 8px;
244 height: 37px;
244 height: 37px;
245 background-color: #003B76;
245 background-color: #003B76;
246 background-repeat: repeat-x;
246 background-repeat: repeat-x;
247 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
247 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
248 background-image: -moz-linear-gradient(top, #003b76, #00376e);
248 background-image: -moz-linear-gradient(top, #003b76, #00376e);
249 background-image: -ms-linear-gradient(top, #003b76, #00376e);
249 background-image: -ms-linear-gradient(top, #003b76, #00376e);
250 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
250 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
251 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
251 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
252 background-image: -o-linear-gradient(top, #003b76, #00376e);
252 background-image: -o-linear-gradient(top, #003b76, #00376e);
253 background-image: linear-gradient(to bottom, #003b76, #00376e);
253 background-image: linear-gradient(to bottom, #003b76, #00376e);
254 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
254 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
255 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
255 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
256 }
256 }
257
257
258 #header ul#logged-user li {
258 #header ul#logged-user li {
259 list-style: none;
259 list-style: none;
260 float: left;
260 float: left;
261 margin: 8px 0 0;
261 margin: 8px 0 0;
262 padding: 4px 12px;
262 padding: 4px 12px;
263 border-left: 1px solid #316293;
263 border-left: 1px solid #316293;
264 }
264 }
265
265
266 #header ul#logged-user li.first {
266 #header ul#logged-user li.first {
267 border-left: none;
267 border-left: none;
268 margin: 4px;
268 margin: 4px;
269 }
269 }
270
270
271 #header ul#logged-user li.first div.gravatar {
271 #header ul#logged-user li.first div.gravatar {
272 margin-top: -2px;
272 margin-top: -2px;
273 }
273 }
274
274
275 #header ul#logged-user li.first div.account {
275 #header ul#logged-user li.first div.account {
276 padding-top: 4px;
276 padding-top: 4px;
277 float: left;
277 float: left;
278 }
278 }
279
279
280 #header ul#logged-user li.last {
280 #header ul#logged-user li.last {
281 border-right: none;
281 border-right: none;
282 }
282 }
283
283
284 #header ul#logged-user li a {
284 #header ul#logged-user li a {
285 color: #fff;
285 color: #fff;
286 font-weight: 700;
286 font-weight: 700;
287 text-decoration: none;
287 text-decoration: none;
288 }
288 }
289
289
290 #header ul#logged-user li a:hover {
290 #header ul#logged-user li a:hover {
291 text-decoration: underline;
291 text-decoration: underline;
292 }
292 }
293
293
294 #header ul#logged-user li.highlight a {
294 #header ul#logged-user li.highlight a {
295 color: #fff;
295 color: #fff;
296 }
296 }
297
297
298 #header ul#logged-user li.highlight a:hover {
298 #header ul#logged-user li.highlight a:hover {
299 color: #FFF;
299 color: #FFF;
300 }
300 }
301 #header-dd {
301 #header-dd {
302 clear: both;
302 clear: both;
303 position: fixed !important;
303 position: fixed !important;
304 background-color: #003B76;
304 background-color: #003B76;
305 opacity: 0.01;
305 opacity: 0.01;
306 cursor: pointer;
306 cursor: pointer;
307 min-height: 10px;
307 min-height: 10px;
308 width: 100% !important;
308 width: 100% !important;
309 -webkit-border-radius: 0px 0px 4px 4px;
309 -webkit-border-radius: 0px 0px 4px 4px;
310 -khtml-border-radius: 0px 0px 4px 4px;
310 -khtml-border-radius: 0px 0px 4px 4px;
311 border-radius: 0px 0px 4px 4px;
311 border-radius: 0px 0px 4px 4px;
312 }
312 }
313
313
314 #header-dd:hover {
314 #header-dd:hover {
315 opacity: 0.2;
315 opacity: 0.2;
316 -webkit-transition: opacity 0.5s ease-in-out;
316 -webkit-transition: opacity 0.5s ease-in-out;
317 -moz-transition: opacity 0.5s ease-in-out;
317 -moz-transition: opacity 0.5s ease-in-out;
318 transition: opacity 0.5s ease-in-out;
318 transition: opacity 0.5s ease-in-out;
319 }
319 }
320
320
321 #header #header-inner {
321 #header #header-inner {
322 min-height: 44px;
322 min-height: 44px;
323 clear: both;
323 clear: both;
324 position: relative;
324 position: relative;
325 background-color: #003B76;
325 background-color: #003B76;
326 background-repeat: repeat-x;
326 background-repeat: repeat-x;
327 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
327 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
328 background-image: -moz-linear-gradient(top, #003b76, #00376e);
328 background-image: -moz-linear-gradient(top, #003b76, #00376e);
329 background-image: -ms-linear-gradient(top, #003b76, #00376e);
329 background-image: -ms-linear-gradient(top, #003b76, #00376e);
330 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
330 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
331 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
331 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
332 background-image: -o-linear-gradient(top, #003b76, #00376e);
332 background-image: -o-linear-gradient(top, #003b76, #00376e);
333 background-image: linear-gradient(to bottom, #003b76, #00376e);
333 background-image: linear-gradient(to bottom, #003b76, #00376e);
334 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
334 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
335 margin: 0;
335 margin: 0;
336 padding: 0;
336 padding: 0;
337 display: block;
337 display: block;
338 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
338 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
339 -webkit-border-radius: 0px 0px 4px 4px;
339 -webkit-border-radius: 0px 0px 4px 4px;
340 -khtml-border-radius: 0px 0px 4px 4px;
340 -khtml-border-radius: 0px 0px 4px 4px;
341 border-radius: 0px 0px 4px 4px;
341 border-radius: 0px 0px 4px 4px;
342 }
342 }
343 #header #header-inner.hover {
343 #header #header-inner.hover {
344 width: 100% !important;
344 width: 100% !important;
345 -webkit-border-radius: 0px 0px 0px 0px;
345 -webkit-border-radius: 0px 0px 0px 0px;
346 -khtml-border-radius: 0px 0px 0px 0px;
346 -khtml-border-radius: 0px 0px 0px 0px;
347 border-radius: 0px 0px 0px 0px;
347 border-radius: 0px 0px 0px 0px;
348 position: fixed !important;
348 position: fixed !important;
349 z-index: 10000;
349 z-index: 10000;
350 }
350 }
351
351
352 .ie7 #header #header-inner.hover,
352 .ie7 #header #header-inner.hover,
353 .ie8 #header #header-inner.hover,
353 .ie8 #header #header-inner.hover,
354 .ie9 #header #header-inner.hover
354 .ie9 #header #header-inner.hover
355 {
355 {
356 z-index: auto !important;
356 z-index: auto !important;
357 }
357 }
358
358
359 .header-pos-fix, .anchor {
359 .header-pos-fix, .anchor {
360 margin-top: -46px;
360 margin-top: -46px;
361 padding-top: 46px;
361 padding-top: 46px;
362 }
362 }
363
363
364 #header #header-inner #home a {
364 #header #header-inner #home a {
365 height: 40px;
365 height: 40px;
366 width: 46px;
366 width: 46px;
367 display: block;
367 display: block;
368 background: url("../images/button_home.png");
368 background: url("../images/button_home.png");
369 background-position: 0 0;
369 background-position: 0 0;
370 margin: 0;
370 margin: 0;
371 padding: 0;
371 padding: 0;
372 }
372 }
373
373
374 #header #header-inner #home a:hover {
374 #header #header-inner #home a:hover {
375 background-position: 0 -40px;
375 background-position: 0 -40px;
376 }
376 }
377
377
378 #header #header-inner #logo {
378 #header #header-inner #logo {
379 float: left;
379 float: left;
380 position: absolute;
380 position: absolute;
381 }
381 }
382
382
383 #header #header-inner #logo h1 {
383 #header #header-inner #logo h1 {
384 color: #FFF;
384 color: #FFF;
385 font-size: 20px;
385 font-size: 20px;
386 margin: 12px 0 0 13px;
386 margin: 12px 0 0 13px;
387 padding: 0;
387 padding: 0;
388 }
388 }
389
389
390 #header #header-inner #logo a {
390 #header #header-inner #logo a {
391 color: #fff;
391 color: #fff;
392 text-decoration: none;
392 text-decoration: none;
393 }
393 }
394
394
395 #header #header-inner #logo a:hover {
395 #header #header-inner #logo a:hover {
396 color: #bfe3ff;
396 color: #bfe3ff;
397 }
397 }
398
398
399 #header #header-inner #quick, #header #header-inner #quick ul {
399 #header #header-inner #quick, #header #header-inner #quick ul {
400 position: relative;
400 position: relative;
401 float: right;
401 float: right;
402 list-style-type: none;
402 list-style-type: none;
403 list-style-position: outside;
403 list-style-position: outside;
404 margin: 8px 8px 0 0;
404 margin: 8px 8px 0 0;
405 padding: 0;
405 padding: 0;
406 }
406 }
407
407
408 #header #header-inner #quick li {
408 #header #header-inner #quick li {
409 position: relative;
409 position: relative;
410 float: left;
410 float: left;
411 margin: 0 5px 0 0;
411 margin: 0 5px 0 0;
412 padding: 0;
412 padding: 0;
413 }
413 }
414
414
415 #header #header-inner #quick li a.menu_link {
415 #header #header-inner #quick li a.menu_link {
416 top: 0;
416 top: 0;
417 left: 0;
417 left: 0;
418 height: 1%;
418 height: 1%;
419 display: block;
419 display: block;
420 clear: both;
420 clear: both;
421 overflow: hidden;
421 overflow: hidden;
422 color: #FFF;
422 color: #FFF;
423 font-weight: 700;
423 font-weight: 700;
424 text-decoration: none;
424 text-decoration: none;
425 background: #369;
425 background: #369;
426 padding: 0;
426 padding: 0;
427 -webkit-border-radius: 4px 4px 4px 4px;
427 -webkit-border-radius: 4px 4px 4px 4px;
428 -khtml-border-radius: 4px 4px 4px 4px;
428 -khtml-border-radius: 4px 4px 4px 4px;
429 border-radius: 4px 4px 4px 4px;
429 border-radius: 4px 4px 4px 4px;
430 }
430 }
431
431
432 #header #header-inner #quick li span.short {
432 #header #header-inner #quick li span.short {
433 padding: 9px 6px 8px 6px;
433 padding: 9px 6px 8px 6px;
434 }
434 }
435
435
436 #header #header-inner #quick li span {
436 #header #header-inner #quick li span {
437 top: 0;
437 top: 0;
438 right: 0;
438 right: 0;
439 height: 1%;
439 height: 1%;
440 display: block;
440 display: block;
441 float: left;
441 float: left;
442 border-left: 1px solid #3f6f9f;
442 border-left: 1px solid #3f6f9f;
443 margin: 0;
443 margin: 0;
444 padding: 10px 12px 8px 10px;
444 padding: 10px 12px 8px 10px;
445 }
445 }
446
446
447 #header #header-inner #quick li span.normal {
447 #header #header-inner #quick li span.normal {
448 border: none;
448 border: none;
449 padding: 10px 12px 8px;
449 padding: 10px 12px 8px;
450 }
450 }
451
451
452 #header #header-inner #quick li span.icon {
452 #header #header-inner #quick li span.icon {
453 top: 0;
453 top: 0;
454 left: 0;
454 left: 0;
455 border-left: none;
455 border-left: none;
456 border-right: 1px solid #2e5c89;
456 border-right: 1px solid #2e5c89;
457 padding: 8px 6px 4px;
457 padding: 8px 6px 4px;
458 min-width: 16px;
458 min-width: 16px;
459 min-height: 16px;
459 min-height: 16px;
460 }
460 }
461
461
462 #header #header-inner #quick li span.icon_short {
462 #header #header-inner #quick li span.icon_short {
463 top: 0;
463 top: 0;
464 left: 0;
464 left: 0;
465 border-left: none;
465 border-left: none;
466 border-right: 1px solid #2e5c89;
466 border-right: 1px solid #2e5c89;
467 padding: 8px 6px 4px;
467 padding: 8px 6px 4px;
468 }
468 }
469
469
470 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
470 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
471 margin: 0px -2px 0px 0px;
471 margin: 0px -2px 0px 0px;
472 }
472 }
473
473
474 #header #header-inner #quick li.current a,
474 #header #header-inner #quick li.current a,
475 #header #header-inner #quick li a:hover {
475 #header #header-inner #quick li a:hover {
476 background: #4e4e4e no-repeat top left;
476 background: #4e4e4e no-repeat top left;
477 }
477 }
478
478
479 #header #header-inner #quick li.current a span,
479 #header #header-inner #quick li.current a span,
480 #header #header-inner #quick li a:hover span {
480 #header #header-inner #quick li a:hover span {
481 border-left: 1px solid #545454;
481 border-left: 1px solid #545454;
482 }
482 }
483
483
484 #header #header-inner #quick li.current a span.icon,
484 #header #header-inner #quick li.current a span.icon,
485 #header #header-inner #quick li.current a span.icon_short,
485 #header #header-inner #quick li.current a span.icon_short,
486 #header #header-inner #quick li a:hover span.icon,
486 #header #header-inner #quick li a:hover span.icon,
487 #header #header-inner #quick li a:hover span.icon_short {
487 #header #header-inner #quick li a:hover span.icon_short {
488 border-left: none;
488 border-left: none;
489 border-right: 1px solid #464646;
489 border-right: 1px solid #464646;
490 }
490 }
491
491
492 #header #header-inner #quick ul {
492 #header #header-inner #quick ul {
493 top: 29px;
493 top: 29px;
494 right: 0;
494 right: 0;
495 min-width: 200px;
495 min-width: 200px;
496 display: none;
496 display: none;
497 position: absolute;
497 position: absolute;
498 background: #FFF;
498 background: #FFF;
499 border: 1px solid #666;
499 border: 1px solid #666;
500 border-top: 1px solid #003367;
500 border-top: 1px solid #003367;
501 z-index: 100;
501 z-index: 100;
502 margin: 0px 0px 0px 0px;
502 margin: 0px 0px 0px 0px;
503 padding: 0;
503 padding: 0;
504 }
504 }
505
505
506 #header #header-inner #quick ul.repo_switcher {
506 #header #header-inner #quick ul.repo_switcher {
507 max-height: 275px;
507 max-height: 275px;
508 overflow-x: hidden;
508 overflow-x: hidden;
509 overflow-y: auto;
509 overflow-y: auto;
510 }
510 }
511
511
512 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
512 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
513 float: none;
513 float: none;
514 margin: 0;
514 margin: 0;
515 border-bottom: 2px solid #003367;
515 border-bottom: 2px solid #003367;
516 }
516 }
517
517
518 #header #header-inner #quick .repo_switcher_type {
518 #header #header-inner #quick .repo_switcher_type {
519 position: absolute;
519 position: absolute;
520 left: 0;
520 left: 0;
521 top: 9px;
521 top: 9px;
522 }
522 }
523
523
524 #header #header-inner #quick li ul li {
524 #header #header-inner #quick li ul li {
525 border-bottom: 1px solid #ddd;
525 border-bottom: 1px solid #ddd;
526 }
526 }
527
527
528 #header #header-inner #quick li ul li a {
528 #header #header-inner #quick li ul li a {
529 width: 182px;
529 width: 182px;
530 height: auto;
530 height: auto;
531 display: block;
531 display: block;
532 float: left;
532 float: left;
533 background: #FFF;
533 background: #FFF;
534 color: #003367;
534 color: #003367;
535 font-weight: 400;
535 font-weight: 400;
536 margin: 0;
536 margin: 0;
537 padding: 7px 9px;
537 padding: 7px 9px;
538 }
538 }
539
539
540 #header #header-inner #quick li ul li a:hover {
540 #header #header-inner #quick li ul li a:hover {
541 color: #000;
541 color: #000;
542 background: #FFF;
542 background: #FFF;
543 }
543 }
544
544
545 #header #header-inner #quick ul ul {
545 #header #header-inner #quick ul ul {
546 top: auto;
546 top: auto;
547 }
547 }
548
548
549 #header #header-inner #quick li ul ul {
549 #header #header-inner #quick li ul ul {
550 right: 200px;
550 right: 200px;
551 max-height: 290px;
551 max-height: 290px;
552 overflow: auto;
552 overflow: auto;
553 overflow-x: hidden;
553 overflow-x: hidden;
554 white-space: normal;
554 white-space: normal;
555 }
555 }
556
556
557 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
557 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
558 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
558 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
559 #FFF;
559 #FFF;
560 width: 167px;
560 width: 167px;
561 margin: 0;
561 margin: 0;
562 padding: 12px 9px 7px 24px;
562 padding: 12px 9px 7px 24px;
563 }
563 }
564
564
565 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
565 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
566 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
566 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
567 #FFF;
567 #FFF;
568 min-width: 167px;
568 min-width: 167px;
569 margin: 0;
569 margin: 0;
570 padding: 12px 9px 7px 24px;
570 padding: 12px 9px 7px 24px;
571 }
571 }
572
572
573 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
573 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
574 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
574 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
575 9px #FFF;
575 9px #FFF;
576 min-width: 167px;
576 min-width: 167px;
577 margin: 0;
577 margin: 0;
578 padding: 12px 9px 7px 24px;
578 padding: 12px 9px 7px 24px;
579 }
579 }
580
580
581 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
581 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
582 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
582 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
583 #FFF;
583 #FFF;
584 min-width: 167px;
584 min-width: 167px;
585 margin: 0 0 0 14px;
585 margin: 0 0 0 14px;
586 padding: 12px 9px 7px 24px;
586 padding: 12px 9px 7px 24px;
587 }
587 }
588
588
589 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
589 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
590 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
590 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
591 #FFF;
591 #FFF;
592 min-width: 167px;
592 min-width: 167px;
593 margin: 0 0 0 14px;
593 margin: 0 0 0 14px;
594 padding: 12px 9px 7px 24px;
594 padding: 12px 9px 7px 24px;
595 }
595 }
596
596
597 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
597 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
598 background: url("../images/icons/database_edit.png") no-repeat scroll
598 background: url("../images/icons/database_edit.png") no-repeat scroll
599 4px 9px #FFF;
599 4px 9px #FFF;
600 width: 167px;
600 width: 167px;
601 margin: 0;
601 margin: 0;
602 padding: 12px 9px 7px 24px;
602 padding: 12px 9px 7px 24px;
603 }
603 }
604
604
605 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
605 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
606 background: url("../images/icons/database_link.png") no-repeat scroll
606 background: url("../images/icons/database_link.png") no-repeat scroll
607 4px 9px #FFF;
607 4px 9px #FFF;
608 width: 167px;
608 width: 167px;
609 margin: 0;
609 margin: 0;
610 padding: 12px 9px 7px 24px;
610 padding: 12px 9px 7px 24px;
611 }
611 }
612
612
613 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
613 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
614 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
614 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
615 width: 167px;
615 width: 167px;
616 margin: 0;
616 margin: 0;
617 padding: 12px 9px 7px 24px;
617 padding: 12px 9px 7px 24px;
618 }
618 }
619
619
620 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
620 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
621 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
621 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
622 width: 167px;
622 width: 167px;
623 margin: 0;
623 margin: 0;
624 padding: 12px 9px 7px 24px;
624 padding: 12px 9px 7px 24px;
625 }
625 }
626
626
627 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
627 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
628 background: #FFF url("../images/icons/wrench.png") no-repeat 4px 9px;
628 background: #FFF url("../images/icons/wrench.png") no-repeat 4px 9px;
629 width: 167px;
629 width: 167px;
630 margin: 0;
630 margin: 0;
631 padding: 12px 9px 7px 24px;
631 padding: 12px 9px 7px 24px;
632 }
632 }
633
633
634 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
634 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
635 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
635 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
636 width: 167px;
636 width: 167px;
637 margin: 0;
637 margin: 0;
638 padding: 12px 9px 7px 24px;
638 padding: 12px 9px 7px 24px;
639 }
639 }
640
640
641 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
641 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
642 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
642 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
643 width: 167px;
643 width: 167px;
644 margin: 0;
644 margin: 0;
645 padding: 12px 9px 7px 24px;
645 padding: 12px 9px 7px 24px;
646 }
646 }
647
647
648 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
648 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
649 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
649 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
650 width: 167px;
650 width: 167px;
651 margin: 0;
651 margin: 0;
652 padding: 12px 9px 7px 24px;
652 padding: 12px 9px 7px 24px;
653 }
653 }
654
654
655 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
655 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
656 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
656 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
657 9px;
657 9px;
658 width: 167px;
658 width: 167px;
659 margin: 0;
659 margin: 0;
660 padding: 12px 9px 7px 24px;
660 padding: 12px 9px 7px 24px;
661 }
661 }
662
662
663 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
663 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
664 background: #FFF url("../images/icons/lock_add.png") no-repeat 4px
664 background: #FFF url("../images/icons/lock_add.png") no-repeat 4px
665 9px;
665 9px;
666 width: 167px;
666 width: 167px;
667 margin: 0;
667 margin: 0;
668 padding: 12px 9px 7px 24px;
668 padding: 12px 9px 7px 24px;
669 }
669 }
670
670
671 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
671 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
672 background: #FFF url("../images/icons/lock_delete.png") no-repeat 4px
672 background: #FFF url("../images/icons/lock_delete.png") no-repeat 4px
673 9px;
673 9px;
674 width: 167px;
674 width: 167px;
675 margin: 0;
675 margin: 0;
676 padding: 12px 9px 7px 24px;
676 padding: 12px 9px 7px 24px;
677 }
677 }
678
678
679 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
679 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
680 background: #FFF url("../images/icons/arrow_join.png") no-repeat 4px
680 background: #FFF url("../images/icons/arrow_join.png") no-repeat 4px
681 9px;
681 9px;
682 width: 167px;
682 width: 167px;
683 margin: 0;
683 margin: 0;
684 padding: 12px 9px 7px 24px;
684 padding: 12px 9px 7px 24px;
685 }
685 }
686
686
687 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
687 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
688 background: #FFF url("../images/icons/arrow_inout.png") no-repeat 4px
688 background: #FFF url("../images/icons/arrow_inout.png") no-repeat 4px
689 9px;
689 9px;
690 width: 167px;
690 width: 167px;
691 margin: 0;
691 margin: 0;
692 padding: 12px 9px 7px 24px;
692 padding: 12px 9px 7px 24px;
693 }
693 }
694
694
695 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
695 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
696 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
696 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
697 width: 167px;
697 width: 167px;
698 margin: 0;
698 margin: 0;
699 padding: 12px 9px 7px 24px;
699 padding: 12px 9px 7px 24px;
700 }
700 }
701
701
702 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
702 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
703 background: #FFF url("../images/icons/clock_16.png") no-repeat 4px 9px;
703 background: #FFF url("../images/icons/clock_16.png") no-repeat 4px 9px;
704 width: 167px;
704 width: 167px;
705 margin: 0;
705 margin: 0;
706 padding: 12px 9px 7px 24px;
706 padding: 12px 9px 7px 24px;
707 }
707 }
708
708
709
709
710 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
710 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
711 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
711 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
712 width: 167px;
712 width: 167px;
713 margin: 0;
713 margin: 0;
714 padding: 12px 9px 7px 24px;
714 padding: 12px 9px 7px 24px;
715 }
715 }
716
716
717 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
717 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
718 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
718 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
719 9px;
719 9px;
720 width: 167px;
720 width: 167px;
721 margin: 0;
721 margin: 0;
722 padding: 12px 9px 7px 24px;
722 padding: 12px 9px 7px 24px;
723 }
723 }
724
724
725 #header #header-inner #quick li ul li a.tags,
725 #header #header-inner #quick li ul li a.tags,
726 #header #header-inner #quick li ul li a.tags:hover {
726 #header #header-inner #quick li ul li a.tags:hover {
727 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
727 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
728 width: 167px;
728 width: 167px;
729 margin: 0;
729 margin: 0;
730 padding: 12px 9px 7px 24px;
730 padding: 12px 9px 7px 24px;
731 }
731 }
732
732
733 #header #header-inner #quick li ul li a.bookmarks,
733 #header #header-inner #quick li ul li a.bookmarks,
734 #header #header-inner #quick li ul li a.bookmarks:hover {
734 #header #header-inner #quick li ul li a.bookmarks:hover {
735 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
735 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
736 width: 167px;
736 width: 167px;
737 margin: 0;
737 margin: 0;
738 padding: 12px 9px 7px 24px;
738 padding: 12px 9px 7px 24px;
739 }
739 }
740
740
741 #header #header-inner #quick li ul li a.admin,
741 #header #header-inner #quick li ul li a.admin,
742 #header #header-inner #quick li ul li a.admin:hover {
742 #header #header-inner #quick li ul li a.admin:hover {
743 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
743 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
744 width: 167px;
744 width: 167px;
745 margin: 0;
745 margin: 0;
746 padding: 12px 9px 7px 24px;
746 padding: 12px 9px 7px 24px;
747 }
747 }
748
748
749 .groups_breadcrumbs a {
749 .groups_breadcrumbs a {
750 color: #fff;
750 color: #fff;
751 }
751 }
752
752
753 .groups_breadcrumbs a:hover {
753 .groups_breadcrumbs a:hover {
754 color: #bfe3ff;
754 color: #bfe3ff;
755 text-decoration: none;
755 text-decoration: none;
756 }
756 }
757
757
758 td.quick_repo_menu {
758 td.quick_repo_menu {
759 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
759 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
760 cursor: pointer;
760 cursor: pointer;
761 width: 8px;
761 width: 8px;
762 border: 1px solid transparent;
762 border: 1px solid transparent;
763 }
763 }
764
764
765 td.quick_repo_menu.active {
765 td.quick_repo_menu.active {
766 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
766 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
767 border: 1px solid #003367;
767 border: 1px solid #003367;
768 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
768 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
769 cursor: pointer;
769 cursor: pointer;
770 }
770 }
771
771
772 td.quick_repo_menu .menu_items {
772 td.quick_repo_menu .menu_items {
773 margin-top: 10px;
773 margin-top: 10px;
774 margin-left: -6px;
774 margin-left: -6px;
775 width: 150px;
775 width: 150px;
776 position: absolute;
776 position: absolute;
777 background-color: #FFF;
777 background-color: #FFF;
778 background: none repeat scroll 0 0 #FFFFFF;
778 background: none repeat scroll 0 0 #FFFFFF;
779 border-color: #003367 #666666 #666666;
779 border-color: #003367 #666666 #666666;
780 border-right: 1px solid #666666;
780 border-right: 1px solid #666666;
781 border-style: solid;
781 border-style: solid;
782 border-width: 1px;
782 border-width: 1px;
783 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
783 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
784 border-top-style: none;
784 border-top-style: none;
785 }
785 }
786
786
787 td.quick_repo_menu .menu_items li {
787 td.quick_repo_menu .menu_items li {
788 padding: 0 !important;
788 padding: 0 !important;
789 }
789 }
790
790
791 td.quick_repo_menu .menu_items a {
791 td.quick_repo_menu .menu_items a {
792 display: block;
792 display: block;
793 padding: 4px 12px 4px 8px;
793 padding: 4px 12px 4px 8px;
794 }
794 }
795
795
796 td.quick_repo_menu .menu_items a:hover {
796 td.quick_repo_menu .menu_items a:hover {
797 background-color: #EEE;
797 background-color: #EEE;
798 text-decoration: none;
798 text-decoration: none;
799 }
799 }
800
800
801 td.quick_repo_menu .menu_items .icon img {
801 td.quick_repo_menu .menu_items .icon img {
802 margin-bottom: -2px;
802 margin-bottom: -2px;
803 }
803 }
804
804
805 td.quick_repo_menu .menu_items.hidden {
805 td.quick_repo_menu .menu_items.hidden {
806 display: none;
806 display: none;
807 }
807 }
808
808
809 .yui-dt-first th {
809 .yui-dt-first th {
810 text-align: left;
810 text-align: left;
811 }
811 }
812
812
813 /*
813 /*
814 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
814 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
815 Code licensed under the BSD License:
815 Code licensed under the BSD License:
816 http://developer.yahoo.com/yui/license.html
816 http://developer.yahoo.com/yui/license.html
817 version: 2.9.0
817 version: 2.9.0
818 */
818 */
819 .yui-skin-sam .yui-dt-mask {
819 .yui-skin-sam .yui-dt-mask {
820 position: absolute;
820 position: absolute;
821 z-index: 9500;
821 z-index: 9500;
822 }
822 }
823 .yui-dt-tmp {
823 .yui-dt-tmp {
824 position: absolute;
824 position: absolute;
825 left: -9000px;
825 left: -9000px;
826 }
826 }
827 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
827 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
828 .yui-dt-scrollable .yui-dt-hd {
828 .yui-dt-scrollable .yui-dt-hd {
829 overflow: hidden;
829 overflow: hidden;
830 position: relative;
830 position: relative;
831 }
831 }
832 .yui-dt-scrollable .yui-dt-bd thead tr,
832 .yui-dt-scrollable .yui-dt-bd thead tr,
833 .yui-dt-scrollable .yui-dt-bd thead th {
833 .yui-dt-scrollable .yui-dt-bd thead th {
834 position: absolute;
834 position: absolute;
835 left: -1500px;
835 left: -1500px;
836 }
836 }
837 .yui-dt-scrollable tbody { -moz-outline: 0 }
837 .yui-dt-scrollable tbody { -moz-outline: 0 }
838 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
838 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
839 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
839 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
840 .yui-dt-coltarget {
840 .yui-dt-coltarget {
841 position: absolute;
841 position: absolute;
842 z-index: 999;
842 z-index: 999;
843 }
843 }
844 .yui-dt-hd { zoom: 1 }
844 .yui-dt-hd { zoom: 1 }
845 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
845 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
846 .yui-dt-resizer {
846 .yui-dt-resizer {
847 position: absolute;
847 position: absolute;
848 right: 0;
848 right: 0;
849 bottom: 0;
849 bottom: 0;
850 height: 100%;
850 height: 100%;
851 cursor: e-resize;
851 cursor: e-resize;
852 cursor: col-resize;
852 cursor: col-resize;
853 background-color: #CCC;
853 background-color: #CCC;
854 opacity: 0;
854 opacity: 0;
855 filter: alpha(opacity=0);
855 filter: alpha(opacity=0);
856 }
856 }
857 .yui-dt-resizerproxy {
857 .yui-dt-resizerproxy {
858 visibility: hidden;
858 visibility: hidden;
859 position: absolute;
859 position: absolute;
860 z-index: 9000;
860 z-index: 9000;
861 background-color: #CCC;
861 background-color: #CCC;
862 opacity: 0;
862 opacity: 0;
863 filter: alpha(opacity=0);
863 filter: alpha(opacity=0);
864 }
864 }
865 th.yui-dt-hidden .yui-dt-liner,
865 th.yui-dt-hidden .yui-dt-liner,
866 td.yui-dt-hidden .yui-dt-liner,
866 td.yui-dt-hidden .yui-dt-liner,
867 th.yui-dt-hidden .yui-dt-resizer { display: none }
867 th.yui-dt-hidden .yui-dt-resizer { display: none }
868 .yui-dt-editor,
868 .yui-dt-editor,
869 .yui-dt-editor-shim {
869 .yui-dt-editor-shim {
870 position: absolute;
870 position: absolute;
871 z-index: 9000;
871 z-index: 9000;
872 }
872 }
873 .yui-skin-sam .yui-dt table {
873 .yui-skin-sam .yui-dt table {
874 margin: 0;
874 margin: 0;
875 padding: 0;
875 padding: 0;
876 font-family: arial;
876 font-family: arial;
877 font-size: inherit;
877 font-size: inherit;
878 border-collapse: separate;
878 border-collapse: separate;
879 *border-collapse: collapse;
879 *border-collapse: collapse;
880 border-spacing: 0;
880 border-spacing: 0;
881 border: 1px solid #7f7f7f;
881 border: 1px solid #7f7f7f;
882 }
882 }
883 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
883 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
884 .yui-skin-sam .yui-dt caption {
884 .yui-skin-sam .yui-dt caption {
885 color: #000;
885 color: #000;
886 font-size: 85%;
886 font-size: 85%;
887 font-weight: normal;
887 font-weight: normal;
888 font-style: italic;
888 font-style: italic;
889 line-height: 1;
889 line-height: 1;
890 padding: 1em 0;
890 padding: 1em 0;
891 text-align: center;
891 text-align: center;
892 }
892 }
893 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
893 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
894 .yui-skin-sam .yui-dt th,
894 .yui-skin-sam .yui-dt th,
895 .yui-skin-sam .yui-dt th a {
895 .yui-skin-sam .yui-dt th a {
896 font-weight: normal;
896 font-weight: normal;
897 text-decoration: none;
897 text-decoration: none;
898 color: #000;
898 color: #000;
899 vertical-align: bottom;
899 vertical-align: bottom;
900 }
900 }
901 .yui-skin-sam .yui-dt th {
901 .yui-skin-sam .yui-dt th {
902 margin: 0;
902 margin: 0;
903 padding: 0;
903 padding: 0;
904 border: 0;
904 border: 0;
905 border-right: 1px solid #cbcbcb;
905 border-right: 1px solid #cbcbcb;
906 }
906 }
907 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
907 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
908 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
908 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
909 .yui-skin-sam .yui-dt-liner {
909 .yui-skin-sam .yui-dt-liner {
910 margin: 0;
910 margin: 0;
911 padding: 0;
911 padding: 0;
912 }
912 }
913 .yui-skin-sam .yui-dt-coltarget {
913 .yui-skin-sam .yui-dt-coltarget {
914 width: 5px;
914 width: 5px;
915 background-color: red;
915 background-color: red;
916 }
916 }
917 .yui-skin-sam .yui-dt td {
917 .yui-skin-sam .yui-dt td {
918 margin: 0;
918 margin: 0;
919 padding: 0;
919 padding: 0;
920 border: 0;
920 border: 0;
921 border-right: 1px solid #cbcbcb;
921 border-right: 1px solid #cbcbcb;
922 text-align: left;
922 text-align: left;
923 }
923 }
924 .yui-skin-sam .yui-dt-list td { border-right: 0 }
924 .yui-skin-sam .yui-dt-list td { border-right: 0 }
925 .yui-skin-sam .yui-dt-resizer { width: 6px }
925 .yui-skin-sam .yui-dt-resizer { width: 6px }
926 .yui-skin-sam .yui-dt-mask {
926 .yui-skin-sam .yui-dt-mask {
927 background-color: #000;
927 background-color: #000;
928 opacity: .25;
928 opacity: .25;
929 filter: alpha(opacity=25);
929 filter: alpha(opacity=25);
930 }
930 }
931 .yui-skin-sam .yui-dt-message { background-color: #FFF }
931 .yui-skin-sam .yui-dt-message { background-color: #FFF }
932 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
932 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
933 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
933 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
934 border-left: 1px solid #7f7f7f;
934 border-left: 1px solid #7f7f7f;
935 border-top: 1px solid #7f7f7f;
935 border-top: 1px solid #7f7f7f;
936 border-right: 1px solid #7f7f7f;
936 border-right: 1px solid #7f7f7f;
937 }
937 }
938 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
938 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
939 border-left: 1px solid #7f7f7f;
939 border-left: 1px solid #7f7f7f;
940 border-bottom: 1px solid #7f7f7f;
940 border-bottom: 1px solid #7f7f7f;
941 border-right: 1px solid #7f7f7f;
941 border-right: 1px solid #7f7f7f;
942 background-color: #FFF;
942 background-color: #FFF;
943 }
943 }
944 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
944 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
945 .yui-skin-sam th.yui-dt-asc,
945 .yui-skin-sam th.yui-dt-asc,
946 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
946 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
947 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
947 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
948 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
948 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
949 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
949 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
950 tbody .yui-dt-editable { cursor: pointer }
950 tbody .yui-dt-editable { cursor: pointer }
951 .yui-dt-editor {
951 .yui-dt-editor {
952 text-align: left;
952 text-align: left;
953 background-color: #f2f2f2;
953 background-color: #f2f2f2;
954 border: 1px solid #808080;
954 border: 1px solid #808080;
955 padding: 6px;
955 padding: 6px;
956 }
956 }
957 .yui-dt-editor label {
957 .yui-dt-editor label {
958 padding-left: 4px;
958 padding-left: 4px;
959 padding-right: 6px;
959 padding-right: 6px;
960 }
960 }
961 .yui-dt-editor .yui-dt-button {
961 .yui-dt-editor .yui-dt-button {
962 padding-top: 6px;
962 padding-top: 6px;
963 text-align: right;
963 text-align: right;
964 }
964 }
965 .yui-dt-editor .yui-dt-button button {
965 .yui-dt-editor .yui-dt-button button {
966 background: url(../images/sprite.png) repeat-x 0 0;
966 background: url(../images/sprite.png) repeat-x 0 0;
967 border: 1px solid #999;
967 border: 1px solid #999;
968 width: 4em;
968 width: 4em;
969 height: 1.8em;
969 height: 1.8em;
970 margin-left: 6px;
970 margin-left: 6px;
971 }
971 }
972 .yui-dt-editor .yui-dt-button button.yui-dt-default {
972 .yui-dt-editor .yui-dt-button button.yui-dt-default {
973 background: url(../images/sprite.png) repeat-x 0 -1400px;
973 background: url(../images/sprite.png) repeat-x 0 -1400px;
974 background-color: #5584e0;
974 background-color: #5584e0;
975 border: 1px solid #304369;
975 border: 1px solid #304369;
976 color: #FFF;
976 color: #FFF;
977 }
977 }
978 .yui-dt-editor .yui-dt-button button:hover {
978 .yui-dt-editor .yui-dt-button button:hover {
979 background: url(../images/sprite.png) repeat-x 0 -1300px;
979 background: url(../images/sprite.png) repeat-x 0 -1300px;
980 color: #000;
980 color: #000;
981 }
981 }
982 .yui-dt-editor .yui-dt-button button:active {
982 .yui-dt-editor .yui-dt-button button:active {
983 background: url(../images/sprite.png) repeat-x 0 -1700px;
983 background: url(../images/sprite.png) repeat-x 0 -1700px;
984 color: #000;
984 color: #000;
985 }
985 }
986 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
986 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
987 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
987 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
988 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
988 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
989 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
989 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
990 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
990 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
991 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
991 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
992 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
992 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
993 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
993 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
994 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
994 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
995 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
995 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
996 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
996 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
997 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
997 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
998 .yui-skin-sam th.yui-dt-highlighted,
998 .yui-skin-sam th.yui-dt-highlighted,
999 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
999 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
1000 .yui-skin-sam tr.yui-dt-highlighted,
1000 .yui-skin-sam tr.yui-dt-highlighted,
1001 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
1001 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
1002 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
1002 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
1003 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
1003 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
1004 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
1004 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
1005 cursor: pointer;
1005 cursor: pointer;
1006 background-color: #b2d2ff;
1006 background-color: #b2d2ff;
1007 }
1007 }
1008 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
1008 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
1009 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
1009 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
1010 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
1010 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
1011 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
1011 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
1012 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
1012 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
1013 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
1013 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
1014 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
1014 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
1015 cursor: pointer;
1015 cursor: pointer;
1016 background-color: #b2d2ff;
1016 background-color: #b2d2ff;
1017 }
1017 }
1018 .yui-skin-sam th.yui-dt-selected,
1018 .yui-skin-sam th.yui-dt-selected,
1019 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
1019 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
1020 .yui-skin-sam tr.yui-dt-selected td,
1020 .yui-skin-sam tr.yui-dt-selected td,
1021 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
1021 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
1022 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
1022 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
1023 background-color: #426fd9;
1023 background-color: #426fd9;
1024 color: #FFF;
1024 color: #FFF;
1025 }
1025 }
1026 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
1026 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
1027 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
1027 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
1028 background-color: #446cd7;
1028 background-color: #446cd7;
1029 color: #FFF;
1029 color: #FFF;
1030 }
1030 }
1031 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
1031 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
1032 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
1032 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
1033 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
1033 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
1034 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
1034 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
1035 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
1035 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
1036 background-color: #426fd9;
1036 background-color: #426fd9;
1037 color: #FFF;
1037 color: #FFF;
1038 }
1038 }
1039 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
1039 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
1040 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
1040 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
1041 background-color: #446cd7;
1041 background-color: #446cd7;
1042 color: #FFF;
1042 color: #FFF;
1043 }
1043 }
1044 .yui-skin-sam .yui-dt-paginator {
1044 .yui-skin-sam .yui-dt-paginator {
1045 display: block;
1045 display: block;
1046 margin: 6px 0;
1046 margin: 6px 0;
1047 white-space: nowrap;
1047 white-space: nowrap;
1048 }
1048 }
1049 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
1049 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
1050 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
1050 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
1051 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
1051 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
1052 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
1052 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
1053 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
1053 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
1054 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
1054 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
1055 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
1055 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
1056 .yui-skin-sam a.yui-dt-page {
1056 .yui-skin-sam a.yui-dt-page {
1057 border: 1px solid #cbcbcb;
1057 border: 1px solid #cbcbcb;
1058 padding: 2px 6px;
1058 padding: 2px 6px;
1059 text-decoration: none;
1059 text-decoration: none;
1060 background-color: #fff;
1060 background-color: #fff;
1061 }
1061 }
1062 .yui-skin-sam .yui-dt-selected {
1062 .yui-skin-sam .yui-dt-selected {
1063 border: 1px solid #fff;
1063 border: 1px solid #fff;
1064 background-color: #fff;
1064 background-color: #fff;
1065 }
1065 }
1066
1066
1067 #content #left {
1067 #content #left {
1068 left: 0;
1068 left: 0;
1069 width: 280px;
1069 width: 280px;
1070 position: absolute;
1070 position: absolute;
1071 }
1071 }
1072
1072
1073 #content #right {
1073 #content #right {
1074 margin: 0 60px 10px 290px;
1074 margin: 0 60px 10px 290px;
1075 }
1075 }
1076
1076
1077 #content div.box {
1077 #content div.box {
1078 clear: both;
1078 clear: both;
1079 overflow: hidden;
1079 overflow: hidden;
1080 background: #fff;
1080 background: #fff;
1081 margin: 0 0 10px;
1081 margin: 0 0 10px;
1082 padding: 0 0 10px;
1082 padding: 0 0 10px;
1083 -webkit-border-radius: 4px 4px 4px 4px;
1083 -webkit-border-radius: 4px 4px 4px 4px;
1084 -khtml-border-radius: 4px 4px 4px 4px;
1084 -khtml-border-radius: 4px 4px 4px 4px;
1085 border-radius: 4px 4px 4px 4px;
1085 border-radius: 4px 4px 4px 4px;
1086 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1086 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1087 }
1087 }
1088
1088
1089 #content div.box-left {
1089 #content div.box-left {
1090 width: 49%;
1090 width: 49%;
1091 clear: none;
1091 clear: none;
1092 float: left;
1092 float: left;
1093 margin: 0 0 10px;
1093 margin: 0 0 10px;
1094 }
1094 }
1095
1095
1096 #content div.box-right {
1096 #content div.box-right {
1097 width: 49%;
1097 width: 49%;
1098 clear: none;
1098 clear: none;
1099 float: right;
1099 float: right;
1100 margin: 0 0 10px;
1100 margin: 0 0 10px;
1101 }
1101 }
1102
1102
1103 #content div.box div.title {
1103 #content div.box div.title {
1104 clear: both;
1104 clear: both;
1105 overflow: hidden;
1105 overflow: hidden;
1106 background-color: #003B76;
1106 background-color: #003B76;
1107 background-repeat: repeat-x;
1107 background-repeat: repeat-x;
1108 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1108 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1109 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1109 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1110 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1110 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1111 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1111 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1112 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1112 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1113 background-image: -o-linear-gradient(top, #003b76, #00376e);
1113 background-image: -o-linear-gradient(top, #003b76, #00376e);
1114 background-image: linear-gradient(to bottom, #003b76, #00376e);
1114 background-image: linear-gradient(to bottom, #003b76, #00376e);
1115 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1115 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1116 margin: 0 0 20px;
1116 margin: 0 0 20px;
1117 padding: 0;
1117 padding: 0;
1118 }
1118 }
1119
1119
1120 #content div.box div.title h5 {
1120 #content div.box div.title h5 {
1121 float: left;
1121 float: left;
1122 border: none;
1122 border: none;
1123 color: #fff;
1123 color: #fff;
1124 text-transform: uppercase;
1124 text-transform: uppercase;
1125 margin: 0;
1125 margin: 0;
1126 padding: 11px 0 11px 10px;
1126 padding: 11px 0 11px 10px;
1127 }
1127 }
1128
1128
1129 #content div.box div.title .link-white {
1129 #content div.box div.title .link-white {
1130 color: #FFFFFF;
1130 color: #FFFFFF;
1131 }
1131 }
1132
1132
1133 #content div.box div.title .link-white.current {
1133 #content div.box div.title .link-white.current {
1134 color: #BFE3FF;
1134 color: #BFE3FF;
1135 }
1135 }
1136
1136
1137 #content div.box div.title ul.links li {
1137 #content div.box div.title ul.links li {
1138 list-style: none;
1138 list-style: none;
1139 float: left;
1139 float: left;
1140 margin: 0;
1140 margin: 0;
1141 padding: 0;
1141 padding: 0;
1142 }
1142 }
1143
1143
1144 #content div.box div.title ul.links li a {
1144 #content div.box div.title ul.links li a {
1145 border-left: 1px solid #316293;
1145 border-left: 1px solid #316293;
1146 color: #FFFFFF;
1146 color: #FFFFFF;
1147 display: block;
1147 display: block;
1148 float: left;
1148 float: left;
1149 font-size: 13px;
1149 font-size: 13px;
1150 font-weight: 700;
1150 font-weight: 700;
1151 height: 1%;
1151 height: 1%;
1152 margin: 0;
1152 margin: 0;
1153 padding: 11px 22px 12px;
1153 padding: 11px 22px 12px;
1154 text-decoration: none;
1154 text-decoration: none;
1155 }
1155 }
1156
1156
1157 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
1157 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
1158 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
1158 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
1159 clear: both;
1159 clear: both;
1160 overflow: hidden;
1160 overflow: hidden;
1161 border-bottom: 1px solid #DDD;
1161 border-bottom: 1px solid #DDD;
1162 margin: 10px 20px;
1162 margin: 10px 20px;
1163 padding: 0 0 15px;
1163 padding: 0 0 15px;
1164 }
1164 }
1165
1165
1166 #content div.box p {
1166 #content div.box p {
1167 color: #5f5f5f;
1167 color: #5f5f5f;
1168 font-size: 12px;
1168 font-size: 12px;
1169 line-height: 150%;
1169 line-height: 150%;
1170 margin: 0 24px 10px;
1170 margin: 0 24px 10px;
1171 padding: 0;
1171 padding: 0;
1172 }
1172 }
1173
1173
1174 #content div.box blockquote {
1174 #content div.box blockquote {
1175 border-left: 4px solid #DDD;
1175 border-left: 4px solid #DDD;
1176 color: #5f5f5f;
1176 color: #5f5f5f;
1177 font-size: 11px;
1177 font-size: 11px;
1178 line-height: 150%;
1178 line-height: 150%;
1179 margin: 0 34px;
1179 margin: 0 34px;
1180 padding: 0 0 0 14px;
1180 padding: 0 0 0 14px;
1181 }
1181 }
1182
1182
1183 #content div.box blockquote p {
1183 #content div.box blockquote p {
1184 margin: 10px 0;
1184 margin: 10px 0;
1185 padding: 0;
1185 padding: 0;
1186 }
1186 }
1187
1187
1188 #content div.box dl {
1188 #content div.box dl {
1189 margin: 10px 0px;
1189 margin: 10px 0px;
1190 }
1190 }
1191
1191
1192 #content div.box dt {
1192 #content div.box dt {
1193 font-size: 12px;
1193 font-size: 12px;
1194 margin: 0;
1194 margin: 0;
1195 }
1195 }
1196
1196
1197 #content div.box dd {
1197 #content div.box dd {
1198 font-size: 12px;
1198 font-size: 12px;
1199 margin: 0;
1199 margin: 0;
1200 padding: 8px 0 8px 15px;
1200 padding: 8px 0 8px 15px;
1201 }
1201 }
1202
1202
1203 #content div.box li {
1203 #content div.box li {
1204 font-size: 12px;
1204 font-size: 12px;
1205 padding: 4px 0;
1205 padding: 4px 0;
1206 }
1206 }
1207
1207
1208 #content div.box ul.disc, #content div.box ul.circle {
1208 #content div.box ul.disc, #content div.box ul.circle {
1209 margin: 10px 24px 10px 38px;
1209 margin: 10px 24px 10px 38px;
1210 }
1210 }
1211
1211
1212 #content div.box ul.square {
1212 #content div.box ul.square {
1213 margin: 10px 24px 10px 40px;
1213 margin: 10px 24px 10px 40px;
1214 }
1214 }
1215
1215
1216 #content div.box img.left {
1216 #content div.box img.left {
1217 border: none;
1217 border: none;
1218 float: left;
1218 float: left;
1219 margin: 10px 10px 10px 0;
1219 margin: 10px 10px 10px 0;
1220 }
1220 }
1221
1221
1222 #content div.box img.right {
1222 #content div.box img.right {
1223 border: none;
1223 border: none;
1224 float: right;
1224 float: right;
1225 margin: 10px 0 10px 10px;
1225 margin: 10px 0 10px 10px;
1226 }
1226 }
1227
1227
1228 #content div.box div.messages {
1228 #content div.box div.messages {
1229 clear: both;
1229 clear: both;
1230 overflow: hidden;
1230 overflow: hidden;
1231 margin: 0 20px;
1231 margin: 0 20px;
1232 padding: 0;
1232 padding: 0;
1233 }
1233 }
1234
1234
1235 #content div.box div.message {
1235 #content div.box div.message {
1236 clear: both;
1236 clear: both;
1237 overflow: hidden;
1237 overflow: hidden;
1238 margin: 0;
1238 margin: 0;
1239 padding: 5px 0;
1239 padding: 5px 0;
1240 white-space: pre-wrap;
1240 white-space: pre-wrap;
1241 }
1241 }
1242 #content div.box div.expand {
1242 #content div.box div.expand {
1243 width: 110%;
1243 width: 110%;
1244 height: 14px;
1244 height: 14px;
1245 font-size: 10px;
1245 font-size: 10px;
1246 text-align: center;
1246 text-align: center;
1247 cursor: pointer;
1247 cursor: pointer;
1248 color: #666;
1248 color: #666;
1249
1249
1250 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1250 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1251 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1251 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1252 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1252 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1253 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1253 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1254 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1254 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1255 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1255 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1256
1256
1257 display: none;
1257 display: none;
1258 }
1258 }
1259 #content div.box div.expand .expandtext {
1259 #content div.box div.expand .expandtext {
1260 background-color: #ffffff;
1260 background-color: #ffffff;
1261 padding: 2px;
1261 padding: 2px;
1262 border-radius: 2px;
1262 border-radius: 2px;
1263 }
1263 }
1264
1264
1265 #content div.box div.message a {
1265 #content div.box div.message a {
1266 font-weight: 400 !important;
1266 font-weight: 400 !important;
1267 }
1267 }
1268
1268
1269 #content div.box div.message div.image {
1269 #content div.box div.message div.image {
1270 float: left;
1270 float: left;
1271 margin: 9px 0 0 5px;
1271 margin: 9px 0 0 5px;
1272 padding: 6px;
1272 padding: 6px;
1273 }
1273 }
1274
1274
1275 #content div.box div.message div.image img {
1275 #content div.box div.message div.image img {
1276 vertical-align: middle;
1276 vertical-align: middle;
1277 margin: 0;
1277 margin: 0;
1278 }
1278 }
1279
1279
1280 #content div.box div.message div.text {
1280 #content div.box div.message div.text {
1281 float: left;
1281 float: left;
1282 margin: 0;
1282 margin: 0;
1283 padding: 9px 6px;
1283 padding: 9px 6px;
1284 }
1284 }
1285
1285
1286 #content div.box div.message div.dismiss a {
1286 #content div.box div.message div.dismiss a {
1287 height: 16px;
1287 height: 16px;
1288 width: 16px;
1288 width: 16px;
1289 display: block;
1289 display: block;
1290 background: url("../images/icons/cross.png") no-repeat;
1290 background: url("../images/icons/cross.png") no-repeat;
1291 margin: 15px 14px 0 0;
1291 margin: 15px 14px 0 0;
1292 padding: 0;
1292 padding: 0;
1293 }
1293 }
1294
1294
1295 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1295 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1296 border: none;
1296 border: none;
1297 margin: 0;
1297 margin: 0;
1298 padding: 0;
1298 padding: 0;
1299 }
1299 }
1300
1300
1301 #content div.box div.message div.text span {
1301 #content div.box div.message div.text span {
1302 height: 1%;
1302 height: 1%;
1303 display: block;
1303 display: block;
1304 margin: 0;
1304 margin: 0;
1305 padding: 5px 0 0;
1305 padding: 5px 0 0;
1306 }
1306 }
1307
1307
1308 #content div.box div.message-error {
1308 #content div.box div.message-error {
1309 height: 1%;
1309 height: 1%;
1310 clear: both;
1310 clear: both;
1311 overflow: hidden;
1311 overflow: hidden;
1312 background: #FBE3E4;
1312 background: #FBE3E4;
1313 border: 1px solid #FBC2C4;
1313 border: 1px solid #FBC2C4;
1314 color: #860006;
1314 color: #860006;
1315 }
1315 }
1316
1316
1317 #content div.box div.message-error h6 {
1317 #content div.box div.message-error h6 {
1318 color: #860006;
1318 color: #860006;
1319 }
1319 }
1320
1320
1321 #content div.box div.message-warning {
1321 #content div.box div.message-warning {
1322 height: 1%;
1322 height: 1%;
1323 clear: both;
1323 clear: both;
1324 overflow: hidden;
1324 overflow: hidden;
1325 background: #FFF6BF;
1325 background: #FFF6BF;
1326 border: 1px solid #FFD324;
1326 border: 1px solid #FFD324;
1327 color: #5f5200;
1327 color: #5f5200;
1328 }
1328 }
1329
1329
1330 #content div.box div.message-warning h6 {
1330 #content div.box div.message-warning h6 {
1331 color: #5f5200;
1331 color: #5f5200;
1332 }
1332 }
1333
1333
1334 #content div.box div.message-notice {
1334 #content div.box div.message-notice {
1335 height: 1%;
1335 height: 1%;
1336 clear: both;
1336 clear: both;
1337 overflow: hidden;
1337 overflow: hidden;
1338 background: #8FBDE0;
1338 background: #8FBDE0;
1339 border: 1px solid #6BACDE;
1339 border: 1px solid #6BACDE;
1340 color: #003863;
1340 color: #003863;
1341 }
1341 }
1342
1342
1343 #content div.box div.message-notice h6 {
1343 #content div.box div.message-notice h6 {
1344 color: #003863;
1344 color: #003863;
1345 }
1345 }
1346
1346
1347 #content div.box div.message-success {
1347 #content div.box div.message-success {
1348 height: 1%;
1348 height: 1%;
1349 clear: both;
1349 clear: both;
1350 overflow: hidden;
1350 overflow: hidden;
1351 background: #E6EFC2;
1351 background: #E6EFC2;
1352 border: 1px solid #C6D880;
1352 border: 1px solid #C6D880;
1353 color: #4e6100;
1353 color: #4e6100;
1354 }
1354 }
1355
1355
1356 #content div.box div.message-success h6 {
1356 #content div.box div.message-success h6 {
1357 color: #4e6100;
1357 color: #4e6100;
1358 }
1358 }
1359
1359
1360 #content div.box div.form div.fields div.field {
1360 #content div.box div.form div.fields div.field {
1361 height: 1%;
1361 height: 1%;
1362 min-height: 12px;
1362 min-height: 12px;
1363 border-bottom: 1px solid #DDD;
1363 border-bottom: 1px solid #DDD;
1364 clear: both;
1364 clear: both;
1365 margin: 0;
1365 margin: 0;
1366 padding: 10px 0;
1366 padding: 10px 0;
1367 }
1367 }
1368
1368
1369 #content div.box div.form div.fields div.field-first {
1369 #content div.box div.form div.fields div.field-first {
1370 padding: 0 0 10px;
1370 padding: 0 0 10px;
1371 }
1371 }
1372
1372
1373 #content div.box div.form div.fields div.field-noborder {
1373 #content div.box div.form div.fields div.field-noborder {
1374 border-bottom: 0 !important;
1374 border-bottom: 0 !important;
1375 }
1375 }
1376
1376
1377 #content div.box div.form div.fields div.field span.error-message {
1377 #content div.box div.form div.fields div.field span.error-message {
1378 height: 1%;
1378 height: 1%;
1379 display: inline-block;
1379 display: inline-block;
1380 color: red;
1380 color: red;
1381 margin: 8px 0 0 4px;
1381 margin: 8px 0 0 4px;
1382 padding: 0;
1382 padding: 0;
1383 }
1383 }
1384
1384
1385 #content div.box div.form div.fields div.field span.success {
1385 #content div.box div.form div.fields div.field span.success {
1386 height: 1%;
1386 height: 1%;
1387 display: block;
1387 display: block;
1388 color: #316309;
1388 color: #316309;
1389 margin: 8px 0 0;
1389 margin: 8px 0 0;
1390 padding: 0;
1390 padding: 0;
1391 }
1391 }
1392
1392
1393 #content div.box div.form div.fields div.field div.label {
1393 #content div.box div.form div.fields div.field div.label {
1394 left: 70px;
1394 left: 70px;
1395 width: 155px;
1395 width: 155px;
1396 position: absolute;
1396 position: absolute;
1397 margin: 0;
1397 margin: 0;
1398 padding: 5px 0 0 0px;
1398 padding: 5px 0 0 0px;
1399 }
1399 }
1400
1400
1401 #content div.box div.form div.fields div.field div.label-summary {
1401 #content div.box div.form div.fields div.field div.label-summary {
1402 left: 30px;
1402 left: 30px;
1403 width: 155px;
1403 width: 155px;
1404 position: absolute;
1404 position: absolute;
1405 margin: 0;
1405 margin: 0;
1406 padding: 0px 0 0 0px;
1406 padding: 0px 0 0 0px;
1407 }
1407 }
1408
1408
1409 #content div.box-left div.form div.fields div.field div.label,
1409 #content div.box-left div.form div.fields div.field div.label,
1410 #content div.box-right div.form div.fields div.field div.label,
1410 #content div.box-right div.form div.fields div.field div.label,
1411 #content div.box-left div.form div.fields div.field div.label,
1411 #content div.box-left div.form div.fields div.field div.label,
1412 #content div.box-left div.form div.fields div.field div.label-summary,
1412 #content div.box-left div.form div.fields div.field div.label-summary,
1413 #content div.box-right div.form div.fields div.field div.label-summary,
1413 #content div.box-right div.form div.fields div.field div.label-summary,
1414 #content div.box-left div.form div.fields div.field div.label-summary {
1414 #content div.box-left div.form div.fields div.field div.label-summary {
1415 clear: both;
1415 clear: both;
1416 overflow: hidden;
1416 overflow: hidden;
1417 left: 0;
1417 left: 0;
1418 width: auto;
1418 width: auto;
1419 position: relative;
1419 position: relative;
1420 margin: 0;
1420 margin: 0;
1421 padding: 0 0 8px;
1421 padding: 0 0 8px;
1422 }
1422 }
1423
1423
1424 #content div.box div.form div.fields div.field div.label-select {
1424 #content div.box div.form div.fields div.field div.label-select {
1425 padding: 5px 0 0 5px;
1425 padding: 5px 0 0 5px;
1426 }
1426 }
1427
1427
1428 #content div.box-left div.form div.fields div.field div.label-select,
1428 #content div.box-left div.form div.fields div.field div.label-select,
1429 #content div.box-right div.form div.fields div.field div.label-select {
1429 #content div.box-right div.form div.fields div.field div.label-select {
1430 padding: 0 0 8px;
1430 padding: 0 0 8px;
1431 }
1431 }
1432
1432
1433 #content div.box-left div.form div.fields div.field div.label-textarea,
1433 #content div.box-left div.form div.fields div.field div.label-textarea,
1434 #content div.box-right div.form div.fields div.field div.label-textarea {
1434 #content div.box-right div.form div.fields div.field div.label-textarea {
1435 padding: 0 0 8px !important;
1435 padding: 0 0 8px !important;
1436 }
1436 }
1437
1437
1438 #content div.box div.form div.fields div.field div.label label, div.label label {
1438 #content div.box div.form div.fields div.field div.label label, div.label label {
1439 color: #393939;
1439 color: #393939;
1440 font-weight: 700;
1440 font-weight: 700;
1441 }
1441 }
1442 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1442 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1443 color: #393939;
1443 color: #393939;
1444 font-weight: 700;
1444 font-weight: 700;
1445 }
1445 }
1446 #content div.box div.form div.fields div.field div.input {
1446 #content div.box div.form div.fields div.field div.input {
1447 margin: 0 0 0 200px;
1447 margin: 0 0 0 200px;
1448 }
1448 }
1449
1449
1450 #content div.box div.form div.fields div.field div.input.summary {
1450 #content div.box div.form div.fields div.field div.input.summary {
1451 margin: 0 0 0 110px;
1451 margin: 0 0 0 110px;
1452 }
1452 }
1453 #content div.box div.form div.fields div.field div.input.summary-short {
1453 #content div.box div.form div.fields div.field div.input.summary-short {
1454 margin: 0 0 0 110px;
1454 margin: 0 0 0 110px;
1455 }
1455 }
1456 #content div.box div.form div.fields div.field div.file {
1456 #content div.box div.form div.fields div.field div.file {
1457 margin: 0 0 0 200px;
1457 margin: 0 0 0 200px;
1458 }
1458 }
1459
1459
1460 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1460 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1461 margin: 0 0 0 0px;
1461 margin: 0 0 0 0px;
1462 }
1462 }
1463
1463
1464 #content div.box div.form div.fields div.field div.input input,
1464 #content div.box div.form div.fields div.field div.input input,
1465 .reviewer_ac input {
1465 .reviewer_ac input {
1466 background: #FFF;
1466 background: #FFF;
1467 border-top: 1px solid #b3b3b3;
1467 border-top: 1px solid #b3b3b3;
1468 border-left: 1px solid #b3b3b3;
1468 border-left: 1px solid #b3b3b3;
1469 border-right: 1px solid #eaeaea;
1469 border-right: 1px solid #eaeaea;
1470 border-bottom: 1px solid #eaeaea;
1470 border-bottom: 1px solid #eaeaea;
1471 color: #000;
1471 color: #000;
1472 font-size: 11px;
1472 font-size: 11px;
1473 margin: 0;
1473 margin: 0;
1474 padding: 7px 7px 6px;
1474 padding: 7px 7px 6px;
1475 }
1475 }
1476
1476
1477 #content div.box div.form div.fields div.field div.input input#clone_url,
1477 #content div.box div.form div.fields div.field div.input input#clone_url,
1478 #content div.box div.form div.fields div.field div.input input#clone_url_id
1478 #content div.box div.form div.fields div.field div.input input#clone_url_id
1479 {
1479 {
1480 font-size: 16px;
1480 font-size: 16px;
1481 padding: 2px;
1481 padding: 2px;
1482 }
1482 }
1483
1483
1484 #content div.box div.form div.fields div.field div.file input {
1484 #content div.box div.form div.fields div.field div.file input {
1485 background: none repeat scroll 0 0 #FFFFFF;
1485 background: none repeat scroll 0 0 #FFFFFF;
1486 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1486 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1487 border-style: solid;
1487 border-style: solid;
1488 border-width: 1px;
1488 border-width: 1px;
1489 color: #000000;
1489 color: #000000;
1490 font-size: 11px;
1490 font-size: 11px;
1491 margin: 0;
1491 margin: 0;
1492 padding: 7px 7px 6px;
1492 padding: 7px 7px 6px;
1493 }
1493 }
1494
1494
1495 input.disabled {
1495 input.disabled {
1496 background-color: #F5F5F5 !important;
1496 background-color: #F5F5F5 !important;
1497 }
1497 }
1498 #content div.box div.form div.fields div.field div.input input.small {
1498 #content div.box div.form div.fields div.field div.input input.small {
1499 width: 30%;
1499 width: 30%;
1500 }
1500 }
1501
1501
1502 #content div.box div.form div.fields div.field div.input input.medium {
1502 #content div.box div.form div.fields div.field div.input input.medium {
1503 width: 55%;
1503 width: 55%;
1504 }
1504 }
1505
1505
1506 #content div.box div.form div.fields div.field div.input input.large {
1506 #content div.box div.form div.fields div.field div.input input.large {
1507 width: 85%;
1507 width: 85%;
1508 }
1508 }
1509
1509
1510 #content div.box div.form div.fields div.field div.input input.date {
1510 #content div.box div.form div.fields div.field div.input input.date {
1511 width: 177px;
1511 width: 177px;
1512 }
1512 }
1513
1513
1514 #content div.box div.form div.fields div.field div.input input.button {
1514 #content div.box div.form div.fields div.field div.input input.button {
1515 background: #D4D0C8;
1515 background: #D4D0C8;
1516 border-top: 1px solid #FFF;
1516 border-top: 1px solid #FFF;
1517 border-left: 1px solid #FFF;
1517 border-left: 1px solid #FFF;
1518 border-right: 1px solid #404040;
1518 border-right: 1px solid #404040;
1519 border-bottom: 1px solid #404040;
1519 border-bottom: 1px solid #404040;
1520 color: #000;
1520 color: #000;
1521 margin: 0;
1521 margin: 0;
1522 padding: 4px 8px;
1522 padding: 4px 8px;
1523 }
1523 }
1524
1524
1525 #content div.box div.form div.fields div.field div.textarea {
1525 #content div.box div.form div.fields div.field div.textarea {
1526 border-top: 1px solid #b3b3b3;
1526 border-top: 1px solid #b3b3b3;
1527 border-left: 1px solid #b3b3b3;
1527 border-left: 1px solid #b3b3b3;
1528 border-right: 1px solid #eaeaea;
1528 border-right: 1px solid #eaeaea;
1529 border-bottom: 1px solid #eaeaea;
1529 border-bottom: 1px solid #eaeaea;
1530 margin: 0 0 0 200px;
1530 margin: 0 0 0 200px;
1531 padding: 10px;
1531 padding: 10px;
1532 }
1532 }
1533
1533
1534 #content div.box div.form div.fields div.field div.textarea-editor {
1534 #content div.box div.form div.fields div.field div.textarea-editor {
1535 border: 1px solid #ddd;
1535 border: 1px solid #ddd;
1536 padding: 0;
1536 padding: 0;
1537 }
1537 }
1538
1538
1539 #content div.box div.form div.fields div.field div.textarea textarea {
1539 #content div.box div.form div.fields div.field div.textarea textarea {
1540 width: 100%;
1540 width: 100%;
1541 height: 220px;
1541 height: 220px;
1542 overflow: hidden;
1542 overflow: hidden;
1543 background: #FFF;
1543 background: #FFF;
1544 color: #000;
1544 color: #000;
1545 font-size: 11px;
1545 font-size: 11px;
1546 outline: none;
1546 outline: none;
1547 border-width: 0;
1547 border-width: 0;
1548 margin: 0;
1548 margin: 0;
1549 padding: 0;
1549 padding: 0;
1550 }
1550 }
1551
1551
1552 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1552 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1553 width: 100%;
1553 width: 100%;
1554 height: 100px;
1554 height: 100px;
1555 }
1555 }
1556
1556
1557 #content div.box div.form div.fields div.field div.textarea table {
1557 #content div.box div.form div.fields div.field div.textarea table {
1558 width: 100%;
1558 width: 100%;
1559 border: none;
1559 border: none;
1560 margin: 0;
1560 margin: 0;
1561 padding: 0;
1561 padding: 0;
1562 }
1562 }
1563
1563
1564 #content div.box div.form div.fields div.field div.textarea table td {
1564 #content div.box div.form div.fields div.field div.textarea table td {
1565 background: #DDD;
1565 background: #DDD;
1566 border: none;
1566 border: none;
1567 padding: 0;
1567 padding: 0;
1568 }
1568 }
1569
1569
1570 #content div.box div.form div.fields div.field div.textarea table td table {
1570 #content div.box div.form div.fields div.field div.textarea table td table {
1571 width: auto;
1571 width: auto;
1572 border: none;
1572 border: none;
1573 margin: 0;
1573 margin: 0;
1574 padding: 0;
1574 padding: 0;
1575 }
1575 }
1576
1576
1577 #content div.box div.form div.fields div.field div.textarea table td table td {
1577 #content div.box div.form div.fields div.field div.textarea table td table td {
1578 font-size: 11px;
1578 font-size: 11px;
1579 padding: 5px 5px 5px 0;
1579 padding: 5px 5px 5px 0;
1580 }
1580 }
1581
1581
1582 #content div.box div.form div.fields div.field input[type=text]:focus,
1582 #content div.box div.form div.fields div.field input[type=text]:focus,
1583 #content div.box div.form div.fields div.field input[type=password]:focus,
1583 #content div.box div.form div.fields div.field input[type=password]:focus,
1584 #content div.box div.form div.fields div.field input[type=file]:focus,
1584 #content div.box div.form div.fields div.field input[type=file]:focus,
1585 #content div.box div.form div.fields div.field textarea:focus,
1585 #content div.box div.form div.fields div.field textarea:focus,
1586 #content div.box div.form div.fields div.field select:focus,
1586 #content div.box div.form div.fields div.field select:focus,
1587 .reviewer_ac input:focus {
1587 .reviewer_ac input:focus {
1588 background: #f6f6f6;
1588 background: #f6f6f6;
1589 border-color: #666;
1589 border-color: #666;
1590 }
1590 }
1591
1591
1592 .reviewer_ac {
1592 .reviewer_ac {
1593 padding: 10px
1593 padding: 10px
1594 }
1594 }
1595
1595
1596 div.form div.fields div.field div.button {
1596 div.form div.fields div.field div.button {
1597 margin: 0;
1597 margin: 0;
1598 padding: 0 0 0 8px;
1598 padding: 0 0 0 8px;
1599 }
1599 }
1600 #content div.box table.noborder {
1600 #content div.box table.noborder {
1601 border: 1px solid transparent;
1601 border: 1px solid transparent;
1602 }
1602 }
1603
1603
1604 #content div.box table {
1604 #content div.box table {
1605 width: 100%;
1605 width: 100%;
1606 border-collapse: separate;
1606 border-collapse: separate;
1607 margin: 0;
1607 margin: 0;
1608 padding: 0;
1608 padding: 0;
1609 border: 1px solid #eee;
1609 border: 1px solid #eee;
1610 -webkit-border-radius: 4px;
1610 -webkit-border-radius: 4px;
1611 border-radius: 4px;
1611 border-radius: 4px;
1612 }
1612 }
1613
1613
1614 #content div.box table th {
1614 #content div.box table th {
1615 background: #eee;
1615 background: #eee;
1616 border-bottom: 1px solid #ddd;
1616 border-bottom: 1px solid #ddd;
1617 padding: 5px 0px 5px 5px;
1617 padding: 5px 0px 5px 5px;
1618 text-align: left;
1618 text-align: left;
1619 }
1619 }
1620
1620
1621 #content div.box table th.left {
1621 #content div.box table th.left {
1622 text-align: left;
1622 text-align: left;
1623 }
1623 }
1624
1624
1625 #content div.box table th.right {
1625 #content div.box table th.right {
1626 text-align: right;
1626 text-align: right;
1627 }
1627 }
1628
1628
1629 #content div.box table th.center {
1629 #content div.box table th.center {
1630 text-align: center;
1630 text-align: center;
1631 }
1631 }
1632
1632
1633 #content div.box table th.selected {
1633 #content div.box table th.selected {
1634 vertical-align: middle;
1634 vertical-align: middle;
1635 padding: 0;
1635 padding: 0;
1636 }
1636 }
1637
1637
1638 #content div.box table td {
1638 #content div.box table td {
1639 background: #fff;
1639 background: #fff;
1640 border-bottom: 1px solid #cdcdcd;
1640 border-bottom: 1px solid #cdcdcd;
1641 vertical-align: middle;
1641 vertical-align: middle;
1642 padding: 5px;
1642 padding: 5px;
1643 }
1643 }
1644
1644
1645 #content div.box table tr.selected td {
1645 #content div.box table tr.selected td {
1646 background: #FFC;
1646 background: #FFC;
1647 }
1647 }
1648
1648
1649 #content div.box table td.selected {
1649 #content div.box table td.selected {
1650 width: 3%;
1650 width: 3%;
1651 text-align: center;
1651 text-align: center;
1652 vertical-align: middle;
1652 vertical-align: middle;
1653 padding: 0;
1653 padding: 0;
1654 }
1654 }
1655
1655
1656 #content div.box table td.action {
1656 #content div.box table td.action {
1657 width: 45%;
1657 width: 45%;
1658 text-align: left;
1658 text-align: left;
1659 }
1659 }
1660
1660
1661 #content div.box table td.date {
1661 #content div.box table td.date {
1662 width: 33%;
1662 width: 33%;
1663 text-align: center;
1663 text-align: center;
1664 }
1664 }
1665
1665
1666 #content div.box div.action {
1666 #content div.box div.action {
1667 float: right;
1667 float: right;
1668 background: #FFF;
1668 background: #FFF;
1669 text-align: right;
1669 text-align: right;
1670 margin: 10px 0 0;
1670 margin: 10px 0 0;
1671 padding: 0;
1671 padding: 0;
1672 }
1672 }
1673
1673
1674 #content div.box div.action select {
1674 #content div.box div.action select {
1675 font-size: 11px;
1675 font-size: 11px;
1676 margin: 0;
1676 margin: 0;
1677 }
1677 }
1678
1678
1679 #content div.box div.action .ui-selectmenu {
1679 #content div.box div.action .ui-selectmenu {
1680 margin: 0;
1680 margin: 0;
1681 padding: 0;
1681 padding: 0;
1682 }
1682 }
1683
1683
1684 #content div.box div.pagination {
1684 #content div.box div.pagination {
1685 height: 1%;
1685 height: 1%;
1686 clear: both;
1686 clear: both;
1687 overflow: hidden;
1687 overflow: hidden;
1688 margin: 10px 0 0;
1688 margin: 10px 0 0;
1689 padding: 0;
1689 padding: 0;
1690 }
1690 }
1691
1691
1692 #content div.box div.pagination ul.pager {
1692 #content div.box div.pagination ul.pager {
1693 float: right;
1693 float: right;
1694 text-align: right;
1694 text-align: right;
1695 margin: 0;
1695 margin: 0;
1696 padding: 0;
1696 padding: 0;
1697 }
1697 }
1698
1698
1699 #content div.box div.pagination ul.pager li {
1699 #content div.box div.pagination ul.pager li {
1700 height: 1%;
1700 height: 1%;
1701 float: left;
1701 float: left;
1702 list-style: none;
1702 list-style: none;
1703 background: #ebebeb url("../images/pager.png") repeat-x;
1703 background: #ebebeb url("../images/pager.png") repeat-x;
1704 border-top: 1px solid #dedede;
1704 border-top: 1px solid #dedede;
1705 border-left: 1px solid #cfcfcf;
1705 border-left: 1px solid #cfcfcf;
1706 border-right: 1px solid #c4c4c4;
1706 border-right: 1px solid #c4c4c4;
1707 border-bottom: 1px solid #c4c4c4;
1707 border-bottom: 1px solid #c4c4c4;
1708 color: #4A4A4A;
1708 color: #4A4A4A;
1709 font-weight: 700;
1709 font-weight: 700;
1710 margin: 0 0 0 4px;
1710 margin: 0 0 0 4px;
1711 padding: 0;
1711 padding: 0;
1712 }
1712 }
1713
1713
1714 #content div.box div.pagination ul.pager li.separator {
1714 #content div.box div.pagination ul.pager li.separator {
1715 padding: 6px;
1715 padding: 6px;
1716 }
1716 }
1717
1717
1718 #content div.box div.pagination ul.pager li.current {
1718 #content div.box div.pagination ul.pager li.current {
1719 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1719 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1720 border-top: 1px solid #ccc;
1720 border-top: 1px solid #ccc;
1721 border-left: 1px solid #bebebe;
1721 border-left: 1px solid #bebebe;
1722 border-right: 1px solid #b1b1b1;
1722 border-right: 1px solid #b1b1b1;
1723 border-bottom: 1px solid #afafaf;
1723 border-bottom: 1px solid #afafaf;
1724 color: #515151;
1724 color: #515151;
1725 padding: 6px;
1725 padding: 6px;
1726 }
1726 }
1727
1727
1728 #content div.box div.pagination ul.pager li a {
1728 #content div.box div.pagination ul.pager li a {
1729 height: 1%;
1729 height: 1%;
1730 display: block;
1730 display: block;
1731 float: left;
1731 float: left;
1732 color: #515151;
1732 color: #515151;
1733 text-decoration: none;
1733 text-decoration: none;
1734 margin: 0;
1734 margin: 0;
1735 padding: 6px;
1735 padding: 6px;
1736 }
1736 }
1737
1737
1738 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1738 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1739 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1739 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1740 border-top: 1px solid #ccc;
1740 border-top: 1px solid #ccc;
1741 border-left: 1px solid #bebebe;
1741 border-left: 1px solid #bebebe;
1742 border-right: 1px solid #b1b1b1;
1742 border-right: 1px solid #b1b1b1;
1743 border-bottom: 1px solid #afafaf;
1743 border-bottom: 1px solid #afafaf;
1744 margin: -1px;
1744 margin: -1px;
1745 }
1745 }
1746
1746
1747 #content div.box div.pagination-wh {
1747 #content div.box div.pagination-wh {
1748 height: 1%;
1748 height: 1%;
1749 clear: both;
1749 clear: both;
1750 overflow: hidden;
1750 overflow: hidden;
1751 text-align: right;
1751 text-align: right;
1752 margin: 10px 0 0;
1752 margin: 10px 0 0;
1753 padding: 0;
1753 padding: 0;
1754 }
1754 }
1755
1755
1756 #content div.box div.pagination-right {
1756 #content div.box div.pagination-right {
1757 float: right;
1757 float: right;
1758 }
1758 }
1759
1759
1760 #content div.box div.pagination-wh a,
1760 #content div.box div.pagination-wh a,
1761 #content div.box div.pagination-wh span.pager_dotdot,
1761 #content div.box div.pagination-wh span.pager_dotdot,
1762 #content div.box div.pagination-wh span.yui-pg-previous,
1762 #content div.box div.pagination-wh span.yui-pg-previous,
1763 #content div.box div.pagination-wh span.yui-pg-last,
1763 #content div.box div.pagination-wh span.yui-pg-last,
1764 #content div.box div.pagination-wh span.yui-pg-next,
1764 #content div.box div.pagination-wh span.yui-pg-next,
1765 #content div.box div.pagination-wh span.yui-pg-first {
1765 #content div.box div.pagination-wh span.yui-pg-first {
1766 height: 1%;
1766 height: 1%;
1767 float: left;
1767 float: left;
1768 background: #ebebeb url("../images/pager.png") repeat-x;
1768 background: #ebebeb url("../images/pager.png") repeat-x;
1769 border-top: 1px solid #dedede;
1769 border-top: 1px solid #dedede;
1770 border-left: 1px solid #cfcfcf;
1770 border-left: 1px solid #cfcfcf;
1771 border-right: 1px solid #c4c4c4;
1771 border-right: 1px solid #c4c4c4;
1772 border-bottom: 1px solid #c4c4c4;
1772 border-bottom: 1px solid #c4c4c4;
1773 color: #4A4A4A;
1773 color: #4A4A4A;
1774 font-weight: 700;
1774 font-weight: 700;
1775 margin: 0 0 0 4px;
1775 margin: 0 0 0 4px;
1776 padding: 6px;
1776 padding: 6px;
1777 }
1777 }
1778
1778
1779 #content div.box div.pagination-wh span.pager_curpage {
1779 #content div.box div.pagination-wh span.pager_curpage {
1780 height: 1%;
1780 height: 1%;
1781 float: left;
1781 float: left;
1782 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1782 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1783 border-top: 1px solid #ccc;
1783 border-top: 1px solid #ccc;
1784 border-left: 1px solid #bebebe;
1784 border-left: 1px solid #bebebe;
1785 border-right: 1px solid #b1b1b1;
1785 border-right: 1px solid #b1b1b1;
1786 border-bottom: 1px solid #afafaf;
1786 border-bottom: 1px solid #afafaf;
1787 color: #515151;
1787 color: #515151;
1788 font-weight: 700;
1788 font-weight: 700;
1789 margin: 0 0 0 4px;
1789 margin: 0 0 0 4px;
1790 padding: 6px;
1790 padding: 6px;
1791 }
1791 }
1792
1792
1793 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1793 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1794 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1794 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1795 border-top: 1px solid #ccc;
1795 border-top: 1px solid #ccc;
1796 border-left: 1px solid #bebebe;
1796 border-left: 1px solid #bebebe;
1797 border-right: 1px solid #b1b1b1;
1797 border-right: 1px solid #b1b1b1;
1798 border-bottom: 1px solid #afafaf;
1798 border-bottom: 1px solid #afafaf;
1799 text-decoration: none;
1799 text-decoration: none;
1800 }
1800 }
1801
1801
1802 #content div.box div.traffic div.legend {
1802 #content div.box div.traffic div.legend {
1803 clear: both;
1803 clear: both;
1804 overflow: hidden;
1804 overflow: hidden;
1805 border-bottom: 1px solid #ddd;
1805 border-bottom: 1px solid #ddd;
1806 margin: 0 0 10px;
1806 margin: 0 0 10px;
1807 padding: 0 0 10px;
1807 padding: 0 0 10px;
1808 }
1808 }
1809
1809
1810 #content div.box div.traffic div.legend h6 {
1810 #content div.box div.traffic div.legend h6 {
1811 float: left;
1811 float: left;
1812 border: none;
1812 border: none;
1813 margin: 0;
1813 margin: 0;
1814 padding: 0;
1814 padding: 0;
1815 }
1815 }
1816
1816
1817 #content div.box div.traffic div.legend li {
1817 #content div.box div.traffic div.legend li {
1818 list-style: none;
1818 list-style: none;
1819 float: left;
1819 float: left;
1820 font-size: 11px;
1820 font-size: 11px;
1821 margin: 0;
1821 margin: 0;
1822 padding: 0 8px 0 4px;
1822 padding: 0 8px 0 4px;
1823 }
1823 }
1824
1824
1825 #content div.box div.traffic div.legend li.visits {
1825 #content div.box div.traffic div.legend li.visits {
1826 border-left: 12px solid #edc240;
1826 border-left: 12px solid #edc240;
1827 }
1827 }
1828
1828
1829 #content div.box div.traffic div.legend li.pageviews {
1829 #content div.box div.traffic div.legend li.pageviews {
1830 border-left: 12px solid #afd8f8;
1830 border-left: 12px solid #afd8f8;
1831 }
1831 }
1832
1832
1833 #content div.box div.traffic table {
1833 #content div.box div.traffic table {
1834 width: auto;
1834 width: auto;
1835 }
1835 }
1836
1836
1837 #content div.box div.traffic table td {
1837 #content div.box div.traffic table td {
1838 background: transparent;
1838 background: transparent;
1839 border: none;
1839 border: none;
1840 padding: 2px 3px 3px;
1840 padding: 2px 3px 3px;
1841 }
1841 }
1842
1842
1843 #content div.box div.traffic table td.legendLabel {
1843 #content div.box div.traffic table td.legendLabel {
1844 padding: 0 3px 2px;
1844 padding: 0 3px 2px;
1845 }
1845 }
1846
1846
1847 #summary {
1847 #summary {
1848 }
1848 }
1849
1849
1850 #summary .metatag {
1850 #summary .metatag {
1851 display: inline-block;
1851 display: inline-block;
1852 padding: 3px 5px;
1852 padding: 3px 5px;
1853 margin-bottom: 3px;
1853 margin-bottom: 3px;
1854 margin-right: 1px;
1854 margin-right: 1px;
1855 border-radius: 5px;
1855 border-radius: 5px;
1856 }
1856 }
1857
1857
1858 #content div.box #summary p {
1858 #content div.box #summary p {
1859 margin-bottom: -5px;
1859 margin-bottom: -5px;
1860 width: 600px;
1860 width: 600px;
1861 white-space: pre-wrap;
1861 white-space: pre-wrap;
1862 }
1862 }
1863
1863
1864 #content div.box #summary p:last-child {
1864 #content div.box #summary p:last-child {
1865 margin-bottom: 9px;
1865 margin-bottom: 9px;
1866 }
1866 }
1867
1867
1868 #content div.box #summary p:first-of-type {
1868 #content div.box #summary p:first-of-type {
1869 margin-top: 9px;
1869 margin-top: 9px;
1870 }
1870 }
1871
1871
1872 .metatag {
1872 .metatag {
1873 display: inline-block;
1873 display: inline-block;
1874 margin-right: 1px;
1874 margin-right: 1px;
1875 -webkit-border-radius: 4px 4px 4px 4px;
1875 -webkit-border-radius: 4px 4px 4px 4px;
1876 -khtml-border-radius: 4px 4px 4px 4px;
1876 -khtml-border-radius: 4px 4px 4px 4px;
1877 border-radius: 4px 4px 4px 4px;
1877 border-radius: 4px 4px 4px 4px;
1878
1878
1879 border: solid 1px #9CF;
1879 border: solid 1px #9CF;
1880 padding: 2px 3px 2px 3px !important;
1880 padding: 2px 3px 2px 3px !important;
1881 background-color: #DEF;
1881 background-color: #DEF;
1882 }
1882 }
1883
1883
1884 .metatag[tag="dead"] {
1884 .metatag[tag="dead"] {
1885 background-color: #E44;
1885 background-color: #E44;
1886 }
1886 }
1887
1887
1888 .metatag[tag="stale"] {
1888 .metatag[tag="stale"] {
1889 background-color: #EA4;
1889 background-color: #EA4;
1890 }
1890 }
1891
1891
1892 .metatag[tag="featured"] {
1892 .metatag[tag="featured"] {
1893 background-color: #AEA;
1893 background-color: #AEA;
1894 }
1894 }
1895
1895
1896 .metatag[tag="requires"] {
1896 .metatag[tag="requires"] {
1897 background-color: #9CF;
1897 background-color: #9CF;
1898 }
1898 }
1899
1899
1900 .metatag[tag="recommends"] {
1900 .metatag[tag="recommends"] {
1901 background-color: #BDF;
1901 background-color: #BDF;
1902 }
1902 }
1903
1903
1904 .metatag[tag="lang"] {
1904 .metatag[tag="lang"] {
1905 background-color: #FAF474;
1905 background-color: #FAF474;
1906 }
1906 }
1907
1907
1908 .metatag[tag="license"] {
1908 .metatag[tag="license"] {
1909 border: solid 1px #9CF;
1909 border: solid 1px #9CF;
1910 background-color: #DEF;
1910 background-color: #DEF;
1911 target-new: tab !important;
1911 target-new: tab !important;
1912 }
1912 }
1913 .metatag[tag="see"] {
1913 .metatag[tag="see"] {
1914 border: solid 1px #CBD;
1914 border: solid 1px #CBD;
1915 background-color: #EDF;
1915 background-color: #EDF;
1916 }
1916 }
1917
1917
1918 a.metatag[tag="license"]:hover {
1918 a.metatag[tag="license"]:hover {
1919 background-color: #003367;
1919 background-color: #003367;
1920 color: #FFF;
1920 color: #FFF;
1921 text-decoration: none;
1921 text-decoration: none;
1922 }
1922 }
1923
1923
1924 #summary .desc {
1924 #summary .desc {
1925 white-space: pre;
1925 white-space: pre;
1926 width: 100%;
1926 width: 100%;
1927 }
1927 }
1928
1928
1929 #summary .repo_name {
1929 #summary .repo_name {
1930 font-size: 1.6em;
1930 font-size: 1.6em;
1931 font-weight: bold;
1931 font-weight: bold;
1932 vertical-align: baseline;
1932 vertical-align: baseline;
1933 clear: right
1933 clear: right
1934 }
1934 }
1935
1935
1936 #footer {
1936 #footer {
1937 clear: both;
1937 clear: both;
1938 overflow: hidden;
1938 overflow: hidden;
1939 text-align: right;
1939 text-align: right;
1940 margin: 0;
1940 margin: 0;
1941 padding: 0 10px 4px;
1941 padding: 0 10px 4px;
1942 margin: -10px 0 0;
1942 margin: -10px 0 0;
1943 }
1943 }
1944
1944
1945 #footer div#footer-inner {
1945 #footer div#footer-inner {
1946 background-color: #003B76;
1946 background-color: #003B76;
1947 background-repeat: repeat-x;
1947 background-repeat: repeat-x;
1948 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1948 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1949 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1949 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1950 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1950 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1951 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1951 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1952 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1952 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1953 background-image: -o-linear-gradient( top, #003b76, #00376e));
1953 background-image: -o-linear-gradient( top, #003b76, #00376e));
1954 background-image: linear-gradient(to bottom, #003b76, #00376e);
1954 background-image: linear-gradient(to bottom, #003b76, #00376e);
1955 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1955 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1956 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1956 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1957 -webkit-border-radius: 4px 4px 4px 4px;
1957 -webkit-border-radius: 4px 4px 4px 4px;
1958 -khtml-border-radius: 4px 4px 4px 4px;
1958 -khtml-border-radius: 4px 4px 4px 4px;
1959 border-radius: 4px 4px 4px 4px;
1959 border-radius: 4px 4px 4px 4px;
1960 }
1960 }
1961
1961
1962 #footer div#footer-inner p {
1962 #footer div#footer-inner p {
1963 padding: 15px 25px 15px 0;
1963 padding: 15px 25px 15px 0;
1964 color: #FFF;
1964 color: #FFF;
1965 font-weight: 700;
1965 font-weight: 700;
1966 }
1966 }
1967
1967
1968 #footer div#footer-inner .footer-link {
1968 #footer div#footer-inner .footer-link {
1969 float: left;
1969 float: left;
1970 padding-left: 10px;
1970 padding-left: 10px;
1971 }
1971 }
1972
1972
1973 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1973 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1974 color: #FFF;
1974 color: #FFF;
1975 }
1975 }
1976
1976
1977 #login div.title {
1977 #login div.title {
1978 clear: both;
1978 clear: both;
1979 overflow: hidden;
1979 overflow: hidden;
1980 position: relative;
1980 position: relative;
1981 background-color: #003B76;
1981 background-color: #003B76;
1982 background-repeat: repeat-x;
1982 background-repeat: repeat-x;
1983 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1983 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1984 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1984 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1985 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1985 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1986 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1986 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1987 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1987 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1988 background-image: -o-linear-gradient( top, #003b76, #00376e));
1988 background-image: -o-linear-gradient( top, #003b76, #00376e));
1989 background-image: linear-gradient(to bottom, #003b76, #00376e);
1989 background-image: linear-gradient(to bottom, #003b76, #00376e);
1990 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1990 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1991 margin: 0 auto;
1991 margin: 0 auto;
1992 padding: 0;
1992 padding: 0;
1993 }
1993 }
1994
1994
1995 #login div.inner {
1995 #login div.inner {
1996 background: #FFF url("../images/login.png") no-repeat top left;
1996 background: #FFF url("../images/login.png") no-repeat top left;
1997 border-top: none;
1997 border-top: none;
1998 border-bottom: none;
1998 border-bottom: none;
1999 margin: 0 auto;
1999 margin: 0 auto;
2000 padding: 20px;
2000 padding: 20px;
2001 }
2001 }
2002
2002
2003 #login div.form div.fields div.field div.label {
2003 #login div.form div.fields div.field div.label {
2004 width: 173px;
2004 width: 173px;
2005 float: left;
2005 float: left;
2006 text-align: right;
2006 text-align: right;
2007 margin: 2px 10px 0 0;
2007 margin: 2px 10px 0 0;
2008 padding: 5px 0 0 5px;
2008 padding: 5px 0 0 5px;
2009 }
2009 }
2010
2010
2011 #login div.form div.fields div.field div.input input {
2011 #login div.form div.fields div.field div.input input {
2012 background: #FFF;
2012 background: #FFF;
2013 border-top: 1px solid #b3b3b3;
2013 border-top: 1px solid #b3b3b3;
2014 border-left: 1px solid #b3b3b3;
2014 border-left: 1px solid #b3b3b3;
2015 border-right: 1px solid #eaeaea;
2015 border-right: 1px solid #eaeaea;
2016 border-bottom: 1px solid #eaeaea;
2016 border-bottom: 1px solid #eaeaea;
2017 color: #000;
2017 color: #000;
2018 font-size: 11px;
2018 font-size: 11px;
2019 margin: 0;
2019 margin: 0;
2020 padding: 7px 7px 6px;
2020 padding: 7px 7px 6px;
2021 }
2021 }
2022
2022
2023 #login div.form div.fields div.buttons {
2023 #login div.form div.fields div.buttons {
2024 clear: both;
2024 clear: both;
2025 overflow: hidden;
2025 overflow: hidden;
2026 border-top: 1px solid #DDD;
2026 border-top: 1px solid #DDD;
2027 text-align: right;
2027 text-align: right;
2028 margin: 0;
2028 margin: 0;
2029 padding: 10px 0 0;
2029 padding: 10px 0 0;
2030 }
2030 }
2031
2031
2032 #login div.form div.links {
2032 #login div.form div.links {
2033 clear: both;
2033 clear: both;
2034 overflow: hidden;
2034 overflow: hidden;
2035 margin: 10px 0 0;
2035 margin: 10px 0 0;
2036 padding: 0 0 2px;
2036 padding: 0 0 2px;
2037 }
2037 }
2038
2038
2039 .user-menu {
2039 .user-menu {
2040 margin: 0px !important;
2040 margin: 0px !important;
2041 float: left;
2041 float: left;
2042 }
2042 }
2043
2043
2044 .user-menu .container {
2044 .user-menu .container {
2045 padding: 0px 4px 0px 4px;
2045 padding: 0px 4px 0px 4px;
2046 margin: 0px 0px 0px 0px;
2046 margin: 0px 0px 0px 0px;
2047 }
2047 }
2048
2048
2049 .user-menu .gravatar {
2049 .user-menu .gravatar {
2050 margin: 0px 0px 0px 0px;
2050 margin: 0px 0px 0px 0px;
2051 cursor: pointer;
2051 cursor: pointer;
2052 }
2052 }
2053 .user-menu .gravatar.enabled {
2053 .user-menu .gravatar.enabled {
2054 background-color: #FDF784 !important;
2054 background-color: #FDF784 !important;
2055 }
2055 }
2056 .user-menu .gravatar:hover {
2056 .user-menu .gravatar:hover {
2057 background-color: #FDF784 !important;
2057 background-color: #FDF784 !important;
2058 }
2058 }
2059 #quick_login {
2059 #quick_login {
2060 min-height: 80px;
2060 min-height: 80px;
2061 padding: 4px;
2061 padding: 4px;
2062 position: absolute;
2062 position: absolute;
2063 right: 0;
2063 right: 0;
2064 width: 278px;
2064 width: 278px;
2065 background-color: #003B76;
2065 background-color: #003B76;
2066 background-repeat: repeat-x;
2066 background-repeat: repeat-x;
2067 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2067 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2068 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2068 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2069 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2069 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2070 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2070 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2071 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2071 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2072 background-image: -o-linear-gradient(top, #003b76, #00376e);
2072 background-image: -o-linear-gradient(top, #003b76, #00376e);
2073 background-image: linear-gradient(to bottom, #003b76, #00376e);
2073 background-image: linear-gradient(to bottom, #003b76, #00376e);
2074 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
2074 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
2075
2075
2076 z-index: 999;
2076 z-index: 999;
2077 -webkit-border-radius: 0px 0px 4px 4px;
2077 -webkit-border-radius: 0px 0px 4px 4px;
2078 -khtml-border-radius: 0px 0px 4px 4px;
2078 -khtml-border-radius: 0px 0px 4px 4px;
2079 border-radius: 0px 0px 4px 4px;
2079 border-radius: 0px 0px 4px 4px;
2080 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2080 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2081 }
2081 }
2082 #quick_login h4 {
2082 #quick_login h4 {
2083 color: #fff;
2083 color: #fff;
2084 padding: 5px 0px 5px 14px;
2084 padding: 5px 0px 5px 14px;
2085 }
2085 }
2086
2086
2087 #quick_login .password_forgoten {
2087 #quick_login .password_forgoten {
2088 padding-right: 10px;
2088 padding-right: 10px;
2089 padding-top: 0px;
2089 padding-top: 0px;
2090 text-align: left;
2090 text-align: left;
2091 }
2091 }
2092
2092
2093 #quick_login .password_forgoten a {
2093 #quick_login .password_forgoten a {
2094 font-size: 10px;
2094 font-size: 10px;
2095 color: #fff;
2095 color: #fff;
2096 }
2096 }
2097
2097
2098 #quick_login .register {
2098 #quick_login .register {
2099 padding-right: 10px;
2099 padding-right: 10px;
2100 padding-top: 5px;
2100 padding-top: 5px;
2101 text-align: left;
2101 text-align: left;
2102 }
2102 }
2103
2103
2104 #quick_login .register a {
2104 #quick_login .register a {
2105 font-size: 10px;
2105 font-size: 10px;
2106 color: #fff;
2106 color: #fff;
2107 }
2107 }
2108
2108
2109 #quick_login .submit {
2109 #quick_login .submit {
2110 margin: -20px 0 0 0px;
2110 margin: -20px 0 0 0px;
2111 position: absolute;
2111 position: absolute;
2112 right: 15px;
2112 right: 15px;
2113 }
2113 }
2114
2114
2115 #quick_login .links_left {
2115 #quick_login .links_left {
2116 float: left;
2116 float: left;
2117 }
2117 }
2118 #quick_login .links_right {
2118 #quick_login .links_right {
2119 float: right;
2119 float: right;
2120 }
2120 }
2121 #quick_login .full_name {
2121 #quick_login .full_name {
2122 color: #FFFFFF;
2122 color: #FFFFFF;
2123 font-weight: bold;
2123 font-weight: bold;
2124 padding: 3px 3px 3px 6px;
2124 padding: 3px 3px 3px 6px;
2125 }
2125 }
2126 #quick_login .big_gravatar {
2126 #quick_login .big_gravatar {
2127 padding: 4px 0px 0px 6px;
2127 padding: 4px 0px 0px 6px;
2128 }
2128 }
2129 #quick_login .notifications {
2129 #quick_login .notifications {
2130 padding: 4px 0px 0px 6px;
2130 padding: 4px 0px 0px 6px;
2131 color: #FFFFFF;
2131 color: #FFFFFF;
2132 font-weight: bold;
2132 font-weight: bold;
2133 }
2133 }
2134 #quick_login .notifications a,
2134 #quick_login .notifications a,
2135 #quick_login .unread a {
2135 #quick_login .unread a {
2136 color: #FFFFFF;
2136 color: #FFFFFF;
2137 display: block;
2137 display: block;
2138 padding: 2px;
2138 padding: 2px;
2139 }
2139 }
2140 #quick_login .notifications a:hover,
2140 #quick_login .notifications a:hover,
2141 #quick_login .unread a:hover {
2141 #quick_login .unread a:hover {
2142 background-color: inherit !important;
2142 background-color: inherit !important;
2143 }
2143 }
2144 #quick_login .email, #quick_login .unread {
2144 #quick_login .email, #quick_login .unread {
2145 color: #FFFFFF;
2145 color: #FFFFFF;
2146 padding: 3px 3px 3px 6px;
2146 padding: 3px 3px 3px 6px;
2147 }
2147 }
2148 #quick_login .links .logout {
2148 #quick_login .links .logout {
2149 }
2149 }
2150
2150
2151 #quick_login div.form div.fields {
2151 #quick_login div.form div.fields {
2152 padding-top: 2px;
2152 padding-top: 2px;
2153 padding-left: 10px;
2153 padding-left: 10px;
2154 }
2154 }
2155
2155
2156 #quick_login div.form div.fields div.field {
2156 #quick_login div.form div.fields div.field {
2157 padding: 5px;
2157 padding: 5px;
2158 }
2158 }
2159
2159
2160 #quick_login div.form div.fields div.field div.label label {
2160 #quick_login div.form div.fields div.field div.label label {
2161 color: #fff;
2161 color: #fff;
2162 padding-bottom: 3px;
2162 padding-bottom: 3px;
2163 }
2163 }
2164
2164
2165 #quick_login div.form div.fields div.field div.input input {
2165 #quick_login div.form div.fields div.field div.input input {
2166 width: 236px;
2166 width: 236px;
2167 background: #FFF;
2167 background: #FFF;
2168 border-top: 1px solid #b3b3b3;
2168 border-top: 1px solid #b3b3b3;
2169 border-left: 1px solid #b3b3b3;
2169 border-left: 1px solid #b3b3b3;
2170 border-right: 1px solid #eaeaea;
2170 border-right: 1px solid #eaeaea;
2171 border-bottom: 1px solid #eaeaea;
2171 border-bottom: 1px solid #eaeaea;
2172 color: #000;
2172 color: #000;
2173 font-size: 11px;
2173 font-size: 11px;
2174 margin: 0;
2174 margin: 0;
2175 padding: 5px 7px 4px;
2175 padding: 5px 7px 4px;
2176 }
2176 }
2177
2177
2178 #quick_login div.form div.fields div.buttons {
2178 #quick_login div.form div.fields div.buttons {
2179 clear: both;
2179 clear: both;
2180 overflow: hidden;
2180 overflow: hidden;
2181 text-align: right;
2181 text-align: right;
2182 margin: 0;
2182 margin: 0;
2183 padding: 5px 14px 0px 5px;
2183 padding: 5px 14px 0px 5px;
2184 }
2184 }
2185
2185
2186 #quick_login div.form div.links {
2186 #quick_login div.form div.links {
2187 clear: both;
2187 clear: both;
2188 overflow: hidden;
2188 overflow: hidden;
2189 margin: 10px 0 0;
2189 margin: 10px 0 0;
2190 padding: 0 0 2px;
2190 padding: 0 0 2px;
2191 }
2191 }
2192
2192
2193 #quick_login ol.links {
2193 #quick_login ol.links {
2194 display: block;
2194 display: block;
2195 font-weight: bold;
2195 font-weight: bold;
2196 list-style: none outside none;
2196 list-style: none outside none;
2197 text-align: right;
2197 text-align: right;
2198 }
2198 }
2199 #quick_login ol.links li {
2199 #quick_login ol.links li {
2200 line-height: 27px;
2200 line-height: 27px;
2201 margin: 0;
2201 margin: 0;
2202 padding: 0;
2202 padding: 0;
2203 color: #fff;
2203 color: #fff;
2204 display: block;
2204 display: block;
2205 float: none !important;
2205 float: none !important;
2206 }
2206 }
2207
2207
2208 #quick_login ol.links li a {
2208 #quick_login ol.links li a {
2209 color: #fff;
2209 color: #fff;
2210 display: block;
2210 display: block;
2211 padding: 2px;
2211 padding: 2px;
2212 }
2212 }
2213 #quick_login ol.links li a:HOVER {
2213 #quick_login ol.links li a:HOVER {
2214 background-color: inherit !important;
2214 background-color: inherit !important;
2215 }
2215 }
2216
2216
2217 #register div.title {
2217 #register div.title {
2218 clear: both;
2218 clear: both;
2219 overflow: hidden;
2219 overflow: hidden;
2220 position: relative;
2220 position: relative;
2221 background-color: #003B76;
2221 background-color: #003B76;
2222 background-repeat: repeat-x;
2222 background-repeat: repeat-x;
2223 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2223 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2224 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2224 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2225 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2225 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2226 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2226 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2227 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2227 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2228 background-image: -o-linear-gradient(top, #003b76, #00376e);
2228 background-image: -o-linear-gradient(top, #003b76, #00376e);
2229 background-image: linear-gradient(to bottom, #003b76, #00376e);
2229 background-image: linear-gradient(to bottom, #003b76, #00376e);
2230 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2230 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2231 endColorstr='#00376e', GradientType=0 );
2231 endColorstr='#00376e', GradientType=0 );
2232 margin: 0 auto;
2232 margin: 0 auto;
2233 padding: 0;
2233 padding: 0;
2234 }
2234 }
2235
2235
2236 #register div.inner {
2236 #register div.inner {
2237 background: #FFF;
2237 background: #FFF;
2238 border-top: none;
2238 border-top: none;
2239 border-bottom: none;
2239 border-bottom: none;
2240 margin: 0 auto;
2240 margin: 0 auto;
2241 padding: 20px;
2241 padding: 20px;
2242 }
2242 }
2243
2243
2244 #register div.form div.fields div.field div.label {
2244 #register div.form div.fields div.field div.label {
2245 width: 135px;
2245 width: 135px;
2246 float: left;
2246 float: left;
2247 text-align: right;
2247 text-align: right;
2248 margin: 2px 10px 0 0;
2248 margin: 2px 10px 0 0;
2249 padding: 5px 0 0 5px;
2249 padding: 5px 0 0 5px;
2250 }
2250 }
2251
2251
2252 #register div.form div.fields div.field div.input input {
2252 #register div.form div.fields div.field div.input input {
2253 width: 300px;
2253 width: 300px;
2254 background: #FFF;
2254 background: #FFF;
2255 border-top: 1px solid #b3b3b3;
2255 border-top: 1px solid #b3b3b3;
2256 border-left: 1px solid #b3b3b3;
2256 border-left: 1px solid #b3b3b3;
2257 border-right: 1px solid #eaeaea;
2257 border-right: 1px solid #eaeaea;
2258 border-bottom: 1px solid #eaeaea;
2258 border-bottom: 1px solid #eaeaea;
2259 color: #000;
2259 color: #000;
2260 font-size: 11px;
2260 font-size: 11px;
2261 margin: 0;
2261 margin: 0;
2262 padding: 7px 7px 6px;
2262 padding: 7px 7px 6px;
2263 }
2263 }
2264
2264
2265 #register div.form div.fields div.buttons {
2265 #register div.form div.fields div.buttons {
2266 clear: both;
2266 clear: both;
2267 overflow: hidden;
2267 overflow: hidden;
2268 border-top: 1px solid #DDD;
2268 border-top: 1px solid #DDD;
2269 text-align: left;
2269 text-align: left;
2270 margin: 0;
2270 margin: 0;
2271 padding: 10px 0 0 150px;
2271 padding: 10px 0 0 150px;
2272 }
2272 }
2273
2273
2274 #register div.form div.activation_msg {
2274 #register div.form div.activation_msg {
2275 padding-top: 4px;
2275 padding-top: 4px;
2276 padding-bottom: 4px;
2276 padding-bottom: 4px;
2277 }
2277 }
2278
2278
2279 #journal .journal_day {
2279 #journal .journal_day {
2280 font-size: 20px;
2280 font-size: 20px;
2281 padding: 10px 0px;
2281 padding: 10px 0px;
2282 border-bottom: 2px solid #DDD;
2282 border-bottom: 2px solid #DDD;
2283 margin-left: 10px;
2283 margin-left: 10px;
2284 margin-right: 10px;
2284 margin-right: 10px;
2285 }
2285 }
2286
2286
2287 #journal .journal_container {
2287 #journal .journal_container {
2288 padding: 5px;
2288 padding: 5px;
2289 clear: both;
2289 clear: both;
2290 margin: 0px 5px 0px 10px;
2290 margin: 0px 5px 0px 10px;
2291 }
2291 }
2292
2292
2293 #journal .journal_action_container {
2293 #journal .journal_action_container {
2294 padding-left: 38px;
2294 padding-left: 38px;
2295 }
2295 }
2296
2296
2297 #journal .journal_user {
2297 #journal .journal_user {
2298 color: #747474;
2298 color: #747474;
2299 font-size: 14px;
2299 font-size: 14px;
2300 font-weight: bold;
2300 font-weight: bold;
2301 height: 30px;
2301 height: 30px;
2302 }
2302 }
2303
2303
2304 #journal .journal_user.deleted {
2304 #journal .journal_user.deleted {
2305 color: #747474;
2305 color: #747474;
2306 font-size: 14px;
2306 font-size: 14px;
2307 font-weight: normal;
2307 font-weight: normal;
2308 height: 30px;
2308 height: 30px;
2309 font-style: italic;
2309 font-style: italic;
2310 }
2310 }
2311
2311
2312
2312
2313 #journal .journal_icon {
2313 #journal .journal_icon {
2314 clear: both;
2314 clear: both;
2315 float: left;
2315 float: left;
2316 padding-right: 4px;
2316 padding-right: 4px;
2317 padding-top: 3px;
2317 padding-top: 3px;
2318 }
2318 }
2319
2319
2320 #journal .journal_action {
2320 #journal .journal_action {
2321 padding-top: 4px;
2321 padding-top: 4px;
2322 min-height: 2px;
2322 min-height: 2px;
2323 float: left
2323 float: left
2324 }
2324 }
2325
2325
2326 #journal .journal_action_params {
2326 #journal .journal_action_params {
2327 clear: left;
2327 clear: left;
2328 padding-left: 22px;
2328 padding-left: 22px;
2329 }
2329 }
2330
2330
2331 #journal .journal_repo {
2331 #journal .journal_repo {
2332 float: left;
2332 float: left;
2333 margin-left: 6px;
2333 margin-left: 6px;
2334 padding-top: 3px;
2334 padding-top: 3px;
2335 }
2335 }
2336
2336
2337 #journal .date {
2337 #journal .date {
2338 clear: both;
2338 clear: both;
2339 color: #777777;
2339 color: #777777;
2340 font-size: 11px;
2340 font-size: 11px;
2341 padding-left: 22px;
2341 padding-left: 22px;
2342 }
2342 }
2343
2343
2344 #journal .journal_repo .journal_repo_name {
2344 #journal .journal_repo .journal_repo_name {
2345 font-weight: bold;
2345 font-weight: bold;
2346 font-size: 1.1em;
2346 font-size: 1.1em;
2347 }
2347 }
2348
2348
2349 #journal .compare_view {
2349 #journal .compare_view {
2350 padding: 5px 0px 5px 0px;
2350 padding: 5px 0px 5px 0px;
2351 width: 95px;
2351 width: 95px;
2352 }
2352 }
2353
2353
2354 .journal_highlight {
2354 .journal_highlight {
2355 font-weight: bold;
2355 font-weight: bold;
2356 padding: 0 2px;
2356 padding: 0 2px;
2357 vertical-align: bottom;
2357 vertical-align: bottom;
2358 }
2358 }
2359
2359
2360 .trending_language_tbl, .trending_language_tbl td {
2360 .trending_language_tbl, .trending_language_tbl td {
2361 border: 0 !important;
2361 border: 0 !important;
2362 margin: 0 !important;
2362 margin: 0 !important;
2363 padding: 0 !important;
2363 padding: 0 !important;
2364 }
2364 }
2365
2365
2366 .trending_language_tbl, .trending_language_tbl tr {
2366 .trending_language_tbl, .trending_language_tbl tr {
2367 border-spacing: 1px;
2367 border-spacing: 1px;
2368 }
2368 }
2369
2369
2370 .trending_language {
2370 .trending_language {
2371 background-color: #003367;
2371 background-color: #003367;
2372 color: #FFF;
2372 color: #FFF;
2373 display: block;
2373 display: block;
2374 min-width: 20px;
2374 min-width: 20px;
2375 text-decoration: none;
2375 text-decoration: none;
2376 height: 12px;
2376 height: 12px;
2377 margin-bottom: 0px;
2377 margin-bottom: 0px;
2378 margin-left: 5px;
2378 margin-left: 5px;
2379 white-space: pre;
2379 white-space: pre;
2380 padding: 3px;
2380 padding: 3px;
2381 }
2381 }
2382
2382
2383 h3.files_location {
2383 h3.files_location {
2384 font-size: 1.8em;
2384 font-size: 1.8em;
2385 font-weight: 700;
2385 font-weight: 700;
2386 border-bottom: none !important;
2386 border-bottom: none !important;
2387 margin: 10px 0 !important;
2387 margin: 10px 0 !important;
2388 }
2388 }
2389
2389
2390 #files_data dl dt {
2390 #files_data dl dt {
2391 float: left;
2391 float: left;
2392 width: 60px;
2392 width: 60px;
2393 margin: 0 !important;
2393 margin: 0 !important;
2394 padding: 5px;
2394 padding: 5px;
2395 }
2395 }
2396
2396
2397 #files_data dl dd {
2397 #files_data dl dd {
2398 margin: 0 !important;
2398 margin: 0 !important;
2399 padding: 5px !important;
2399 padding: 5px !important;
2400 }
2400 }
2401
2401
2402 .file_history {
2402 .file_history {
2403 padding-top: 10px;
2403 padding-top: 10px;
2404 font-size: 16px;
2404 font-size: 16px;
2405 }
2405 }
2406 .file_author {
2406 .file_author {
2407 float: left;
2407 float: left;
2408 }
2408 }
2409
2409
2410 .file_author .item {
2410 .file_author .item {
2411 float: left;
2411 float: left;
2412 padding: 5px;
2412 padding: 5px;
2413 color: #888;
2413 color: #888;
2414 }
2414 }
2415
2415
2416 .tablerow0 {
2416 .tablerow0 {
2417 background-color: #F8F8F8;
2417 background-color: #F8F8F8;
2418 }
2418 }
2419
2419
2420 .tablerow1 {
2420 .tablerow1 {
2421 background-color: #FFFFFF;
2421 background-color: #FFFFFF;
2422 }
2422 }
2423
2423
2424 .changeset_id {
2424 .changeset_id {
2425 font-family: monospace;
2425 font-family: monospace;
2426 color: #666666;
2426 color: #666666;
2427 }
2427 }
2428
2428
2429 .changeset_hash {
2429 .changeset_hash {
2430 color: #000000;
2430 color: #000000;
2431 }
2431 }
2432
2432
2433 #changeset_content {
2433 #changeset_content {
2434 border-left: 1px solid #CCC;
2434 border-left: 1px solid #CCC;
2435 border-right: 1px solid #CCC;
2435 border-right: 1px solid #CCC;
2436 border-bottom: 1px solid #CCC;
2436 border-bottom: 1px solid #CCC;
2437 padding: 5px;
2437 padding: 5px;
2438 }
2438 }
2439
2439
2440 #changeset_compare_view_content {
2440 #changeset_compare_view_content {
2441 border: 1px solid #CCC;
2441 border: 1px solid #CCC;
2442 padding: 5px;
2442 padding: 5px;
2443 }
2443 }
2444
2444
2445 #changeset_content .container {
2445 #changeset_content .container {
2446 min-height: 100px;
2446 min-height: 100px;
2447 font-size: 1.2em;
2447 font-size: 1.2em;
2448 overflow: hidden;
2448 overflow: hidden;
2449 }
2449 }
2450
2450
2451 #changeset_compare_view_content .compare_view_commits {
2451 #changeset_compare_view_content .compare_view_commits {
2452 width: auto !important;
2452 width: auto !important;
2453 }
2453 }
2454
2454
2455 #changeset_compare_view_content .compare_view_commits td {
2455 #changeset_compare_view_content .compare_view_commits td {
2456 padding: 0px 0px 0px 12px !important;
2456 padding: 0px 0px 0px 12px !important;
2457 }
2457 }
2458
2458
2459 #changeset_content .container .right {
2459 #changeset_content .container .right {
2460 float: right;
2460 float: right;
2461 width: 20%;
2461 width: 20%;
2462 text-align: right;
2462 text-align: right;
2463 }
2463 }
2464
2464
2465 #changeset_content .container .left .message {
2465 #changeset_content .container .left .message {
2466 white-space: pre-wrap;
2466 white-space: pre-wrap;
2467 }
2467 }
2468 #changeset_content .container .left .message a:hover {
2468 #changeset_content .container .left .message a:hover {
2469 text-decoration: none;
2469 text-decoration: none;
2470 }
2470 }
2471 .cs_files .cur_cs {
2471 .cs_files .cur_cs {
2472 margin: 10px 2px;
2472 margin: 10px 2px;
2473 font-weight: bold;
2473 font-weight: bold;
2474 }
2474 }
2475
2475
2476 .cs_files .node {
2476 .cs_files .node {
2477 float: left;
2477 float: left;
2478 }
2478 }
2479
2479
2480 .cs_files .changes {
2480 .cs_files .changes {
2481 float: right;
2481 float: right;
2482 color: #003367;
2482 color: #003367;
2483 }
2483 }
2484
2484
2485 .cs_files .changes .added {
2485 .cs_files .changes .added {
2486 background-color: #BBFFBB;
2486 background-color: #BBFFBB;
2487 float: left;
2487 float: left;
2488 text-align: center;
2488 text-align: center;
2489 font-size: 9px;
2489 font-size: 9px;
2490 padding: 2px 0px 2px 0px;
2490 padding: 2px 0px 2px 0px;
2491 }
2491 }
2492
2492
2493 .cs_files .changes .deleted {
2493 .cs_files .changes .deleted {
2494 background-color: #FF8888;
2494 background-color: #FF8888;
2495 float: left;
2495 float: left;
2496 text-align: center;
2496 text-align: center;
2497 font-size: 9px;
2497 font-size: 9px;
2498 padding: 2px 0px 2px 0px;
2498 padding: 2px 0px 2px 0px;
2499 }
2499 }
2500 /*new binary*/
2500 /*new binary*/
2501 .cs_files .changes .bin1 {
2501 .cs_files .changes .bin1 {
2502 background-color: #BBFFBB;
2502 background-color: #BBFFBB;
2503 float: left;
2503 float: left;
2504 text-align: center;
2504 text-align: center;
2505 font-size: 9px;
2505 font-size: 9px;
2506 padding: 2px 0px 2px 0px;
2506 padding: 2px 0px 2px 0px;
2507 }
2507 }
2508
2508
2509 /*deleted binary*/
2509 /*deleted binary*/
2510 .cs_files .changes .bin2 {
2510 .cs_files .changes .bin2 {
2511 background-color: #FF8888;
2511 background-color: #FF8888;
2512 float: left;
2512 float: left;
2513 text-align: center;
2513 text-align: center;
2514 font-size: 9px;
2514 font-size: 9px;
2515 padding: 2px 0px 2px 0px;
2515 padding: 2px 0px 2px 0px;
2516 }
2516 }
2517
2517
2518 /*mod binary*/
2518 /*mod binary*/
2519 .cs_files .changes .bin3 {
2519 .cs_files .changes .bin3 {
2520 background-color: #DDDDDD;
2520 background-color: #DDDDDD;
2521 float: left;
2521 float: left;
2522 text-align: center;
2522 text-align: center;
2523 font-size: 9px;
2523 font-size: 9px;
2524 padding: 2px 0px 2px 0px;
2524 padding: 2px 0px 2px 0px;
2525 }
2525 }
2526
2526
2527 /*rename file*/
2527 /*rename file*/
2528 .cs_files .changes .bin4 {
2528 .cs_files .changes .bin4 {
2529 background-color: #6D99FF;
2529 background-color: #6D99FF;
2530 float: left;
2530 float: left;
2531 text-align: center;
2531 text-align: center;
2532 font-size: 9px;
2532 font-size: 9px;
2533 padding: 2px 0px 2px 0px;
2533 padding: 2px 0px 2px 0px;
2534 }
2534 }
2535
2535
2536
2536
2537 .cs_files .cs_added, .cs_files .cs_A {
2537 .cs_files .cs_added, .cs_files .cs_A {
2538 background: url("../images/icons/page_white_add.png") no-repeat scroll
2538 background: url("../images/icons/page_white_add.png") no-repeat scroll
2539 3px;
2539 3px;
2540 height: 16px;
2540 height: 16px;
2541 padding-left: 20px;
2541 padding-left: 20px;
2542 margin-top: 7px;
2542 margin-top: 7px;
2543 text-align: left;
2543 text-align: left;
2544 }
2544 }
2545
2545
2546 .cs_files .cs_changed, .cs_files .cs_M {
2546 .cs_files .cs_changed, .cs_files .cs_M {
2547 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2547 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2548 3px;
2548 3px;
2549 height: 16px;
2549 height: 16px;
2550 padding-left: 20px;
2550 padding-left: 20px;
2551 margin-top: 7px;
2551 margin-top: 7px;
2552 text-align: left;
2552 text-align: left;
2553 }
2553 }
2554
2554
2555 .cs_files .cs_removed, .cs_files .cs_D {
2555 .cs_files .cs_removed, .cs_files .cs_D {
2556 background: url("../images/icons/page_white_delete.png") no-repeat
2556 background: url("../images/icons/page_white_delete.png") no-repeat
2557 scroll 3px;
2557 scroll 3px;
2558 height: 16px;
2558 height: 16px;
2559 padding-left: 20px;
2559 padding-left: 20px;
2560 margin-top: 7px;
2560 margin-top: 7px;
2561 text-align: left;
2561 text-align: left;
2562 }
2562 }
2563
2563
2564 #graph {
2564 #graph {
2565 overflow: hidden;
2565 overflow: hidden;
2566 }
2566 }
2567
2567
2568 #graph_nodes {
2568 #graph_nodes {
2569 float: left;
2569 float: left;
2570 margin-right: 0px;
2570 margin-right: 0px;
2571 margin-top: 0px;
2571 margin-top: 0px;
2572 }
2572 }
2573
2573
2574 #graph_content {
2574 #graph_content {
2575 width: 80%;
2575 width: 80%;
2576 float: left;
2576 float: left;
2577 }
2577 }
2578
2578
2579 #graph_content .container_header {
2579 #graph_content .container_header {
2580 border-bottom: 1px solid #DDD;
2580 border-bottom: 1px solid #DDD;
2581 padding: 10px;
2581 padding: 10px;
2582 height: 25px;
2582 height: 25px;
2583 }
2583 }
2584
2584
2585 #graph_content #rev_range_container {
2585 #graph_content #rev_range_container {
2586 float: left;
2586 float: left;
2587 margin: 0px 0px 0px 3px;
2587 margin: 0px 0px 0px 3px;
2588 }
2588 }
2589
2589
2590 #graph_content #rev_range_clear {
2590 #graph_content #rev_range_clear {
2591 float: left;
2591 float: left;
2592 margin: 0px 0px 0px 3px;
2592 margin: 0px 0px 0px 3px;
2593 }
2593 }
2594
2594
2595 #graph_content .container {
2595 #graph_content .container {
2596 border-bottom: 1px solid #DDD;
2596 border-bottom: 1px solid #DDD;
2597 height: 56px;
2597 height: 56px;
2598 overflow: hidden;
2598 overflow: hidden;
2599 }
2599 }
2600
2600
2601 #graph_content .container .right {
2601 #graph_content .container .right {
2602 float: right;
2602 float: right;
2603 width: 23%;
2603 width: 23%;
2604 text-align: right;
2604 text-align: right;
2605 }
2605 }
2606
2606
2607 #graph_content .container .left {
2607 #graph_content .container .left {
2608 float: left;
2608 float: left;
2609 width: 25%;
2609 width: 25%;
2610 padding-left: 5px;
2610 padding-left: 5px;
2611 }
2611 }
2612
2612
2613 #graph_content .container .mid {
2613 #graph_content .container .mid {
2614 float: left;
2614 float: left;
2615 width: 49%;
2615 width: 49%;
2616 }
2616 }
2617
2617
2618
2618
2619 #graph_content .container .left .date {
2619 #graph_content .container .left .date {
2620 color: #666;
2620 color: #666;
2621 padding-left: 22px;
2621 padding-left: 22px;
2622 font-size: 10px;
2622 font-size: 10px;
2623 }
2623 }
2624
2624
2625 #graph_content .container .left .author {
2625 #graph_content .container .left .author {
2626 height: 22px;
2626 height: 22px;
2627 }
2627 }
2628
2628
2629 #graph_content .container .left .author .user {
2629 #graph_content .container .left .author .user {
2630 color: #444444;
2630 color: #444444;
2631 float: left;
2631 float: left;
2632 margin-left: -4px;
2632 margin-left: -4px;
2633 margin-top: 4px;
2633 margin-top: 4px;
2634 }
2634 }
2635
2635
2636 #graph_content .container .mid .message {
2636 #graph_content .container .mid .message {
2637 white-space: pre-wrap;
2637 white-space: pre-wrap;
2638 }
2638 }
2639
2639
2640 #graph_content .container .mid .message a:hover {
2640 #graph_content .container .mid .message a:hover {
2641 text-decoration: none;
2641 text-decoration: none;
2642 }
2642 }
2643
2643
2644 .revision-link {
2644 .revision-link {
2645 color: #3F6F9F;
2645 color: #3F6F9F;
2646 font-weight: bold !important;
2646 font-weight: bold !important;
2647 }
2647 }
2648
2648
2649 .issue-tracker-link {
2649 .issue-tracker-link {
2650 color: #3F6F9F;
2650 color: #3F6F9F;
2651 font-weight: bold !important;
2651 font-weight: bold !important;
2652 }
2652 }
2653
2653
2654 .changeset-status-container {
2654 .changeset-status-container {
2655 padding-right: 5px;
2655 padding-right: 5px;
2656 margin-top: 1px;
2656 margin-top: 1px;
2657 float: right;
2657 float: right;
2658 height: 14px;
2658 height: 14px;
2659 }
2659 }
2660 .code-header .changeset-status-container {
2660 .code-header .changeset-status-container {
2661 float: left;
2661 float: left;
2662 padding: 2px 0px 0px 2px;
2662 padding: 2px 0px 0px 2px;
2663 }
2663 }
2664 .changeset-status-container .changeset-status-lbl {
2664 .changeset-status-container .changeset-status-lbl {
2665 color: rgb(136, 136, 136);
2665 color: rgb(136, 136, 136);
2666 float: left;
2666 float: left;
2667 padding: 3px 4px 0px 0px
2667 padding: 3px 4px 0px 0px
2668 }
2668 }
2669 .code-header .changeset-status-container .changeset-status-lbl {
2669 .code-header .changeset-status-container .changeset-status-lbl {
2670 float: left;
2670 float: left;
2671 padding: 0px 4px 0px 0px;
2671 padding: 0px 4px 0px 0px;
2672 }
2672 }
2673 .changeset-status-container .changeset-status-ico {
2673 .changeset-status-container .changeset-status-ico {
2674 float: left;
2674 float: left;
2675 }
2675 }
2676 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2676 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2677 float: left;
2677 float: left;
2678 }
2678 }
2679 .right .comments-container {
2679 .right .comments-container {
2680 padding-right: 5px;
2680 padding-right: 5px;
2681 margin-top: 1px;
2681 margin-top: 1px;
2682 float: right;
2682 float: right;
2683 height: 14px;
2683 height: 14px;
2684 }
2684 }
2685
2685
2686 .right .comments-cnt {
2686 .right .comments-cnt {
2687 float: left;
2687 float: left;
2688 color: rgb(136, 136, 136);
2688 color: rgb(136, 136, 136);
2689 padding-right: 2px;
2689 padding-right: 2px;
2690 }
2690 }
2691
2691
2692 .right .changes {
2692 .right .changes {
2693 clear: both;
2693 clear: both;
2694 }
2694 }
2695
2695
2696 .right .changes .changed_total {
2696 .right .changes .changed_total {
2697 display: block;
2697 display: block;
2698 float: right;
2698 float: right;
2699 text-align: center;
2699 text-align: center;
2700 min-width: 45px;
2700 min-width: 45px;
2701 cursor: pointer;
2701 cursor: pointer;
2702 color: #444444;
2702 color: #444444;
2703 background: #FEA;
2703 background: #FEA;
2704 -webkit-border-radius: 0px 0px 0px 6px;
2704 -webkit-border-radius: 0px 0px 0px 6px;
2705 border-radius: 0px 0px 0px 6px;
2705 border-radius: 0px 0px 0px 6px;
2706 padding: 1px;
2706 padding: 1px;
2707 }
2707 }
2708
2708
2709 .right .changes .added, .changed, .removed {
2709 .right .changes .added, .changed, .removed {
2710 display: block;
2710 display: block;
2711 padding: 1px;
2711 padding: 1px;
2712 color: #444444;
2712 color: #444444;
2713 float: right;
2713 float: right;
2714 text-align: center;
2714 text-align: center;
2715 min-width: 15px;
2715 min-width: 15px;
2716 }
2716 }
2717
2717
2718 .right .changes .added {
2718 .right .changes .added {
2719 background: #CFC;
2719 background: #CFC;
2720 }
2720 }
2721
2721
2722 .right .changes .changed {
2722 .right .changes .changed {
2723 background: #FEA;
2723 background: #FEA;
2724 }
2724 }
2725
2725
2726 .right .changes .removed {
2726 .right .changes .removed {
2727 background: #FAA;
2727 background: #FAA;
2728 }
2728 }
2729
2729
2730 .right .merge {
2730 .right .merge {
2731 padding: 1px 3px 1px 3px;
2731 padding: 1px 3px 1px 3px;
2732 background-color: #fca062;
2732 background-color: #fca062;
2733 font-size: 10px;
2733 font-size: 10px;
2734 font-weight: bold;
2734 font-weight: bold;
2735 color: #ffffff;
2735 color: #ffffff;
2736 text-transform: uppercase;
2736 text-transform: uppercase;
2737 white-space: nowrap;
2737 white-space: nowrap;
2738 -webkit-border-radius: 3px;
2738 -webkit-border-radius: 3px;
2739 border-radius: 3px;
2739 border-radius: 3px;
2740 margin-right: 2px;
2740 margin-right: 2px;
2741 }
2741 }
2742
2742
2743 .right .parent {
2743 .right .parent {
2744 color: #666666;
2744 color: #666666;
2745 clear: both;
2745 clear: both;
2746 }
2746 }
2747 .right .logtags {
2747 .right .logtags {
2748 padding: 2px 2px 2px 2px;
2748 padding: 2px 2px 2px 2px;
2749 }
2749 }
2750 .right .logtags .branchtag, .right .logtags .tagtag, .right .logtags .booktag {
2750 .right .logtags .branchtag, .right .logtags .tagtag, .right .logtags .booktag {
2751 margin: 0px 2px;
2751 margin: 0px 2px;
2752 }
2752 }
2753
2753
2754 .right .logtags .branchtag,
2754 .right .logtags .branchtag,
2755 .logtags .branchtag,
2755 .logtags .branchtag,
2756 .spantag {
2756 .spantag {
2757 padding: 1px 3px 1px 3px;
2757 padding: 1px 3px 1px 3px;
2758 background-color: #bfbfbf;
2758 background-color: #bfbfbf;
2759 font-size: 10px;
2759 font-size: 10px;
2760 font-weight: bold;
2760 font-weight: bold;
2761 color: #ffffff;
2761 color: #ffffff;
2762 white-space: nowrap;
2762 white-space: nowrap;
2763 -webkit-border-radius: 3px;
2763 -webkit-border-radius: 3px;
2764 border-radius: 3px;
2764 border-radius: 3px;
2765 }
2765 }
2766 .right .logtags .branchtag a:hover, .logtags .branchtag a {
2766 .right .logtags .branchtag a:hover, .logtags .branchtag a {
2767 color: #ffffff;
2767 color: #ffffff;
2768 }
2768 }
2769 .right .logtags .branchtag a:hover, .logtags .branchtag a:hover {
2769 .right .logtags .branchtag a:hover, .logtags .branchtag a:hover {
2770 text-decoration: none;
2770 text-decoration: none;
2771 color: #ffffff;
2771 color: #ffffff;
2772 }
2772 }
2773 .right .logtags .tagtag, .logtags .tagtag {
2773 .right .logtags .tagtag, .logtags .tagtag {
2774 padding: 1px 3px 1px 3px;
2774 padding: 1px 3px 1px 3px;
2775 background-color: #62cffc;
2775 background-color: #62cffc;
2776 font-size: 10px;
2776 font-size: 10px;
2777 font-weight: bold;
2777 font-weight: bold;
2778 color: #ffffff;
2778 color: #ffffff;
2779 white-space: nowrap;
2779 white-space: nowrap;
2780 -webkit-border-radius: 3px;
2780 -webkit-border-radius: 3px;
2781 border-radius: 3px;
2781 border-radius: 3px;
2782 }
2782 }
2783 .right .logtags .tagtag a:hover, .logtags .tagtag a {
2783 .right .logtags .tagtag a:hover, .logtags .tagtag a {
2784 color: #ffffff;
2784 color: #ffffff;
2785 }
2785 }
2786 .right .logtags .tagtag a:hover, .logtags .tagtag a:hover {
2786 .right .logtags .tagtag a:hover, .logtags .tagtag a:hover {
2787 text-decoration: none;
2787 text-decoration: none;
2788 color: #ffffff;
2788 color: #ffffff;
2789 }
2789 }
2790 .right .logbooks .bookbook, .logbooks .bookbook, .right .logtags .bookbook, .logtags .bookbook {
2790 .right .logbooks .bookbook, .logbooks .bookbook, .right .logtags .bookbook, .logtags .bookbook {
2791 padding: 1px 3px 1px 3px;
2791 padding: 1px 3px 1px 3px;
2792 background-color: #46A546;
2792 background-color: #46A546;
2793 font-size: 10px;
2793 font-size: 10px;
2794 font-weight: bold;
2794 font-weight: bold;
2795 color: #ffffff;
2795 color: #ffffff;
2796 text-transform: uppercase;
2796 text-transform: uppercase;
2797 white-space: nowrap;
2797 white-space: nowrap;
2798 -webkit-border-radius: 3px;
2798 -webkit-border-radius: 3px;
2799 border-radius: 3px;
2799 border-radius: 3px;
2800 }
2800 }
2801 .right .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2801 .right .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2802 color: #ffffff;
2802 color: #ffffff;
2803 }
2803 }
2804 .right .logbooks .bookbook, .logbooks .bookbook a:hover, .right .logtags .bookbook, .logtags .bookbook a:hover {
2804 .right .logbooks .bookbook, .logbooks .bookbook a:hover, .right .logtags .bookbook, .logtags .bookbook a:hover {
2805 text-decoration: none;
2805 text-decoration: none;
2806 color: #ffffff;
2806 color: #ffffff;
2807 }
2807 }
2808 div.browserblock {
2808 div.browserblock {
2809 overflow: hidden;
2809 overflow: hidden;
2810 border: 1px solid #ccc;
2810 border: 1px solid #ccc;
2811 background: #f8f8f8;
2811 background: #f8f8f8;
2812 font-size: 100%;
2812 font-size: 100%;
2813 line-height: 125%;
2813 line-height: 125%;
2814 padding: 0;
2814 padding: 0;
2815 -webkit-border-radius: 6px 6px 0px 0px;
2815 -webkit-border-radius: 6px 6px 0px 0px;
2816 border-radius: 6px 6px 0px 0px;
2816 border-radius: 6px 6px 0px 0px;
2817 }
2817 }
2818
2818
2819 div.browserblock .browser-header {
2819 div.browserblock .browser-header {
2820 background: #FFF;
2820 background: #FFF;
2821 padding: 10px 0px 15px 0px;
2821 padding: 10px 0px 15px 0px;
2822 width: 100%;
2822 width: 100%;
2823 }
2823 }
2824
2824
2825 div.browserblock .browser-nav {
2825 div.browserblock .browser-nav {
2826 float: left
2826 float: left
2827 }
2827 }
2828
2828
2829 div.browserblock .browser-branch {
2829 div.browserblock .browser-branch {
2830 float: left;
2830 float: left;
2831 }
2831 }
2832
2832
2833 div.browserblock .browser-branch label {
2833 div.browserblock .browser-branch label {
2834 color: #4A4A4A;
2834 color: #4A4A4A;
2835 vertical-align: text-top;
2835 vertical-align: text-top;
2836 }
2836 }
2837
2837
2838 div.browserblock .browser-header span {
2838 div.browserblock .browser-header span {
2839 margin-left: 5px;
2839 margin-left: 5px;
2840 font-weight: 700;
2840 font-weight: 700;
2841 }
2841 }
2842
2842
2843 div.browserblock .browser-search {
2843 div.browserblock .browser-search {
2844 clear: both;
2844 clear: both;
2845 padding: 8px 8px 0px 5px;
2845 padding: 8px 8px 0px 5px;
2846 height: 20px;
2846 height: 20px;
2847 }
2847 }
2848
2848
2849 div.browserblock #node_filter_box {
2849 div.browserblock #node_filter_box {
2850 }
2850 }
2851
2851
2852 div.browserblock .search_activate {
2852 div.browserblock .search_activate {
2853 float: left
2853 float: left
2854 }
2854 }
2855
2855
2856 div.browserblock .add_node {
2856 div.browserblock .add_node {
2857 float: left;
2857 float: left;
2858 padding-left: 5px;
2858 padding-left: 5px;
2859 }
2859 }
2860
2860
2861 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2861 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2862 text-decoration: none !important;
2862 text-decoration: none !important;
2863 }
2863 }
2864
2864
2865 div.browserblock .browser-body {
2865 div.browserblock .browser-body {
2866 background: #EEE;
2866 background: #EEE;
2867 border-top: 1px solid #CCC;
2867 border-top: 1px solid #CCC;
2868 }
2868 }
2869
2869
2870 table.code-browser {
2870 table.code-browser {
2871 border-collapse: collapse;
2871 border-collapse: collapse;
2872 width: 100%;
2872 width: 100%;
2873 }
2873 }
2874
2874
2875 table.code-browser tr {
2875 table.code-browser tr {
2876 margin: 3px;
2876 margin: 3px;
2877 }
2877 }
2878
2878
2879 table.code-browser thead th {
2879 table.code-browser thead th {
2880 background-color: #EEE;
2880 background-color: #EEE;
2881 height: 20px;
2881 height: 20px;
2882 font-size: 1.1em;
2882 font-size: 1.1em;
2883 font-weight: 700;
2883 font-weight: 700;
2884 text-align: left;
2884 text-align: left;
2885 padding-left: 10px;
2885 padding-left: 10px;
2886 }
2886 }
2887
2887
2888 table.code-browser tbody td {
2888 table.code-browser tbody td {
2889 padding-left: 10px;
2889 padding-left: 10px;
2890 height: 20px;
2890 height: 20px;
2891 }
2891 }
2892
2892
2893 table.code-browser .browser-file {
2893 table.code-browser .browser-file {
2894 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2894 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2895 height: 16px;
2895 height: 16px;
2896 padding-left: 20px;
2896 padding-left: 20px;
2897 text-align: left;
2897 text-align: left;
2898 }
2898 }
2899 .diffblock .changeset_header {
2899 .diffblock .changeset_header {
2900 height: 16px;
2900 height: 16px;
2901 }
2901 }
2902 .diffblock .changeset_file {
2902 .diffblock .changeset_file {
2903 background: url("../images/icons/file.png") no-repeat scroll 3px;
2903 background: url("../images/icons/file.png") no-repeat scroll 3px;
2904 text-align: left;
2904 text-align: left;
2905 float: left;
2905 float: left;
2906 padding: 2px 0px 2px 22px;
2906 padding: 2px 0px 2px 22px;
2907 }
2907 }
2908 .diffblock .diff-menu-wrapper {
2908 .diffblock .diff-menu-wrapper {
2909 float: left;
2909 float: left;
2910 }
2910 }
2911
2911
2912 .diffblock .diff-menu {
2912 .diffblock .diff-menu {
2913 position: absolute;
2913 position: absolute;
2914 background: none repeat scroll 0 0 #FFFFFF;
2914 background: none repeat scroll 0 0 #FFFFFF;
2915 border-color: #003367 #666666 #666666;
2915 border-color: #003367 #666666 #666666;
2916 border-right: 1px solid #666666;
2916 border-right: 1px solid #666666;
2917 border-style: solid solid solid;
2917 border-style: solid solid solid;
2918 border-width: 1px;
2918 border-width: 1px;
2919 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2919 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2920 margin-top: 5px;
2920 margin-top: 5px;
2921 margin-left: 1px;
2921 margin-left: 1px;
2922
2922
2923 }
2923 }
2924 .diffblock .diff-actions {
2924 .diffblock .diff-actions {
2925 padding: 2px 0px 0px 2px;
2925 padding: 2px 0px 0px 2px;
2926 float: left;
2926 float: left;
2927 }
2927 }
2928 .diffblock .diff-menu ul li {
2928 .diffblock .diff-menu ul li {
2929 padding: 0px 0px 0px 0px !important;
2929 padding: 0px 0px 0px 0px !important;
2930 }
2930 }
2931 .diffblock .diff-menu ul li a {
2931 .diffblock .diff-menu ul li a {
2932 display: block;
2932 display: block;
2933 padding: 3px 8px 3px 8px !important;
2933 padding: 3px 8px 3px 8px !important;
2934 }
2934 }
2935 .diffblock .diff-menu ul li a:hover {
2935 .diffblock .diff-menu ul li a:hover {
2936 text-decoration: none;
2936 text-decoration: none;
2937 background-color: #EEEEEE;
2937 background-color: #EEEEEE;
2938 }
2938 }
2939 table.code-browser .browser-dir {
2939 table.code-browser .browser-dir {
2940 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2940 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2941 height: 16px;
2941 height: 16px;
2942 padding-left: 20px;
2942 padding-left: 20px;
2943 text-align: left;
2943 text-align: left;
2944 }
2944 }
2945
2945
2946 table.code-browser .submodule-dir {
2946 table.code-browser .submodule-dir {
2947 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2947 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2948 height: 16px;
2948 height: 16px;
2949 padding-left: 20px;
2949 padding-left: 20px;
2950 text-align: left;
2950 text-align: left;
2951 }
2951 }
2952
2952
2953
2953
2954 .box .search {
2954 .box .search {
2955 clear: both;
2955 clear: both;
2956 overflow: hidden;
2956 overflow: hidden;
2957 margin: 0;
2957 margin: 0;
2958 padding: 0 20px 10px;
2958 padding: 0 20px 10px;
2959 }
2959 }
2960
2960
2961 .box .search div.search_path {
2961 .box .search div.search_path {
2962 background: none repeat scroll 0 0 #EEE;
2962 background: none repeat scroll 0 0 #EEE;
2963 border: 1px solid #CCC;
2963 border: 1px solid #CCC;
2964 color: blue;
2964 color: blue;
2965 margin-bottom: 10px;
2965 margin-bottom: 10px;
2966 padding: 10px 0;
2966 padding: 10px 0;
2967 }
2967 }
2968
2968
2969 .box .search div.search_path div.link {
2969 .box .search div.search_path div.link {
2970 font-weight: 700;
2970 font-weight: 700;
2971 margin-left: 25px;
2971 margin-left: 25px;
2972 }
2972 }
2973
2973
2974 .box .search div.search_path div.link a {
2974 .box .search div.search_path div.link a {
2975 color: #003367;
2975 color: #003367;
2976 cursor: pointer;
2976 cursor: pointer;
2977 text-decoration: none;
2977 text-decoration: none;
2978 }
2978 }
2979
2979
2980 #path_unlock {
2980 #path_unlock {
2981 color: red;
2981 color: red;
2982 font-size: 1.2em;
2982 font-size: 1.2em;
2983 padding-left: 4px;
2983 padding-left: 4px;
2984 }
2984 }
2985
2985
2986 .info_box span {
2986 .info_box span {
2987 margin-left: 3px;
2987 margin-left: 3px;
2988 margin-right: 3px;
2988 margin-right: 3px;
2989 }
2989 }
2990
2990
2991 .info_box .rev {
2991 .info_box .rev {
2992 color: #003367;
2992 color: #003367;
2993 font-size: 1.6em;
2993 font-size: 1.6em;
2994 font-weight: bold;
2994 font-weight: bold;
2995 vertical-align: sub;
2995 vertical-align: sub;
2996 }
2996 }
2997
2997
2998 .info_box input#at_rev, .info_box input#size {
2998 .info_box input#at_rev, .info_box input#size {
2999 background: #FFF;
2999 background: #FFF;
3000 border-top: 1px solid #b3b3b3;
3000 border-top: 1px solid #b3b3b3;
3001 border-left: 1px solid #b3b3b3;
3001 border-left: 1px solid #b3b3b3;
3002 border-right: 1px solid #eaeaea;
3002 border-right: 1px solid #eaeaea;
3003 border-bottom: 1px solid #eaeaea;
3003 border-bottom: 1px solid #eaeaea;
3004 color: #000;
3004 color: #000;
3005 font-size: 12px;
3005 font-size: 12px;
3006 margin: 0;
3006 margin: 0;
3007 padding: 1px 5px 1px;
3007 padding: 1px 5px 1px;
3008 }
3008 }
3009
3009
3010 .info_box input#view {
3010 .info_box input#view {
3011 text-align: center;
3011 text-align: center;
3012 padding: 4px 3px 2px 2px;
3012 padding: 4px 3px 2px 2px;
3013 }
3013 }
3014
3014
3015 .yui-overlay, .yui-panel-container {
3015 .yui-overlay, .yui-panel-container {
3016 visibility: hidden;
3016 visibility: hidden;
3017 position: absolute;
3017 position: absolute;
3018 z-index: 2;
3018 z-index: 2;
3019 }
3019 }
3020
3020
3021 #tip-box {
3021 #tip-box {
3022 position: absolute;
3022 position: absolute;
3023
3023
3024 background-color: #FFF;
3024 background-color: #FFF;
3025 border: 2px solid #003367;
3025 border: 2px solid #003367;
3026 font: 100% sans-serif;
3026 font: 100% sans-serif;
3027 width: auto;
3027 width: auto;
3028 opacity: 1;
3028 opacity: 1;
3029 padding: 8px;
3029 padding: 8px;
3030
3030
3031 white-space: pre-wrap;
3031 white-space: pre-wrap;
3032 -webkit-border-radius: 8px 8px 8px 8px;
3032 -webkit-border-radius: 8px 8px 8px 8px;
3033 -khtml-border-radius: 8px 8px 8px 8px;
3033 -khtml-border-radius: 8px 8px 8px 8px;
3034 border-radius: 8px 8px 8px 8px;
3034 border-radius: 8px 8px 8px 8px;
3035 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3035 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3036 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3036 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3037 }
3037 }
3038
3038
3039 .hl-tip-box {
3039 .hl-tip-box {
3040 visibility: hidden;
3040 visibility: hidden;
3041 position: absolute;
3041 position: absolute;
3042 color: #666;
3042 color: #666;
3043 background-color: #FFF;
3043 background-color: #FFF;
3044 border: 2px solid #003367;
3044 border: 2px solid #003367;
3045 font: 100% sans-serif;
3045 font: 100% sans-serif;
3046 width: auto;
3046 width: auto;
3047 opacity: 1;
3047 opacity: 1;
3048 padding: 8px;
3048 padding: 8px;
3049 white-space: pre-wrap;
3049 white-space: pre-wrap;
3050 -webkit-border-radius: 8px 8px 8px 8px;
3050 -webkit-border-radius: 8px 8px 8px 8px;
3051 -khtml-border-radius: 8px 8px 8px 8px;
3051 -khtml-border-radius: 8px 8px 8px 8px;
3052 border-radius: 8px 8px 8px 8px;
3052 border-radius: 8px 8px 8px 8px;
3053 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3053 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3054 }
3054 }
3055
3055
3056
3056
3057 .mentions-container {
3057 .mentions-container {
3058 width: 90% !important;
3058 width: 90% !important;
3059 }
3059 }
3060 .mentions-container .yui-ac-content {
3060 .mentions-container .yui-ac-content {
3061 width: 100% !important;
3061 width: 100% !important;
3062 }
3062 }
3063
3063
3064 .ac {
3064 .ac {
3065 vertical-align: top;
3065 vertical-align: top;
3066 }
3066 }
3067
3067
3068 .ac .yui-ac {
3068 .ac .yui-ac {
3069 position: inherit;
3069 position: inherit;
3070 font-size: 100%;
3070 font-size: 100%;
3071 }
3071 }
3072
3072
3073 .ac .perm_ac {
3073 .ac .perm_ac {
3074 width: 20em;
3074 width: 20em;
3075 }
3075 }
3076
3076
3077 .ac .yui-ac-input {
3077 .ac .yui-ac-input {
3078 width: 100%;
3078 width: 100%;
3079 }
3079 }
3080
3080
3081 .ac .yui-ac-container {
3081 .ac .yui-ac-container {
3082 position: absolute;
3082 position: absolute;
3083 top: 1.6em;
3083 top: 1.6em;
3084 width: auto;
3084 width: auto;
3085 }
3085 }
3086
3086
3087 .ac .yui-ac-content {
3087 .ac .yui-ac-content {
3088 position: absolute;
3088 position: absolute;
3089 border: 1px solid gray;
3089 border: 1px solid gray;
3090 background: #fff;
3090 background: #fff;
3091 z-index: 9050;
3091 z-index: 9050;
3092 }
3092 }
3093
3093
3094 .ac .yui-ac-shadow {
3094 .ac .yui-ac-shadow {
3095 position: absolute;
3095 position: absolute;
3096 width: 100%;
3096 width: 100%;
3097 background: #000;
3097 background: #000;
3098 opacity: .10;
3098 opacity: .10;
3099 filter: alpha(opacity = 10);
3099 filter: alpha(opacity = 10);
3100 z-index: 9049;
3100 z-index: 9049;
3101 margin: .3em;
3101 margin: .3em;
3102 }
3102 }
3103
3103
3104 .ac .yui-ac-content ul {
3104 .ac .yui-ac-content ul {
3105 width: 100%;
3105 width: 100%;
3106 margin: 0;
3106 margin: 0;
3107 padding: 0;
3107 padding: 0;
3108 z-index: 9050;
3108 z-index: 9050;
3109 }
3109 }
3110
3110
3111 .ac .yui-ac-content li {
3111 .ac .yui-ac-content li {
3112 cursor: default;
3112 cursor: default;
3113 white-space: nowrap;
3113 white-space: nowrap;
3114 margin: 0;
3114 margin: 0;
3115 padding: 2px 5px;
3115 padding: 2px 5px;
3116 height: 18px;
3116 height: 18px;
3117 z-index: 9050;
3117 z-index: 9050;
3118 display: block;
3118 display: block;
3119 width: auto !important;
3119 width: auto !important;
3120 }
3120 }
3121
3121
3122 .ac .yui-ac-content li .ac-container-wrap {
3122 .ac .yui-ac-content li .ac-container-wrap {
3123 width: auto;
3123 width: auto;
3124 }
3124 }
3125
3125
3126 .ac .yui-ac-content li.yui-ac-prehighlight {
3126 .ac .yui-ac-content li.yui-ac-prehighlight {
3127 background: #B3D4FF;
3127 background: #B3D4FF;
3128 z-index: 9050;
3128 z-index: 9050;
3129 }
3129 }
3130
3130
3131 .ac .yui-ac-content li.yui-ac-highlight {
3131 .ac .yui-ac-content li.yui-ac-highlight {
3132 background: #556CB5;
3132 background: #556CB5;
3133 color: #FFF;
3133 color: #FFF;
3134 z-index: 9050;
3134 z-index: 9050;
3135 }
3135 }
3136 .ac .yui-ac-bd {
3136 .ac .yui-ac-bd {
3137 z-index: 9050;
3137 z-index: 9050;
3138 }
3138 }
3139
3139
3140 .follow {
3140 .follow {
3141 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3141 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3142 height: 16px;
3142 height: 16px;
3143 width: 20px;
3143 width: 20px;
3144 cursor: pointer;
3144 cursor: pointer;
3145 display: block;
3145 display: block;
3146 float: right;
3146 float: right;
3147 margin-top: 2px;
3147 margin-top: 2px;
3148 }
3148 }
3149
3149
3150 .following {
3150 .following {
3151 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3151 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3152 height: 16px;
3152 height: 16px;
3153 width: 20px;
3153 width: 20px;
3154 cursor: pointer;
3154 cursor: pointer;
3155 display: block;
3155 display: block;
3156 float: right;
3156 float: right;
3157 margin-top: 2px;
3157 margin-top: 2px;
3158 }
3158 }
3159
3159
3160 .reposize {
3160 .reposize {
3161 background: url("../images/icons/server.png") no-repeat scroll 3px;
3161 background: url("../images/icons/server.png") no-repeat scroll 3px;
3162 height: 16px;
3162 height: 16px;
3163 width: 20px;
3163 width: 20px;
3164 cursor: pointer;
3164 cursor: pointer;
3165 display: block;
3165 display: block;
3166 float: right;
3166 float: right;
3167 margin-top: 2px;
3167 margin-top: 2px;
3168 }
3168 }
3169
3169
3170 #repo_size {
3170 #repo_size {
3171 display: block;
3171 display: block;
3172 margin-top: 4px;
3172 margin-top: 4px;
3173 color: #666;
3173 color: #666;
3174 float: right;
3174 float: right;
3175 }
3175 }
3176
3176
3177 .locking_locked {
3177 .locking_locked {
3178 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3178 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3179 height: 16px;
3179 height: 16px;
3180 width: 20px;
3180 width: 20px;
3181 cursor: pointer;
3181 cursor: pointer;
3182 display: block;
3182 display: block;
3183 float: right;
3183 float: right;
3184 margin-top: 2px;
3184 margin-top: 2px;
3185 }
3185 }
3186
3186
3187 .locking_unlocked {
3187 .locking_unlocked {
3188 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3188 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3189 height: 16px;
3189 height: 16px;
3190 width: 20px;
3190 width: 20px;
3191 cursor: pointer;
3191 cursor: pointer;
3192 display: block;
3192 display: block;
3193 float: right;
3193 float: right;
3194 margin-top: 2px;
3194 margin-top: 2px;
3195 }
3195 }
3196
3196
3197 .currently_following {
3197 .currently_following {
3198 padding-left: 10px;
3198 padding-left: 10px;
3199 padding-bottom: 5px;
3199 padding-bottom: 5px;
3200 }
3200 }
3201
3201
3202 .add_icon {
3202 .add_icon {
3203 background: url("../images/icons/add.png") no-repeat scroll 3px;
3203 background: url("../images/icons/add.png") no-repeat scroll 3px;
3204 padding-left: 20px;
3204 padding-left: 20px;
3205 padding-top: 0px;
3205 padding-top: 0px;
3206 text-align: left;
3206 text-align: left;
3207 }
3207 }
3208
3208
3209 .accept_icon {
3209 .accept_icon {
3210 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3210 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3211 padding-left: 20px;
3211 padding-left: 20px;
3212 padding-top: 0px;
3212 padding-top: 0px;
3213 text-align: left;
3213 text-align: left;
3214 }
3214 }
3215
3215
3216 .edit_icon {
3216 .edit_icon {
3217 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3217 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3218 padding-left: 20px;
3218 padding-left: 20px;
3219 padding-top: 0px;
3219 padding-top: 0px;
3220 text-align: left;
3220 text-align: left;
3221 }
3221 }
3222
3222
3223 .delete_icon {
3223 .delete_icon {
3224 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3224 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3225 padding-left: 20px;
3225 padding-left: 20px;
3226 padding-top: 0px;
3226 padding-top: 0px;
3227 text-align: left;
3227 text-align: left;
3228 }
3228 }
3229
3229
3230 .refresh_icon {
3230 .refresh_icon {
3231 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3231 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3232 3px;
3232 3px;
3233 padding-left: 20px;
3233 padding-left: 20px;
3234 padding-top: 0px;
3234 padding-top: 0px;
3235 text-align: left;
3235 text-align: left;
3236 }
3236 }
3237
3237
3238 .pull_icon {
3238 .pull_icon {
3239 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3239 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3240 padding-left: 20px;
3240 padding-left: 20px;
3241 padding-top: 0px;
3241 padding-top: 0px;
3242 text-align: left;
3242 text-align: left;
3243 }
3243 }
3244
3244
3245 .rss_icon {
3245 .rss_icon {
3246 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3246 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3247 padding-left: 20px;
3247 padding-left: 20px;
3248 padding-top: 4px;
3248 padding-top: 4px;
3249 text-align: left;
3249 text-align: left;
3250 font-size: 8px
3250 font-size: 8px
3251 }
3251 }
3252
3252
3253 .atom_icon {
3253 .atom_icon {
3254 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3254 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3255 padding-left: 20px;
3255 padding-left: 20px;
3256 padding-top: 4px;
3256 padding-top: 4px;
3257 text-align: left;
3257 text-align: left;
3258 font-size: 8px
3258 font-size: 8px
3259 }
3259 }
3260
3260
3261 .archive_icon {
3261 .archive_icon {
3262 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3262 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3263 padding-left: 20px;
3263 padding-left: 20px;
3264 text-align: left;
3264 text-align: left;
3265 padding-top: 1px;
3265 padding-top: 1px;
3266 }
3266 }
3267
3267
3268 .start_following_icon {
3268 .start_following_icon {
3269 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3269 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3270 padding-left: 20px;
3270 padding-left: 20px;
3271 text-align: left;
3271 text-align: left;
3272 padding-top: 0px;
3272 padding-top: 0px;
3273 }
3273 }
3274
3274
3275 .stop_following_icon {
3275 .stop_following_icon {
3276 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3276 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3277 padding-left: 20px;
3277 padding-left: 20px;
3278 text-align: left;
3278 text-align: left;
3279 padding-top: 0px;
3279 padding-top: 0px;
3280 }
3280 }
3281
3281
3282 .action_button {
3282 .action_button {
3283 border: 0;
3283 border: 0;
3284 display: inline;
3284 display: inline;
3285 }
3285 }
3286
3286
3287 .action_button:hover {
3287 .action_button:hover {
3288 border: 0;
3288 border: 0;
3289 text-decoration: underline;
3289 text-decoration: underline;
3290 cursor: pointer;
3290 cursor: pointer;
3291 }
3291 }
3292
3292
3293 #switch_repos {
3293 #switch_repos {
3294 position: absolute;
3294 position: absolute;
3295 height: 25px;
3295 height: 25px;
3296 z-index: 1;
3296 z-index: 1;
3297 }
3297 }
3298
3298
3299 #switch_repos select {
3299 #switch_repos select {
3300 min-width: 150px;
3300 min-width: 150px;
3301 max-height: 250px;
3301 max-height: 250px;
3302 z-index: 1;
3302 z-index: 1;
3303 }
3303 }
3304
3304
3305 .breadcrumbs {
3305 .breadcrumbs {
3306 border: medium none;
3306 border: medium none;
3307 color: #FFF;
3307 color: #FFF;
3308 float: left;
3308 float: left;
3309 font-weight: 700;
3309 font-weight: 700;
3310 font-size: 14px;
3310 font-size: 14px;
3311 margin: 0;
3311 margin: 0;
3312 padding: 11px 0 11px 10px;
3312 padding: 11px 0 11px 10px;
3313 }
3313 }
3314
3314
3315 .breadcrumbs .hash {
3315 .breadcrumbs .hash {
3316 text-transform: none;
3316 text-transform: none;
3317 color: #fff;
3317 color: #fff;
3318 }
3318 }
3319
3319
3320 .breadcrumbs a {
3320 .breadcrumbs a {
3321 color: #FFF;
3321 color: #FFF;
3322 }
3322 }
3323
3323
3324 .flash_msg {
3324 .flash_msg {
3325 }
3325 }
3326
3326
3327 .flash_msg ul {
3327 .flash_msg ul {
3328 }
3328 }
3329
3329
3330 .error_red {
3330 .error_red {
3331 color: red;
3331 color: red;
3332 }
3332 }
3333
3333
3334 .error_msg {
3334 .error_msg {
3335 background-color: #c43c35;
3335 background-color: #c43c35;
3336 background-repeat: repeat-x;
3336 background-repeat: repeat-x;
3337 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3337 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3338 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3338 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3339 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3339 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3340 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3340 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3341 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3341 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3342 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3342 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3343 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3343 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3344 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3344 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3345 border-color: #c43c35 #c43c35 #882a25;
3345 border-color: #c43c35 #c43c35 #882a25;
3346 }
3346 }
3347
3347
3348 .warning_msg {
3348 .warning_msg {
3349 color: #404040 !important;
3349 color: #404040 !important;
3350 background-color: #eedc94;
3350 background-color: #eedc94;
3351 background-repeat: repeat-x;
3351 background-repeat: repeat-x;
3352 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3352 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3353 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3353 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3354 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3354 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3355 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3355 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3356 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3356 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3357 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3357 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3358 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3358 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3359 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3359 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3360 border-color: #eedc94 #eedc94 #e4c652;
3360 border-color: #eedc94 #eedc94 #e4c652;
3361 }
3361 }
3362
3362
3363 .success_msg {
3363 .success_msg {
3364 background-color: #57a957;
3364 background-color: #57a957;
3365 background-repeat: repeat-x !important;
3365 background-repeat: repeat-x !important;
3366 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3366 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3367 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3367 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3368 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3368 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3369 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3369 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3370 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3370 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3371 background-image: -o-linear-gradient(top, #62c462, #57a957);
3371 background-image: -o-linear-gradient(top, #62c462, #57a957);
3372 background-image: linear-gradient(to bottom, #62c462, #57a957);
3372 background-image: linear-gradient(to bottom, #62c462, #57a957);
3373 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3373 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3374 border-color: #57a957 #57a957 #3d773d;
3374 border-color: #57a957 #57a957 #3d773d;
3375 }
3375 }
3376
3376
3377 .notice_msg {
3377 .notice_msg {
3378 background-color: #339bb9;
3378 background-color: #339bb9;
3379 background-repeat: repeat-x;
3379 background-repeat: repeat-x;
3380 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3380 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3381 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3381 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3382 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3382 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3383 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3383 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3384 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3384 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3385 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3385 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3386 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3386 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3387 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3387 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3388 border-color: #339bb9 #339bb9 #22697d;
3388 border-color: #339bb9 #339bb9 #22697d;
3389 }
3389 }
3390
3390
3391 .success_msg, .error_msg, .notice_msg, .warning_msg {
3391 .success_msg, .error_msg, .notice_msg, .warning_msg {
3392 font-size: 12px;
3392 font-size: 12px;
3393 font-weight: 700;
3393 font-weight: 700;
3394 min-height: 14px;
3394 min-height: 14px;
3395 line-height: 14px;
3395 line-height: 14px;
3396 margin-bottom: 10px;
3396 margin-bottom: 10px;
3397 margin-top: 0;
3397 margin-top: 0;
3398 display: block;
3398 display: block;
3399 overflow: auto;
3399 overflow: auto;
3400 padding: 6px 10px 6px 10px;
3400 padding: 6px 10px 6px 10px;
3401 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3401 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3402 position: relative;
3402 position: relative;
3403 color: #FFF;
3403 color: #FFF;
3404 border-width: 1px;
3404 border-width: 1px;
3405 border-style: solid;
3405 border-style: solid;
3406 -webkit-border-radius: 4px;
3406 -webkit-border-radius: 4px;
3407 border-radius: 4px;
3407 border-radius: 4px;
3408 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3408 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3409 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3409 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3410 }
3410 }
3411
3411
3412 #msg_close {
3412 #msg_close {
3413 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3413 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3414 cursor: pointer;
3414 cursor: pointer;
3415 height: 16px;
3415 height: 16px;
3416 position: absolute;
3416 position: absolute;
3417 right: 5px;
3417 right: 5px;
3418 top: 5px;
3418 top: 5px;
3419 width: 16px;
3419 width: 16px;
3420 }
3420 }
3421 div#legend_data {
3421 div#legend_data {
3422 padding-left: 10px;
3422 padding-left: 10px;
3423 }
3423 }
3424 div#legend_container table {
3424 div#legend_container table {
3425 border: none !important;
3425 border: none !important;
3426 }
3426 }
3427 div#legend_container table, div#legend_choices table {
3427 div#legend_container table, div#legend_choices table {
3428 width: auto !important;
3428 width: auto !important;
3429 }
3429 }
3430
3430
3431 table#permissions_manage {
3431 table#permissions_manage {
3432 width: 0 !important;
3432 width: 0 !important;
3433 }
3433 }
3434
3434
3435 table#permissions_manage span.private_repo_msg {
3435 table#permissions_manage span.private_repo_msg {
3436 font-size: 0.8em;
3436 font-size: 0.8em;
3437 opacity: 0.6;
3437 opacity: 0.6;
3438 }
3438 }
3439
3439
3440 table#permissions_manage td.private_repo_msg {
3440 table#permissions_manage td.private_repo_msg {
3441 font-size: 0.8em;
3441 font-size: 0.8em;
3442 }
3442 }
3443
3443
3444 table#permissions_manage tr#add_perm_input td {
3444 table#permissions_manage tr#add_perm_input td {
3445 vertical-align: middle;
3445 vertical-align: middle;
3446 }
3446 }
3447
3447
3448 div.gravatar {
3448 div.gravatar {
3449 background-color: #FFF;
3449 background-color: #FFF;
3450 float: left;
3450 float: left;
3451 margin-right: 0.7em;
3451 margin-right: 0.7em;
3452 padding: 1px 1px 1px 1px;
3452 padding: 1px 1px 1px 1px;
3453 line-height: 0;
3453 line-height: 0;
3454 -webkit-border-radius: 3px;
3454 -webkit-border-radius: 3px;
3455 -khtml-border-radius: 3px;
3455 -khtml-border-radius: 3px;
3456 border-radius: 3px;
3456 border-radius: 3px;
3457 }
3457 }
3458
3458
3459 div.gravatar img {
3459 div.gravatar img {
3460 -webkit-border-radius: 2px;
3460 -webkit-border-radius: 2px;
3461 -khtml-border-radius: 2px;
3461 -khtml-border-radius: 2px;
3462 border-radius: 2px;
3462 border-radius: 2px;
3463 }
3463 }
3464
3464
3465 #header, #content, #footer {
3465 #header, #content, #footer {
3466 min-width: 978px;
3466 min-width: 978px;
3467 }
3467 }
3468
3468
3469 #content {
3469 #content {
3470 clear: both;
3470 clear: both;
3471 overflow: hidden;
3471 overflow: hidden;
3472 padding: 10px 10px 14px 10px;
3472 padding: 10px 10px 14px 10px;
3473 }
3473 }
3474
3474
3475 #content.hover {
3475 #content.hover {
3476 padding: 55px 10px 14px 10px !important;
3476 padding: 55px 10px 14px 10px !important;
3477 }
3477 }
3478
3478
3479 #content div.box div.title div.search {
3479 #content div.box div.title div.search {
3480 border-left: 1px solid #316293;
3480 border-left: 1px solid #316293;
3481 }
3481 }
3482
3482
3483 #content div.box div.title div.search div.input input {
3483 #content div.box div.title div.search div.input input {
3484 border: 1px solid #316293;
3484 border: 1px solid #316293;
3485 }
3485 }
3486
3486
3487 .ui-btn {
3487 .ui-btn {
3488 color: #515151;
3488 color: #515151;
3489 background-color: #DADADA;
3489 background-color: #DADADA;
3490 background-repeat: repeat-x;
3490 background-repeat: repeat-x;
3491 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3491 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3492 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3492 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3493 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3493 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3494 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3494 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3495 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3495 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3496 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3496 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3497 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3497 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3498 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3498 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3499
3499
3500 border-top: 1px solid #DDD;
3500 border-top: 1px solid #DDD;
3501 border-left: 1px solid #c6c6c6;
3501 border-left: 1px solid #c6c6c6;
3502 border-right: 1px solid #DDD;
3502 border-right: 1px solid #DDD;
3503 border-bottom: 1px solid #c6c6c6;
3503 border-bottom: 1px solid #c6c6c6;
3504 color: #515151;
3504 color: #515151;
3505 outline: none;
3505 outline: none;
3506 margin: 0px 3px 3px 0px;
3506 margin: 0px 3px 3px 0px;
3507 -webkit-border-radius: 4px 4px 4px 4px !important;
3507 -webkit-border-radius: 4px 4px 4px 4px !important;
3508 -khtml-border-radius: 4px 4px 4px 4px !important;
3508 -khtml-border-radius: 4px 4px 4px 4px !important;
3509 border-radius: 4px 4px 4px 4px !important;
3509 border-radius: 4px 4px 4px 4px !important;
3510 cursor: pointer !important;
3510 cursor: pointer !important;
3511 padding: 3px 3px 3px 3px;
3511 padding: 3px 3px 3px 3px;
3512 background-position: 0 -15px;
3512 background-position: 0 -15px;
3513
3513
3514 }
3514 }
3515
3515
3516 .ui-btn.disabled {
3516 .ui-btn.disabled {
3517 color: #999;
3517 color: #999;
3518 }
3518 }
3519
3519
3520 .ui-btn.xsmall {
3520 .ui-btn.xsmall {
3521 padding: 1px 2px 1px 1px;
3521 padding: 1px 2px 1px 1px;
3522 }
3522 }
3523
3523
3524 .ui-btn.large {
3524 .ui-btn.large {
3525 padding: 6px 12px;
3525 padding: 6px 12px;
3526 }
3526 }
3527
3527
3528 .ui-btn.clone {
3528 .ui-btn.clone {
3529 padding: 5px 2px 6px 1px;
3529 padding: 5px 2px 6px 1px;
3530 margin: 0px 0px 3px -4px;
3530 margin: 0px 0px 3px -4px;
3531 -webkit-border-radius: 0px 4px 4px 0px !important;
3531 -webkit-border-radius: 0px 4px 4px 0px !important;
3532 -khtml-border-radius: 0px 4px 4px 0px !important;
3532 -khtml-border-radius: 0px 4px 4px 0px !important;
3533 border-radius: 0px 4px 4px 0px !important;
3533 border-radius: 0px 4px 4px 0px !important;
3534 width: 100px;
3534 width: 100px;
3535 text-align: center;
3535 text-align: center;
3536 display: inline-block;
3536 display: inline-block;
3537 position: relative;
3537 position: relative;
3538 top: -2px;
3538 top: -2px;
3539 }
3539 }
3540 .ui-btn:focus {
3540 .ui-btn:focus {
3541 outline: none;
3541 outline: none;
3542 }
3542 }
3543 .ui-btn:hover {
3543 .ui-btn:hover {
3544 background-position: 0 -15px;
3544 background-position: 0 -15px;
3545 text-decoration: none;
3545 text-decoration: none;
3546 color: #515151;
3546 color: #515151;
3547 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3547 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3548 }
3548 }
3549
3549
3550 .ui-btn.disabled:hover {
3550 .ui-btn.disabled:hover {
3551 background-position: 0;
3551 background-position: 0;
3552 color: #999;
3552 color: #999;
3553 text-decoration: none;
3553 text-decoration: none;
3554 box-shadow: none !important;
3554 box-shadow: none !important;
3555 }
3555 }
3556
3556
3557 .ui-btn.red {
3557 .ui-btn.red {
3558 color: #fff;
3558 color: #fff;
3559 background-color: #c43c35;
3559 background-color: #c43c35;
3560 background-repeat: repeat-x;
3560 background-repeat: repeat-x;
3561 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3561 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3562 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3562 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3563 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3563 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3564 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3564 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3565 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3565 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3566 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3566 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3567 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3567 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3568 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3568 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3569 border-color: #c43c35 #c43c35 #882a25;
3569 border-color: #c43c35 #c43c35 #882a25;
3570 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3570 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3571 }
3571 }
3572
3572
3573
3573
3574 .ui-btn.blue {
3574 .ui-btn.blue {
3575 color: #fff;
3575 color: #fff;
3576 background-color: #339bb9;
3576 background-color: #339bb9;
3577 background-repeat: repeat-x;
3577 background-repeat: repeat-x;
3578 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3578 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3579 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3579 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3580 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3580 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3581 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3581 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3582 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3582 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3583 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3583 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3584 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3584 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3585 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3585 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3586 border-color: #339bb9 #339bb9 #22697d;
3586 border-color: #339bb9 #339bb9 #22697d;
3587 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3587 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3588 }
3588 }
3589
3589
3590 .ui-btn.green {
3590 .ui-btn.green {
3591 background-color: #57a957;
3591 background-color: #57a957;
3592 background-repeat: repeat-x;
3592 background-repeat: repeat-x;
3593 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3593 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3594 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3594 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3595 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3595 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3596 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3596 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3597 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3597 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3598 background-image: -o-linear-gradient(top, #62c462, #57a957);
3598 background-image: -o-linear-gradient(top, #62c462, #57a957);
3599 background-image: linear-gradient(to bottom, #62c462, #57a957);
3599 background-image: linear-gradient(to bottom, #62c462, #57a957);
3600 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3600 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3601 border-color: #57a957 #57a957 #3d773d;
3601 border-color: #57a957 #57a957 #3d773d;
3602 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3602 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3603 }
3603 }
3604
3604
3605 .ui-btn.blue.hidden {
3605 .ui-btn.blue.hidden {
3606 display: none;
3606 display: none;
3607 }
3607 }
3608
3608
3609 .ui-btn.active {
3609 .ui-btn.active {
3610 font-weight: bold;
3610 font-weight: bold;
3611 }
3611 }
3612
3612
3613 ins, div.options a:hover {
3613 ins, div.options a:hover {
3614 text-decoration: none;
3614 text-decoration: none;
3615 }
3615 }
3616
3616
3617 img,
3617 img,
3618 #header #header-inner #quick li a:hover span.normal,
3618 #header #header-inner #quick li a:hover span.normal,
3619 #header #header-inner #quick li ul li.last,
3619 #header #header-inner #quick li ul li.last,
3620 #content div.box div.form div.fields div.field div.textarea table td table td a,
3620 #content div.box div.form div.fields div.field div.textarea table td table td a,
3621 #clone_url,
3621 #clone_url,
3622 #clone_url_id
3622 #clone_url_id
3623 {
3623 {
3624 border: none;
3624 border: none;
3625 }
3625 }
3626
3626
3627 img.icon, .right .merge img {
3627 img.icon, .right .merge img {
3628 vertical-align: bottom;
3628 vertical-align: bottom;
3629 }
3629 }
3630
3630
3631 #header ul#logged-user, #content div.box div.title ul.links,
3631 #header ul#logged-user, #content div.box div.title ul.links,
3632 #content div.box div.message div.dismiss,
3632 #content div.box div.message div.dismiss,
3633 #content div.box div.traffic div.legend ul {
3633 #content div.box div.traffic div.legend ul {
3634 float: right;
3634 float: right;
3635 margin: 0;
3635 margin: 0;
3636 padding: 0;
3636 padding: 0;
3637 }
3637 }
3638
3638
3639 #header #header-inner #home, #header #header-inner #logo,
3639 #header #header-inner #home, #header #header-inner #logo,
3640 #content div.box ul.left, #content div.box ol.left,
3640 #content div.box ul.left, #content div.box ol.left,
3641 #content div.box div.pagination-left, div#commit_history,
3641 #content div.box div.pagination-left, div#commit_history,
3642 div#legend_data, div#legend_container, div#legend_choices {
3642 div#legend_data, div#legend_container, div#legend_choices {
3643 float: left;
3643 float: left;
3644 }
3644 }
3645
3645
3646 #header #header-inner #quick li #quick_login,
3646 #header #header-inner #quick li #quick_login,
3647 #header #header-inner #quick li:hover ul ul,
3647 #header #header-inner #quick li:hover ul ul,
3648 #header #header-inner #quick li:hover ul ul ul,
3648 #header #header-inner #quick li:hover ul ul ul,
3649 #header #header-inner #quick li:hover ul ul ul ul,
3649 #header #header-inner #quick li:hover ul ul ul ul,
3650 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3650 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3651 display: none;
3651 display: none;
3652 }
3652 }
3653
3653
3654 #header #header-inner #quick li:hover #quick_login,
3654 #header #header-inner #quick li:hover #quick_login,
3655 #header #header-inner #quick li:hover ul, #header #header-inner #quick li li:hover ul, #header #header-inner #quick li li li:hover ul, #header #header-inner #quick li li li li:hover ul, #content #left #menu ul.opened, #content #left #menu li ul.expanded {
3655 #header #header-inner #quick li:hover ul, #header #header-inner #quick li li:hover ul, #header #header-inner #quick li li li:hover ul, #header #header-inner #quick li li li li:hover ul, #content #left #menu ul.opened, #content #left #menu li ul.expanded {
3656 display: block;
3656 display: block;
3657 }
3657 }
3658
3658
3659 #content div.graph {
3659 #content div.graph {
3660 padding: 0 10px 10px;
3660 padding: 0 10px 10px;
3661 }
3661 }
3662
3662
3663 #content div.box div.title ul.links li a:hover, #content div.box div.title ul.links li.ui-tabs-selected a {
3663 #content div.box div.title ul.links li a:hover, #content div.box div.title ul.links li.ui-tabs-selected a {
3664 color: #bfe3ff;
3664 color: #bfe3ff;
3665 }
3665 }
3666
3666
3667 #content div.box ol.lower-roman, #content div.box ol.upper-roman, #content div.box ol.lower-alpha, #content div.box ol.upper-alpha, #content div.box ol.decimal {
3667 #content div.box ol.lower-roman, #content div.box ol.upper-roman, #content div.box ol.lower-alpha, #content div.box ol.upper-alpha, #content div.box ol.decimal {
3668 margin: 10px 24px 10px 44px;
3668 margin: 10px 24px 10px 44px;
3669 }
3669 }
3670
3670
3671 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3671 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3672 clear: both;
3672 clear: both;
3673 overflow: hidden;
3673 overflow: hidden;
3674 margin: 0;
3674 margin: 0;
3675 padding: 0 20px 10px;
3675 padding: 0 20px 10px;
3676 }
3676 }
3677
3677
3678 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3678 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3679 clear: both;
3679 clear: both;
3680 overflow: hidden;
3680 overflow: hidden;
3681 margin: 0;
3681 margin: 0;
3682 padding: 0;
3682 padding: 0;
3683 }
3683 }
3684
3684
3685 #content div.box div.form div.fields div.field div.label span, #login div.form div.fields div.field div.label span, #register div.form div.fields div.field div.label span {
3685 #content div.box div.form div.fields div.field div.label span, #login div.form div.fields div.field div.label span, #register div.form div.fields div.field div.label span {
3686 height: 1%;
3686 height: 1%;
3687 display: block;
3687 display: block;
3688 color: #363636;
3688 color: #363636;
3689 margin: 0;
3689 margin: 0;
3690 padding: 2px 0 0;
3690 padding: 2px 0 0;
3691 }
3691 }
3692
3692
3693 #content div.box div.form div.fields div.field div.input input.error, #login div.form div.fields div.field div.input input.error, #register div.form div.fields div.field div.input input.error {
3693 #content div.box div.form div.fields div.field div.input input.error, #login div.form div.fields div.field div.input input.error, #register div.form div.fields div.field div.input input.error {
3694 background: #FBE3E4;
3694 background: #FBE3E4;
3695 border-top: 1px solid #e1b2b3;
3695 border-top: 1px solid #e1b2b3;
3696 border-left: 1px solid #e1b2b3;
3696 border-left: 1px solid #e1b2b3;
3697 border-right: 1px solid #FBC2C4;
3697 border-right: 1px solid #FBC2C4;
3698 border-bottom: 1px solid #FBC2C4;
3698 border-bottom: 1px solid #FBC2C4;
3699 }
3699 }
3700
3700
3701 #content div.box div.form div.fields div.field div.input input.success, #login div.form div.fields div.field div.input input.success, #register div.form div.fields div.field div.input input.success {
3701 #content div.box div.form div.fields div.field div.input input.success, #login div.form div.fields div.field div.input input.success, #register div.form div.fields div.field div.input input.success {
3702 background: #E6EFC2;
3702 background: #E6EFC2;
3703 border-top: 1px solid #cebb98;
3703 border-top: 1px solid #cebb98;
3704 border-left: 1px solid #cebb98;
3704 border-left: 1px solid #cebb98;
3705 border-right: 1px solid #c6d880;
3705 border-right: 1px solid #c6d880;
3706 border-bottom: 1px solid #c6d880;
3706 border-bottom: 1px solid #c6d880;
3707 }
3707 }
3708
3708
3709 #content div.box-left div.form div.fields div.field div.textarea, #content div.box-right div.form div.fields div.field div.textarea, #content div.box div.form div.fields div.field div.select select, #content div.box table th.selected input, #content div.box table td.selected input {
3709 #content div.box-left div.form div.fields div.field div.textarea, #content div.box-right div.form div.fields div.field div.textarea, #content div.box div.form div.fields div.field div.select select, #content div.box table th.selected input, #content div.box table td.selected input {
3710 margin: 0;
3710 margin: 0;
3711 }
3711 }
3712
3712
3713 #content div.box-left div.form div.fields div.field div.select, #content div.box-left div.form div.fields div.field div.checkboxes, #content div.box-left div.form div.fields div.field div.radios, #content div.box-right div.form div.fields div.field div.select, #content div.box-right div.form div.fields div.field div.checkboxes, #content div.box-right div.form div.fields div.field div.radios {
3713 #content div.box-left div.form div.fields div.field div.select, #content div.box-left div.form div.fields div.field div.checkboxes, #content div.box-left div.form div.fields div.field div.radios, #content div.box-right div.form div.fields div.field div.select, #content div.box-right div.form div.fields div.field div.checkboxes, #content div.box-right div.form div.fields div.field div.radios {
3714 margin: 0 0 0 0px !important;
3714 margin: 0 0 0 0px !important;
3715 padding: 0;
3715 padding: 0;
3716 }
3716 }
3717
3717
3718 #content div.box div.form div.fields div.field div.select, #content div.box div.form div.fields div.field div.checkboxes, #content div.box div.form div.fields div.field div.radios {
3718 #content div.box div.form div.fields div.field div.select, #content div.box div.form div.fields div.field div.checkboxes, #content div.box div.form div.fields div.field div.radios {
3719 margin: 0 0 0 200px;
3719 margin: 0 0 0 200px;
3720 padding: 0;
3720 padding: 0;
3721 }
3721 }
3722
3722
3723 #content div.box div.form div.fields div.field div.select a:hover, #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover, #content div.box div.action a:hover {
3723 #content div.box div.form div.fields div.field div.select a:hover, #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover, #content div.box div.action a:hover {
3724 color: #000;
3724 color: #000;
3725 text-decoration: none;
3725 text-decoration: none;
3726 }
3726 }
3727
3727
3728 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3728 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3729 border: 1px solid #666;
3729 border: 1px solid #666;
3730 }
3730 }
3731
3731
3732 #content div.box div.form div.fields div.field div.checkboxes div.checkbox, #content div.box div.form div.fields div.field div.radios div.radio {
3732 #content div.box div.form div.fields div.field div.checkboxes div.checkbox, #content div.box div.form div.fields div.field div.radios div.radio {
3733 clear: both;
3733 clear: both;
3734 overflow: hidden;
3734 overflow: hidden;
3735 margin: 0;
3735 margin: 0;
3736 padding: 8px 0 2px;
3736 padding: 8px 0 2px;
3737 }
3737 }
3738
3738
3739 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input, #content div.box div.form div.fields div.field div.radios div.radio input {
3739 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input, #content div.box div.form div.fields div.field div.radios div.radio input {
3740 float: left;
3740 float: left;
3741 margin: 0;
3741 margin: 0;
3742 }
3742 }
3743
3743
3744 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label, #content div.box div.form div.fields div.field div.radios div.radio label {
3744 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label, #content div.box div.form div.fields div.field div.radios div.radio label {
3745 height: 1%;
3745 height: 1%;
3746 display: block;
3746 display: block;
3747 float: left;
3747 float: left;
3748 margin: 2px 0 0 4px;
3748 margin: 2px 0 0 4px;
3749 }
3749 }
3750
3750
3751 div.form div.fields div.field div.button input,
3751 div.form div.fields div.field div.button input,
3752 #content div.box div.form div.fields div.buttons input
3752 #content div.box div.form div.fields div.buttons input
3753 div.form div.fields div.buttons input,
3753 div.form div.fields div.buttons input,
3754 #content div.box div.action div.button input {
3754 #content div.box div.action div.button input {
3755 /*color: #000;*/
3755 /*color: #000;*/
3756 font-size: 11px;
3756 font-size: 11px;
3757 font-weight: 700;
3757 font-weight: 700;
3758 margin: 0;
3758 margin: 0;
3759 }
3759 }
3760
3760
3761 input.ui-button {
3761 input.ui-button {
3762 background: #e5e3e3 url("../images/button.png") repeat-x;
3762 background: #e5e3e3 url("../images/button.png") repeat-x;
3763 border-top: 1px solid #DDD;
3763 border-top: 1px solid #DDD;
3764 border-left: 1px solid #c6c6c6;
3764 border-left: 1px solid #c6c6c6;
3765 border-right: 1px solid #DDD;
3765 border-right: 1px solid #DDD;
3766 border-bottom: 1px solid #c6c6c6;
3766 border-bottom: 1px solid #c6c6c6;
3767 color: #515151 !important;
3767 color: #515151 !important;
3768 outline: none;
3768 outline: none;
3769 margin: 0;
3769 margin: 0;
3770 padding: 6px 12px;
3770 padding: 6px 12px;
3771 -webkit-border-radius: 4px 4px 4px 4px;
3771 -webkit-border-radius: 4px 4px 4px 4px;
3772 -khtml-border-radius: 4px 4px 4px 4px;
3772 -khtml-border-radius: 4px 4px 4px 4px;
3773 border-radius: 4px 4px 4px 4px;
3773 border-radius: 4px 4px 4px 4px;
3774 box-shadow: 0 1px 0 #ececec;
3774 box-shadow: 0 1px 0 #ececec;
3775 cursor: pointer;
3775 cursor: pointer;
3776 }
3776 }
3777
3777
3778 input.ui-button:hover {
3778 input.ui-button:hover {
3779 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3779 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3780 border-top: 1px solid #ccc;
3780 border-top: 1px solid #ccc;
3781 border-left: 1px solid #bebebe;
3781 border-left: 1px solid #bebebe;
3782 border-right: 1px solid #b1b1b1;
3782 border-right: 1px solid #b1b1b1;
3783 border-bottom: 1px solid #afafaf;
3783 border-bottom: 1px solid #afafaf;
3784 }
3784 }
3785
3785
3786 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3786 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3787 display: inline;
3787 display: inline;
3788 }
3788 }
3789
3789
3790 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3790 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3791 margin: 10px 0 0 200px;
3791 margin: 10px 0 0 200px;
3792 padding: 0;
3792 padding: 0;
3793 }
3793 }
3794
3794
3795 #content div.box-left div.form div.fields div.buttons, #content div.box-right div.form div.fields div.buttons, div.box-left div.form div.fields div.buttons, div.box-right div.form div.fields div.buttons {
3795 #content div.box-left div.form div.fields div.buttons, #content div.box-right div.form div.fields div.buttons, div.box-left div.form div.fields div.buttons, div.box-right div.form div.fields div.buttons {
3796 margin: 10px 0 0;
3796 margin: 10px 0 0;
3797 }
3797 }
3798
3798
3799 #content div.box table td.user, #content div.box table td.address {
3799 #content div.box table td.user, #content div.box table td.address {
3800 width: 10%;
3800 width: 10%;
3801 text-align: center;
3801 text-align: center;
3802 }
3802 }
3803
3803
3804 #content div.box div.action div.button, #login div.form div.fields div.field div.input div.link, #register div.form div.fields div.field div.input div.link {
3804 #content div.box div.action div.button, #login div.form div.fields div.field div.input div.link, #register div.form div.fields div.field div.input div.link {
3805 text-align: right;
3805 text-align: right;
3806 margin: 6px 0 0;
3806 margin: 6px 0 0;
3807 padding: 0;
3807 padding: 0;
3808 }
3808 }
3809
3809
3810 #content div.box div.action div.button input.ui-state-hover, #login div.form div.fields div.buttons input.ui-state-hover, #register div.form div.fields div.buttons input.ui-state-hover {
3810 #content div.box div.action div.button input.ui-state-hover, #login div.form div.fields div.buttons input.ui-state-hover, #register div.form div.fields div.buttons input.ui-state-hover {
3811 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3811 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3812 border-top: 1px solid #ccc;
3812 border-top: 1px solid #ccc;
3813 border-left: 1px solid #bebebe;
3813 border-left: 1px solid #bebebe;
3814 border-right: 1px solid #b1b1b1;
3814 border-right: 1px solid #b1b1b1;
3815 border-bottom: 1px solid #afafaf;
3815 border-bottom: 1px solid #afafaf;
3816 color: #515151;
3816 color: #515151;
3817 margin: 0;
3817 margin: 0;
3818 padding: 6px 12px;
3818 padding: 6px 12px;
3819 }
3819 }
3820
3820
3821 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3821 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3822 text-align: left;
3822 text-align: left;
3823 float: left;
3823 float: left;
3824 margin: 0;
3824 margin: 0;
3825 padding: 0;
3825 padding: 0;
3826 }
3826 }
3827
3827
3828 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3828 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3829 height: 1%;
3829 height: 1%;
3830 display: block;
3830 display: block;
3831 float: left;
3831 float: left;
3832 background: #ebebeb url("../images/pager.png") repeat-x;
3832 background: #ebebeb url("../images/pager.png") repeat-x;
3833 border-top: 1px solid #dedede;
3833 border-top: 1px solid #dedede;
3834 border-left: 1px solid #cfcfcf;
3834 border-left: 1px solid #cfcfcf;
3835 border-right: 1px solid #c4c4c4;
3835 border-right: 1px solid #c4c4c4;
3836 border-bottom: 1px solid #c4c4c4;
3836 border-bottom: 1px solid #c4c4c4;
3837 color: #4A4A4A;
3837 color: #4A4A4A;
3838 font-weight: 700;
3838 font-weight: 700;
3839 margin: 0;
3839 margin: 0;
3840 padding: 6px 8px;
3840 padding: 6px 8px;
3841 }
3841 }
3842
3842
3843 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3843 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3844 color: #B4B4B4;
3844 color: #B4B4B4;
3845 padding: 6px;
3845 padding: 6px;
3846 }
3846 }
3847
3847
3848 #login, #register {
3848 #login, #register {
3849 width: 520px;
3849 width: 520px;
3850 margin: 10% auto 0;
3850 margin: 10% auto 0;
3851 padding: 0;
3851 padding: 0;
3852 }
3852 }
3853
3853
3854 #login div.color, #register div.color {
3854 #login div.color, #register div.color {
3855 clear: both;
3855 clear: both;
3856 overflow: hidden;
3856 overflow: hidden;
3857 background: #FFF;
3857 background: #FFF;
3858 margin: 10px auto 0;
3858 margin: 10px auto 0;
3859 padding: 3px 3px 3px 0;
3859 padding: 3px 3px 3px 0;
3860 }
3860 }
3861
3861
3862 #login div.color a, #register div.color a {
3862 #login div.color a, #register div.color a {
3863 width: 20px;
3863 width: 20px;
3864 height: 20px;
3864 height: 20px;
3865 display: block;
3865 display: block;
3866 float: left;
3866 float: left;
3867 margin: 0 0 0 3px;
3867 margin: 0 0 0 3px;
3868 padding: 0;
3868 padding: 0;
3869 }
3869 }
3870
3870
3871 #login div.title h5, #register div.title h5 {
3871 #login div.title h5, #register div.title h5 {
3872 color: #fff;
3872 color: #fff;
3873 margin: 10px;
3873 margin: 10px;
3874 padding: 0;
3874 padding: 0;
3875 }
3875 }
3876
3876
3877 #login div.form div.fields div.field, #register div.form div.fields div.field {
3877 #login div.form div.fields div.field, #register div.form div.fields div.field {
3878 clear: both;
3878 clear: both;
3879 overflow: hidden;
3879 overflow: hidden;
3880 margin: 0;
3880 margin: 0;
3881 padding: 0 0 10px;
3881 padding: 0 0 10px;
3882 }
3882 }
3883
3883
3884 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3884 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3885 height: 1%;
3885 height: 1%;
3886 display: block;
3886 display: block;
3887 color: red;
3887 color: red;
3888 margin: 8px 0 0;
3888 margin: 8px 0 0;
3889 padding: 0;
3889 padding: 0;
3890 max-width: 320px;
3890 max-width: 320px;
3891 }
3891 }
3892
3892
3893 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3893 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3894 color: #000;
3894 color: #000;
3895 font-weight: 700;
3895 font-weight: 700;
3896 }
3896 }
3897
3897
3898 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3898 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3899 float: left;
3899 float: left;
3900 margin: 0;
3900 margin: 0;
3901 padding: 0;
3901 padding: 0;
3902 }
3902 }
3903
3903
3904 #login div.form div.fields div.field div.input input.large {
3904 #login div.form div.fields div.field div.input input.large {
3905 width: 250px;
3905 width: 250px;
3906 }
3906 }
3907
3907
3908 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3908 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3909 margin: 0 0 0 184px;
3909 margin: 0 0 0 184px;
3910 padding: 0;
3910 padding: 0;
3911 }
3911 }
3912
3912
3913 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3913 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3914 color: #565656;
3914 color: #565656;
3915 font-weight: 700;
3915 font-weight: 700;
3916 }
3916 }
3917
3917
3918 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3918 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3919 color: #000;
3919 color: #000;
3920 font-size: 1em;
3920 font-size: 1em;
3921 font-weight: 700;
3921 font-weight: 700;
3922 margin: 0;
3922 margin: 0;
3923 }
3923 }
3924
3924
3925 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3925 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3926 width: 600px;
3926 width: 600px;
3927 }
3927 }
3928
3928
3929 #changeset_content .container .left {
3929 #changeset_content .container .left {
3930 float: left;
3930 float: left;
3931 width: 75%;
3931 width: 75%;
3932 padding-left: 5px;
3932 padding-left: 5px;
3933 }
3933 }
3934
3934
3935 #changeset_content .container .left .date, .ac .match {
3935 #changeset_content .container .left .date, .ac .match {
3936 font-weight: 700;
3936 font-weight: 700;
3937 padding-top: 5px;
3937 padding-top: 5px;
3938 padding-bottom: 5px;
3938 padding-bottom: 5px;
3939 }
3939 }
3940
3940
3941 div#legend_container table td, div#legend_choices table td {
3941 div#legend_container table td, div#legend_choices table td {
3942 border: none !important;
3942 border: none !important;
3943 height: 20px !important;
3943 height: 20px !important;
3944 padding: 0 !important;
3944 padding: 0 !important;
3945 }
3945 }
3946
3946
3947 .q_filter_box {
3947 .q_filter_box {
3948 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3948 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3949 -webkit-border-radius: 4px;
3949 -webkit-border-radius: 4px;
3950 border-radius: 4px;
3950 border-radius: 4px;
3951 border: 0 none;
3951 border: 0 none;
3952 color: #AAAAAA;
3952 color: #AAAAAA;
3953 margin-bottom: -4px;
3953 margin-bottom: -4px;
3954 margin-top: -4px;
3954 margin-top: -4px;
3955 padding-left: 3px;
3955 padding-left: 3px;
3956 }
3956 }
3957
3957
3958 #node_filter {
3958 #node_filter {
3959 border: 0px solid #545454;
3959 border: 0px solid #545454;
3960 color: #AAAAAA;
3960 color: #AAAAAA;
3961 padding-left: 3px;
3961 padding-left: 3px;
3962 }
3962 }
3963
3963
3964
3964
3965 .group_members_wrap {
3965 .group_members_wrap {
3966 min-height: 85px;
3966 min-height: 85px;
3967 padding-left: 20px;
3967 padding-left: 20px;
3968 }
3968 }
3969
3969
3970 .group_members .group_member {
3970 .group_members .group_member {
3971 height: 30px;
3971 height: 30px;
3972 padding: 0px 0px 0px 0px;
3972 padding: 0px 0px 0px 0px;
3973 }
3973 }
3974
3974
3975 .reviewers_member {
3975 .reviewers_member {
3976 height: 15px;
3976 height: 15px;
3977 padding: 0px 0px 0px 10px;
3977 padding: 0px 0px 0px 10px;
3978 }
3978 }
3979
3979
3980 .emails_wrap {
3980 .emails_wrap {
3981 padding: 0px 20px;
3981 padding: 0px 20px;
3982 }
3982 }
3983
3983
3984 .emails_wrap .email_entry {
3984 .emails_wrap .email_entry {
3985 height: 30px;
3985 height: 30px;
3986 padding: 0px 0px 0px 10px;
3986 padding: 0px 0px 0px 10px;
3987 }
3987 }
3988 .emails_wrap .email_entry .email {
3988 .emails_wrap .email_entry .email {
3989 float: left
3989 float: left
3990 }
3990 }
3991 .emails_wrap .email_entry .email_action {
3991 .emails_wrap .email_entry .email_action {
3992 float: left
3992 float: left
3993 }
3993 }
3994
3994
3995 .ips_wrap {
3995 .ips_wrap {
3996 padding: 0px 20px;
3996 padding: 0px 20px;
3997 }
3997 }
3998
3998
3999 .ips_wrap .ip_entry {
3999 .ips_wrap .ip_entry {
4000 height: 30px;
4000 height: 30px;
4001 padding: 0px 0px 0px 10px;
4001 padding: 0px 0px 0px 10px;
4002 }
4002 }
4003 .ips_wrap .ip_entry .ip {
4003 .ips_wrap .ip_entry .ip {
4004 float: left
4004 float: left
4005 }
4005 }
4006 .ips_wrap .ip_entry .ip_action {
4006 .ips_wrap .ip_entry .ip_action {
4007 float: left
4007 float: left
4008 }
4008 }
4009
4009
4010
4010
4011 /*README STYLE*/
4011 /*README STYLE*/
4012
4012
4013 div.readme {
4013 div.readme {
4014 padding: 0px;
4014 padding: 0px;
4015 }
4015 }
4016
4016
4017 div.readme h2 {
4017 div.readme h2 {
4018 font-weight: normal;
4018 font-weight: normal;
4019 }
4019 }
4020
4020
4021 div.readme .readme_box {
4021 div.readme .readme_box {
4022 background-color: #fafafa;
4022 background-color: #fafafa;
4023 }
4023 }
4024
4024
4025 div.readme .readme_box {
4025 div.readme .readme_box {
4026 clear: both;
4026 clear: both;
4027 overflow: hidden;
4027 overflow: hidden;
4028 margin: 0;
4028 margin: 0;
4029 padding: 0 20px 10px;
4029 padding: 0 20px 10px;
4030 }
4030 }
4031
4031
4032 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
4032 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
4033 border-bottom: 0 !important;
4033 border-bottom: 0 !important;
4034 margin: 0 !important;
4034 margin: 0 !important;
4035 padding: 0 !important;
4035 padding: 0 !important;
4036 line-height: 1.5em !important;
4036 line-height: 1.5em !important;
4037 }
4037 }
4038
4038
4039
4039
4040 div.readme .readme_box h1:first-child {
4040 div.readme .readme_box h1:first-child {
4041 padding-top: .25em !important;
4041 padding-top: .25em !important;
4042 }
4042 }
4043
4043
4044 div.readme .readme_box h2, div.readme .readme_box h3 {
4044 div.readme .readme_box h2, div.readme .readme_box h3 {
4045 margin: 1em 0 !important;
4045 margin: 1em 0 !important;
4046 }
4046 }
4047
4047
4048 div.readme .readme_box h2 {
4048 div.readme .readme_box h2 {
4049 margin-top: 1.5em !important;
4049 margin-top: 1.5em !important;
4050 border-top: 4px solid #e0e0e0 !important;
4050 border-top: 4px solid #e0e0e0 !important;
4051 padding-top: .5em !important;
4051 padding-top: .5em !important;
4052 }
4052 }
4053
4053
4054 div.readme .readme_box p {
4054 div.readme .readme_box p {
4055 color: black !important;
4055 color: black !important;
4056 margin: 1em 0 !important;
4056 margin: 1em 0 !important;
4057 line-height: 1.5em !important;
4057 line-height: 1.5em !important;
4058 }
4058 }
4059
4059
4060 div.readme .readme_box ul {
4060 div.readme .readme_box ul {
4061 list-style: disc !important;
4061 list-style: disc !important;
4062 margin: 1em 0 1em 2em !important;
4062 margin: 1em 0 1em 2em !important;
4063 }
4063 }
4064
4064
4065 div.readme .readme_box ol {
4065 div.readme .readme_box ol {
4066 list-style: decimal;
4066 list-style: decimal;
4067 margin: 1em 0 1em 2em !important;
4067 margin: 1em 0 1em 2em !important;
4068 }
4068 }
4069
4069
4070 div.readme .readme_box pre, code {
4070 div.readme .readme_box pre, code {
4071 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4071 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4072 }
4072 }
4073
4073
4074 div.readme .readme_box code {
4074 div.readme .readme_box code {
4075 font-size: 12px !important;
4075 font-size: 12px !important;
4076 background-color: ghostWhite !important;
4076 background-color: ghostWhite !important;
4077 color: #444 !important;
4077 color: #444 !important;
4078 padding: 0 .2em !important;
4078 padding: 0 .2em !important;
4079 border: 1px solid #dedede !important;
4079 border: 1px solid #dedede !important;
4080 }
4080 }
4081
4081
4082 div.readme .readme_box pre code {
4082 div.readme .readme_box pre code {
4083 padding: 0 !important;
4083 padding: 0 !important;
4084 font-size: 12px !important;
4084 font-size: 12px !important;
4085 background-color: #eee !important;
4085 background-color: #eee !important;
4086 border: none !important;
4086 border: none !important;
4087 }
4087 }
4088
4088
4089 div.readme .readme_box pre {
4089 div.readme .readme_box pre {
4090 margin: 1em 0;
4090 margin: 1em 0;
4091 font-size: 12px;
4091 font-size: 12px;
4092 background-color: #eee;
4092 background-color: #eee;
4093 border: 1px solid #ddd;
4093 border: 1px solid #ddd;
4094 padding: 5px;
4094 padding: 5px;
4095 color: #444;
4095 color: #444;
4096 overflow: auto;
4096 overflow: auto;
4097 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4097 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4098 -webkit-border-radius: 3px;
4098 -webkit-border-radius: 3px;
4099 border-radius: 3px;
4099 border-radius: 3px;
4100 }
4100 }
4101
4101
4102 div.readme .readme_box table {
4102 div.readme .readme_box table {
4103 display: table;
4103 display: table;
4104 border-collapse: separate;
4104 border-collapse: separate;
4105 border-spacing: 2px;
4105 border-spacing: 2px;
4106 border-color: gray;
4106 border-color: gray;
4107 width: auto !important;
4107 width: auto !important;
4108 }
4108 }
4109
4109
4110
4110
4111 /** RST STYLE **/
4111 /** RST STYLE **/
4112
4112
4113
4113
4114 div.rst-block {
4114 div.rst-block {
4115 padding: 0px;
4115 padding: 0px;
4116 }
4116 }
4117
4117
4118 div.rst-block h2 {
4118 div.rst-block h2 {
4119 font-weight: normal;
4119 font-weight: normal;
4120 }
4120 }
4121
4121
4122 div.rst-block {
4122 div.rst-block {
4123 background-color: #fafafa;
4123 background-color: #fafafa;
4124 }
4124 }
4125
4125
4126 div.rst-block {
4126 div.rst-block {
4127 clear: both;
4127 clear: both;
4128 overflow: hidden;
4128 overflow: hidden;
4129 margin: 0;
4129 margin: 0;
4130 padding: 0 20px 10px;
4130 padding: 0 20px 10px;
4131 }
4131 }
4132
4132
4133 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4133 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4134 border-bottom: 0 !important;
4134 border-bottom: 0 !important;
4135 margin: 0 !important;
4135 margin: 0 !important;
4136 padding: 0 !important;
4136 padding: 0 !important;
4137 line-height: 1.5em !important;
4137 line-height: 1.5em !important;
4138 }
4138 }
4139
4139
4140
4140
4141 div.rst-block h1:first-child {
4141 div.rst-block h1:first-child {
4142 padding-top: .25em !important;
4142 padding-top: .25em !important;
4143 }
4143 }
4144
4144
4145 div.rst-block h2, div.rst-block h3 {
4145 div.rst-block h2, div.rst-block h3 {
4146 margin: 1em 0 !important;
4146 margin: 1em 0 !important;
4147 }
4147 }
4148
4148
4149 div.rst-block h2 {
4149 div.rst-block h2 {
4150 margin-top: 1.5em !important;
4150 margin-top: 1.5em !important;
4151 border-top: 4px solid #e0e0e0 !important;
4151 border-top: 4px solid #e0e0e0 !important;
4152 padding-top: .5em !important;
4152 padding-top: .5em !important;
4153 }
4153 }
4154
4154
4155 div.rst-block p {
4155 div.rst-block p {
4156 color: black !important;
4156 color: black !important;
4157 margin: 1em 0 !important;
4157 margin: 1em 0 !important;
4158 line-height: 1.5em !important;
4158 line-height: 1.5em !important;
4159 }
4159 }
4160
4160
4161 div.rst-block ul {
4161 div.rst-block ul {
4162 list-style: disc !important;
4162 list-style: disc !important;
4163 margin: 1em 0 1em 2em !important;
4163 margin: 1em 0 1em 2em !important;
4164 }
4164 }
4165
4165
4166 div.rst-block ol {
4166 div.rst-block ol {
4167 list-style: decimal;
4167 list-style: decimal;
4168 margin: 1em 0 1em 2em !important;
4168 margin: 1em 0 1em 2em !important;
4169 }
4169 }
4170
4170
4171 div.rst-block pre, code {
4171 div.rst-block pre, code {
4172 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4172 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4173 }
4173 }
4174
4174
4175 div.rst-block code {
4175 div.rst-block code {
4176 font-size: 12px !important;
4176 font-size: 12px !important;
4177 background-color: ghostWhite !important;
4177 background-color: ghostWhite !important;
4178 color: #444 !important;
4178 color: #444 !important;
4179 padding: 0 .2em !important;
4179 padding: 0 .2em !important;
4180 border: 1px solid #dedede !important;
4180 border: 1px solid #dedede !important;
4181 }
4181 }
4182
4182
4183 div.rst-block pre code {
4183 div.rst-block pre code {
4184 padding: 0 !important;
4184 padding: 0 !important;
4185 font-size: 12px !important;
4185 font-size: 12px !important;
4186 background-color: #eee !important;
4186 background-color: #eee !important;
4187 border: none !important;
4187 border: none !important;
4188 }
4188 }
4189
4189
4190 div.rst-block pre {
4190 div.rst-block pre {
4191 margin: 1em 0;
4191 margin: 1em 0;
4192 font-size: 12px;
4192 font-size: 12px;
4193 background-color: #eee;
4193 background-color: #eee;
4194 border: 1px solid #ddd;
4194 border: 1px solid #ddd;
4195 padding: 5px;
4195 padding: 5px;
4196 color: #444;
4196 color: #444;
4197 overflow: auto;
4197 overflow: auto;
4198 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4198 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4199 -webkit-border-radius: 3px;
4199 -webkit-border-radius: 3px;
4200 border-radius: 3px;
4200 border-radius: 3px;
4201 }
4201 }
4202
4202
4203
4203
4204 /** comment main **/
4204 /** comment main **/
4205 .comments {
4205 .comments {
4206 padding: 10px 20px;
4206 padding: 10px 20px;
4207 }
4207 }
4208
4208
4209 .comments .comment {
4209 .comments .comment {
4210 border: 1px solid #ddd;
4210 border: 1px solid #ddd;
4211 margin-top: 10px;
4211 margin-top: 10px;
4212 -webkit-border-radius: 4px;
4212 -webkit-border-radius: 4px;
4213 border-radius: 4px;
4213 border-radius: 4px;
4214 }
4214 }
4215
4215
4216 .comments .comment .meta {
4216 .comments .comment .meta {
4217 background: #f8f8f8;
4217 background: #f8f8f8;
4218 padding: 4px;
4218 padding: 4px;
4219 border-bottom: 1px solid #ddd;
4219 border-bottom: 1px solid #ddd;
4220 height: 18px;
4220 height: 18px;
4221 }
4221 }
4222
4222
4223 .comments .comment .meta img {
4223 .comments .comment .meta img {
4224 vertical-align: middle;
4224 vertical-align: middle;
4225 }
4225 }
4226
4226
4227 .comments .comment .meta .user {
4227 .comments .comment .meta .user {
4228 font-weight: bold;
4228 font-weight: bold;
4229 float: left;
4229 float: left;
4230 padding: 4px 2px 2px 2px;
4230 padding: 4px 2px 2px 2px;
4231 }
4231 }
4232
4232
4233 .comments .comment .meta .date {
4233 .comments .comment .meta .date {
4234 float: left;
4234 float: left;
4235 padding: 4px 4px 0px 4px;
4235 padding: 4px 4px 0px 4px;
4236 }
4236 }
4237
4237
4238 .comments .comment .text {
4238 .comments .comment .text {
4239 background-color: #FAFAFA;
4239 background-color: #FAFAFA;
4240 }
4240 }
4241 .comment .text div.rst-block p {
4241 .comment .text div.rst-block p {
4242 margin: 0.5em 0px !important;
4242 margin: 0.5em 0px !important;
4243 }
4243 }
4244
4244
4245 .comments .comments-number {
4245 .comments .comments-number {
4246 padding: 0px 0px 10px 0px;
4246 padding: 0px 0px 10px 0px;
4247 font-weight: bold;
4247 font-weight: bold;
4248 color: #666;
4248 color: #666;
4249 font-size: 16px;
4249 font-size: 16px;
4250 }
4250 }
4251
4251
4252 /** comment form **/
4252 /** comment form **/
4253
4253
4254 .status-block {
4254 .status-block {
4255 min-height: 80px;
4255 min-height: 80px;
4256 clear: both
4256 clear: both
4257 }
4257 }
4258
4258
4259 .comment-form .clearfix {
4259 .comment-form .clearfix {
4260 background: #EEE;
4260 background: #EEE;
4261 -webkit-border-radius: 4px;
4261 -webkit-border-radius: 4px;
4262 border-radius: 4px;
4262 border-radius: 4px;
4263 padding: 10px;
4263 padding: 10px;
4264 }
4264 }
4265
4265
4266 div.comment-form {
4266 div.comment-form {
4267 margin-top: 20px;
4267 margin-top: 20px;
4268 }
4268 }
4269
4269
4270 .comment-form strong {
4270 .comment-form strong {
4271 display: block;
4271 display: block;
4272 margin-bottom: 15px;
4272 margin-bottom: 15px;
4273 }
4273 }
4274
4274
4275 .comment-form textarea {
4275 .comment-form textarea {
4276 width: 100%;
4276 width: 100%;
4277 height: 100px;
4277 height: 100px;
4278 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4278 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4279 }
4279 }
4280
4280
4281 form.comment-form {
4281 form.comment-form {
4282 margin-top: 10px;
4282 margin-top: 10px;
4283 margin-left: 10px;
4283 margin-left: 10px;
4284 }
4284 }
4285
4285
4286 .comment-form-submit {
4286 .comment-form-submit {
4287 margin-top: 5px;
4287 margin-top: 5px;
4288 margin-left: 525px;
4288 margin-left: 525px;
4289 }
4289 }
4290
4290
4291 .file-comments {
4291 .file-comments {
4292 display: none;
4292 display: none;
4293 }
4293 }
4294
4294
4295 .comment-form .comment {
4295 .comment-form .comment {
4296 margin-left: 10px;
4296 margin-left: 10px;
4297 }
4297 }
4298
4298
4299 .comment-form .comment-help {
4299 .comment-form .comment-help {
4300 padding: 0px 0px 5px 0px;
4300 padding: 0px 0px 5px 0px;
4301 color: #666;
4301 color: #666;
4302 }
4302 }
4303
4303
4304 .comment-form .comment-button {
4304 .comment-form .comment-button {
4305 padding-top: 5px;
4305 padding-top: 5px;
4306 }
4306 }
4307
4307
4308 .add-another-button {
4308 .add-another-button {
4309 margin-left: 10px;
4309 margin-left: 10px;
4310 margin-top: 10px;
4310 margin-top: 10px;
4311 margin-bottom: 10px;
4311 margin-bottom: 10px;
4312 }
4312 }
4313
4313
4314 .comment .buttons {
4314 .comment .buttons {
4315 float: right;
4315 float: right;
4316 padding: 2px 2px 0px 0px;
4316 padding: 2px 2px 0px 0px;
4317 }
4317 }
4318
4318
4319
4319
4320 .show-inline-comments {
4320 .show-inline-comments {
4321 position: relative;
4321 position: relative;
4322 top: 1px
4322 top: 1px
4323 }
4323 }
4324
4324
4325 /** comment inline form **/
4325 /** comment inline form **/
4326 .comment-inline-form .overlay {
4326 .comment-inline-form .overlay {
4327 display: none;
4327 display: none;
4328 }
4328 }
4329 .comment-inline-form .overlay.submitting {
4329 .comment-inline-form .overlay.submitting {
4330 display: block;
4330 display: block;
4331 background: none repeat scroll 0 0 white;
4331 background: none repeat scroll 0 0 white;
4332 font-size: 16px;
4332 font-size: 16px;
4333 opacity: 0.5;
4333 opacity: 0.5;
4334 position: absolute;
4334 position: absolute;
4335 text-align: center;
4335 text-align: center;
4336 vertical-align: top;
4336 vertical-align: top;
4337
4337
4338 }
4338 }
4339 .comment-inline-form .overlay.submitting .overlay-text {
4339 .comment-inline-form .overlay.submitting .overlay-text {
4340 width: 100%;
4340 width: 100%;
4341 margin-top: 5%;
4341 margin-top: 5%;
4342 }
4342 }
4343
4343
4344 .comment-inline-form .clearfix {
4344 .comment-inline-form .clearfix {
4345 background: #EEE;
4345 background: #EEE;
4346 -webkit-border-radius: 4px;
4346 -webkit-border-radius: 4px;
4347 border-radius: 4px;
4347 border-radius: 4px;
4348 padding: 5px;
4348 padding: 5px;
4349 }
4349 }
4350
4350
4351 div.comment-inline-form {
4351 div.comment-inline-form {
4352 padding: 4px 0px 6px 0px;
4352 padding: 4px 0px 6px 0px;
4353 }
4353 }
4354
4354
4355
4355
4356 tr.hl-comment {
4356 tr.hl-comment {
4357 /*
4357 /*
4358 background-color: #FFFFCC !important;
4358 background-color: #FFFFCC !important;
4359 */
4359 */
4360 }
4360 }
4361
4361
4362 /*
4362 /*
4363 tr.hl-comment pre {
4363 tr.hl-comment pre {
4364 border-top: 2px solid #FFEE33;
4364 border-top: 2px solid #FFEE33;
4365 border-left: 2px solid #FFEE33;
4365 border-left: 2px solid #FFEE33;
4366 border-right: 2px solid #FFEE33;
4366 border-right: 2px solid #FFEE33;
4367 }
4367 }
4368 */
4368 */
4369
4369
4370 .comment-inline-form strong {
4370 .comment-inline-form strong {
4371 display: block;
4371 display: block;
4372 margin-bottom: 15px;
4372 margin-bottom: 15px;
4373 }
4373 }
4374
4374
4375 .comment-inline-form textarea {
4375 .comment-inline-form textarea {
4376 width: 100%;
4376 width: 100%;
4377 height: 100px;
4377 height: 100px;
4378 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4378 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4379 }
4379 }
4380
4380
4381 form.comment-inline-form {
4381 form.comment-inline-form {
4382 margin-top: 10px;
4382 margin-top: 10px;
4383 margin-left: 10px;
4383 margin-left: 10px;
4384 }
4384 }
4385
4385
4386 .comment-inline-form-submit {
4386 .comment-inline-form-submit {
4387 margin-top: 5px;
4387 margin-top: 5px;
4388 margin-left: 525px;
4388 margin-left: 525px;
4389 }
4389 }
4390
4390
4391 .file-comments {
4391 .file-comments {
4392 display: none;
4392 display: none;
4393 }
4393 }
4394
4394
4395 .comment-inline-form .comment {
4395 .comment-inline-form .comment {
4396 margin-left: 10px;
4396 margin-left: 10px;
4397 }
4397 }
4398
4398
4399 .comment-inline-form .comment-help {
4399 .comment-inline-form .comment-help {
4400 padding: 0px 0px 2px 0px;
4400 padding: 0px 0px 2px 0px;
4401 color: #666666;
4401 color: #666666;
4402 font-size: 10px;
4402 font-size: 10px;
4403 }
4403 }
4404
4404
4405 .comment-inline-form .comment-button {
4405 .comment-inline-form .comment-button {
4406 padding-top: 5px;
4406 padding-top: 5px;
4407 }
4407 }
4408
4408
4409 /** comment inline **/
4409 /** comment inline **/
4410 .inline-comments {
4410 .inline-comments {
4411 padding: 10px 20px;
4411 padding: 10px 20px;
4412 }
4412 }
4413
4413
4414 .inline-comments div.rst-block {
4414 .inline-comments div.rst-block {
4415 clear: both;
4415 clear: both;
4416 overflow: hidden;
4416 overflow: hidden;
4417 margin: 0;
4417 margin: 0;
4418 padding: 0 20px 0px;
4418 padding: 0 20px 0px;
4419 }
4419 }
4420 .inline-comments .comment {
4420 .inline-comments .comment {
4421 border: 1px solid #ddd;
4421 border: 1px solid #ddd;
4422 -webkit-border-radius: 4px;
4422 -webkit-border-radius: 4px;
4423 border-radius: 4px;
4423 border-radius: 4px;
4424 margin: 3px 3px 5px 5px;
4424 margin: 3px 3px 5px 5px;
4425 background-color: #FAFAFA;
4425 background-color: #FAFAFA;
4426 }
4426 }
4427 .inline-comments .add-comment {
4427 .inline-comments .add-comment {
4428 padding: 2px 4px 8px 5px;
4428 padding: 2px 4px 8px 5px;
4429 }
4429 }
4430
4430
4431 .inline-comments .comment-wrapp {
4431 .inline-comments .comment-wrapp {
4432 padding: 1px;
4432 padding: 1px;
4433 }
4433 }
4434 .inline-comments .comment .meta {
4434 .inline-comments .comment .meta {
4435 background: #f8f8f8;
4435 background: #f8f8f8;
4436 padding: 4px;
4436 padding: 4px;
4437 border-bottom: 1px solid #ddd;
4437 border-bottom: 1px solid #ddd;
4438 height: 20px;
4438 height: 20px;
4439 }
4439 }
4440
4440
4441 .inline-comments .comment .meta img {
4441 .inline-comments .comment .meta img {
4442 vertical-align: middle;
4442 vertical-align: middle;
4443 }
4443 }
4444
4444
4445 .inline-comments .comment .meta .user {
4445 .inline-comments .comment .meta .user {
4446 font-weight: bold;
4446 font-weight: bold;
4447 float: left;
4447 float: left;
4448 padding: 3px;
4448 padding: 3px;
4449 }
4449 }
4450
4450
4451 .inline-comments .comment .meta .date {
4451 .inline-comments .comment .meta .date {
4452 float: left;
4452 float: left;
4453 padding: 3px;
4453 padding: 3px;
4454 }
4454 }
4455
4455
4456 .inline-comments .comment .text {
4456 .inline-comments .comment .text {
4457 background-color: #FAFAFA;
4457 background-color: #FAFAFA;
4458 }
4458 }
4459
4459
4460 .inline-comments .comments-number {
4460 .inline-comments .comments-number {
4461 padding: 0px 0px 10px 0px;
4461 padding: 0px 0px 10px 0px;
4462 font-weight: bold;
4462 font-weight: bold;
4463 color: #666;
4463 color: #666;
4464 font-size: 16px;
4464 font-size: 16px;
4465 }
4465 }
4466 .inline-comments-button .add-comment {
4466 .inline-comments-button .add-comment {
4467 margin: 2px 0px 8px 5px !important
4467 margin: 2px 0px 8px 5px !important
4468 }
4468 }
4469
4469
4470
4470
4471 .notification-paginator {
4471 .notification-paginator {
4472 padding: 0px 0px 4px 16px;
4472 padding: 0px 0px 4px 16px;
4473 float: left;
4473 float: left;
4474 }
4474 }
4475
4475
4476 .menu_link_user {
4476 .menu_link_user {
4477 padding: 10px 8px 8px 8px !important;
4477 padding: 10px 8px 8px 8px !important;
4478 }
4478 }
4479
4479
4480 .menu_link_notifications {
4480 .menu_link_notifications {
4481 padding: 4px 4px !important;
4481 padding: 4px 4px !important;
4482 margin: 7px 4px 0px 0px !important;
4482 margin: 7px 4px 0px 0px !important;
4483 text-align: center;
4483 text-align: center;
4484 color: #888 !important;
4484 color: #888 !important;
4485 font-size: 10px;
4485 font-size: 10px;
4486 background-color: #DEDEDE !important;
4486 background-color: #DEDEDE !important;
4487 border-radius: 4px !important;
4487 border-radius: 4px !important;
4488 -webkit-border-radius: 4px !important;
4488 -webkit-border-radius: 4px !important;
4489 }
4489 }
4490
4490
4491 .notification-header {
4491 .notification-header {
4492 padding-top: 6px;
4492 padding-top: 6px;
4493 }
4493 }
4494 .notification-header .desc {
4494 .notification-header .desc {
4495 font-size: 16px;
4495 font-size: 16px;
4496 height: 24px;
4496 height: 24px;
4497 float: left
4497 float: left
4498 }
4498 }
4499 .notification-list .container.unread {
4499 .notification-list .container.unread {
4500 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4500 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4501 }
4501 }
4502 .notification-header .gravatar {
4502 .notification-header .gravatar {
4503 background: none repeat scroll 0 0 transparent;
4503 background: none repeat scroll 0 0 transparent;
4504 padding: 0px 0px 0px 8px;
4504 padding: 0px 0px 0px 8px;
4505 }
4505 }
4506 .notification-list .container .notification-header .desc {
4506 .notification-list .container .notification-header .desc {
4507 font-weight: bold;
4507 font-weight: bold;
4508 font-size: 17px;
4508 font-size: 17px;
4509 }
4509 }
4510 .notification-table {
4510 .notification-table {
4511 border: 1px solid #ccc;
4511 border: 1px solid #ccc;
4512 -webkit-border-radius: 6px 6px 6px 6px;
4512 -webkit-border-radius: 6px 6px 6px 6px;
4513 border-radius: 6px 6px 6px 6px;
4513 border-radius: 6px 6px 6px 6px;
4514 clear: both;
4514 clear: both;
4515 margin: 0px 20px 0px 20px;
4515 margin: 0px 20px 0px 20px;
4516 }
4516 }
4517 .notification-header .delete-notifications {
4517 .notification-header .delete-notifications {
4518 float: right;
4518 float: right;
4519 padding-top: 8px;
4519 padding-top: 8px;
4520 cursor: pointer;
4520 cursor: pointer;
4521 }
4521 }
4522 .notification-header .read-notifications {
4522 .notification-header .read-notifications {
4523 float: right;
4523 float: right;
4524 padding-top: 8px;
4524 padding-top: 8px;
4525 cursor: pointer;
4525 cursor: pointer;
4526 }
4526 }
4527 .notification-subject {
4527 .notification-subject {
4528 clear: both;
4528 clear: both;
4529 border-bottom: 1px solid #eee;
4529 border-bottom: 1px solid #eee;
4530 padding: 5px 0px 5px 38px;
4530 padding: 5px 0px 5px 38px;
4531 }
4531 }
4532
4532
4533 .notification-body {
4533 .notification-body {
4534 clear: both;
4534 clear: both;
4535 margin: 34px 2px 2px 8px
4535 margin: 34px 2px 2px 8px
4536 }
4536 }
4537
4537
4538 /****
4538 /****
4539 PULL REQUESTS
4539 PULL REQUESTS
4540 *****/
4540 *****/
4541 .pullrequests_section_head {
4541 .pullrequests_section_head {
4542 padding: 10px 10px 10px 0px;
4542 padding: 10px 10px 10px 0px;
4543 font-size: 16px;
4543 font-size: 16px;
4544 font-weight: bold;
4544 font-weight: bold;
4545 }
4545 }
4546
4546
4547 /****
4547 /****
4548 PERMS
4548 PERMS
4549 *****/
4549 *****/
4550 #perms .perms_section_head {
4550 #perms .perms_section_head {
4551 padding: 10px 10px 10px 0px;
4551 padding: 10px 10px 10px 0px;
4552 font-size: 16px;
4552 font-size: 16px;
4553 font-weight: bold;
4553 font-weight: bold;
4554 }
4554 }
4555
4555
4556 #perms .perm_tag {
4556 #perms .perm_tag {
4557 padding: 1px 3px 1px 3px;
4557 padding: 1px 3px 1px 3px;
4558 font-size: 10px;
4558 font-size: 10px;
4559 font-weight: bold;
4559 font-weight: bold;
4560 text-transform: uppercase;
4560 text-transform: uppercase;
4561 white-space: nowrap;
4561 white-space: nowrap;
4562 -webkit-border-radius: 3px;
4562 -webkit-border-radius: 3px;
4563 border-radius: 3px;
4563 border-radius: 3px;
4564 }
4564 }
4565
4565
4566 #perms .perm_tag.admin {
4566 #perms .perm_tag.admin {
4567 background-color: #B94A48;
4567 background-color: #B94A48;
4568 color: #ffffff;
4568 color: #ffffff;
4569 }
4569 }
4570
4570
4571 #perms .perm_tag.write {
4571 #perms .perm_tag.write {
4572 background-color: #DB7525;
4572 background-color: #DB7525;
4573 color: #ffffff;
4573 color: #ffffff;
4574 }
4574 }
4575
4575
4576 #perms .perm_tag.read {
4576 #perms .perm_tag.read {
4577 background-color: #468847;
4577 background-color: #468847;
4578 color: #ffffff;
4578 color: #ffffff;
4579 }
4579 }
4580
4580
4581 #perms .perm_tag.none {
4581 #perms .perm_tag.none {
4582 background-color: #bfbfbf;
4582 background-color: #bfbfbf;
4583 color: #ffffff;
4583 color: #ffffff;
4584 }
4584 }
4585
4585
4586 .perm-gravatar {
4586 .perm-gravatar {
4587 vertical-align: middle;
4587 vertical-align: middle;
4588 padding: 2px;
4588 padding: 2px;
4589 }
4589 }
4590 .perm-gravatar-ac {
4590 .perm-gravatar-ac {
4591 vertical-align: middle;
4591 vertical-align: middle;
4592 padding: 2px;
4592 padding: 2px;
4593 width: 14px;
4593 width: 14px;
4594 height: 14px;
4594 height: 14px;
4595 }
4595 }
4596
4596
4597 /*****************************************************************************
4597 /*****************************************************************************
4598 DIFFS CSS
4598 DIFFS CSS
4599 ******************************************************************************/
4599 ******************************************************************************/
4600 .diff-collapse {
4600 .diff-collapse {
4601 text-align: center;
4601 text-align: center;
4602 margin-bottom: -15px;
4602 margin-bottom: -15px;
4603 }
4603 }
4604 .diff-collapse-button {
4604 .diff-collapse-button {
4605 cursor: pointer;
4605 cursor: pointer;
4606 color: #666;
4606 color: #666;
4607 font-size: 16px;
4607 font-size: 16px;
4608 }
4608 }
4609 .diff-container {
4609 .diff-container {
4610
4610
4611 }
4611 }
4612
4612
4613 .diff-container.hidden {
4613 .diff-container.hidden {
4614 display: none;
4614 display: none;
4615 overflow: hidden;
4615 overflow: hidden;
4616 }
4616 }
4617
4617
4618
4618
4619 div.diffblock {
4619 div.diffblock {
4620 overflow: auto;
4620 overflow: auto;
4621 padding: 0px;
4621 padding: 0px;
4622 border: 1px solid #ccc;
4622 border: 1px solid #ccc;
4623 background: #f8f8f8;
4623 background: #f8f8f8;
4624 font-size: 100%;
4624 font-size: 100%;
4625 line-height: 100%;
4625 line-height: 100%;
4626 /* new */
4626 /* new */
4627 line-height: 125%;
4627 line-height: 125%;
4628 -webkit-border-radius: 6px 6px 0px 0px;
4628 -webkit-border-radius: 6px 6px 0px 0px;
4629 border-radius: 6px 6px 0px 0px;
4629 border-radius: 6px 6px 0px 0px;
4630 }
4630 }
4631 div.diffblock.margined {
4631 div.diffblock.margined {
4632 margin: 0px 20px 0px 20px;
4632 margin: 0px 20px 0px 20px;
4633 }
4633 }
4634 div.diffblock .code-header {
4634 div.diffblock .code-header {
4635 border-bottom: 1px solid #CCCCCC;
4635 border-bottom: 1px solid #CCCCCC;
4636 background: #EEEEEE;
4636 background: #EEEEEE;
4637 padding: 10px 0 10px 0;
4637 padding: 10px 0 10px 0;
4638 height: 14px;
4638 height: 14px;
4639 }
4639 }
4640
4640
4641 div.diffblock .code-header.banner {
4641 div.diffblock .code-header.banner {
4642 border-bottom: 1px solid #CCCCCC;
4642 border-bottom: 1px solid #CCCCCC;
4643 background: #EEEEEE;
4643 background: #EEEEEE;
4644 height: 14px;
4644 height: 14px;
4645 margin: 0px 95px 0px 95px;
4645 margin: 0px 95px 0px 95px;
4646 padding: 3px 3px 11px 3px;
4646 padding: 3px 3px 11px 3px;
4647 }
4647 }
4648
4648
4649 div.diffblock .code-header.cv {
4649 div.diffblock .code-header.cv {
4650 height: 34px;
4650 height: 34px;
4651 }
4651 }
4652 div.diffblock .code-header-title {
4652 div.diffblock .code-header-title {
4653 padding: 0px 0px 10px 5px !important;
4653 padding: 0px 0px 10px 5px !important;
4654 margin: 0 !important;
4654 margin: 0 !important;
4655 }
4655 }
4656 div.diffblock .code-header .hash {
4656 div.diffblock .code-header .hash {
4657 float: left;
4657 float: left;
4658 padding: 2px 0 0 2px;
4658 padding: 2px 0 0 2px;
4659 }
4659 }
4660 div.diffblock .code-header .date {
4660 div.diffblock .code-header .date {
4661 float: left;
4661 float: left;
4662 text-transform: uppercase;
4662 text-transform: uppercase;
4663 padding: 2px 0px 0px 2px;
4663 padding: 2px 0px 0px 2px;
4664 }
4664 }
4665 div.diffblock .code-header div {
4665 div.diffblock .code-header div {
4666 margin-left: 4px;
4666 margin-left: 4px;
4667 font-weight: bold;
4667 font-weight: bold;
4668 font-size: 14px;
4668 font-size: 14px;
4669 }
4669 }
4670
4670
4671 div.diffblock .parents {
4671 div.diffblock .parents {
4672 float: left;
4672 float: left;
4673 height: 26px;
4673 height: 26px;
4674 width: 100px;
4674 width: 100px;
4675 font-size: 10px;
4675 font-size: 10px;
4676 font-weight: 400;
4676 font-weight: 400;
4677 vertical-align: middle;
4677 vertical-align: middle;
4678 padding: 0px 2px 2px 2px;
4678 padding: 0px 2px 2px 2px;
4679 background-color: #eeeeee;
4679 background-color: #eeeeee;
4680 border-bottom: 1px solid #CCCCCC;
4680 border-bottom: 1px solid #CCCCCC;
4681 }
4681 }
4682
4682
4683 div.diffblock .children {
4683 div.diffblock .children {
4684 float: right;
4684 float: right;
4685 height: 26px;
4685 height: 26px;
4686 width: 100px;
4686 width: 100px;
4687 font-size: 10px;
4687 font-size: 10px;
4688 font-weight: 400;
4688 font-weight: 400;
4689 vertical-align: middle;
4689 vertical-align: middle;
4690 text-align: right;
4690 text-align: right;
4691 padding: 0px 2px 2px 2px;
4691 padding: 0px 2px 2px 2px;
4692 background-color: #eeeeee;
4692 background-color: #eeeeee;
4693 border-bottom: 1px solid #CCCCCC;
4693 border-bottom: 1px solid #CCCCCC;
4694 }
4694 }
4695
4695
4696 div.diffblock .code-body {
4696 div.diffblock .code-body {
4697 background: #FFFFFF;
4697 background: #FFFFFF;
4698 }
4698 }
4699 div.diffblock pre.raw {
4699 div.diffblock pre.raw {
4700 background: #FFFFFF;
4700 background: #FFFFFF;
4701 color: #000000;
4701 color: #000000;
4702 }
4702 }
4703 table.code-difftable {
4703 table.code-difftable {
4704 border-collapse: collapse;
4704 border-collapse: collapse;
4705 width: 99%;
4705 width: 99%;
4706 border-radius: 0px !important;
4706 border-radius: 0px !important;
4707 }
4707 }
4708 table.code-difftable td {
4708 table.code-difftable td {
4709 padding: 0 !important;
4709 padding: 0 !important;
4710 background: none !important;
4710 background: none !important;
4711 border: 0 !important;
4711 border: 0 !important;
4712 vertical-align: baseline !important
4712 vertical-align: baseline !important
4713 }
4713 }
4714 table.code-difftable .context {
4714 table.code-difftable .context {
4715 background: none repeat scroll 0 0 #DDE7EF;
4715 background: none repeat scroll 0 0 #DDE7EF;
4716 }
4716 }
4717 table.code-difftable .add {
4717 table.code-difftable .add {
4718 background: none repeat scroll 0 0 #DDFFDD;
4718 background: none repeat scroll 0 0 #DDFFDD;
4719 }
4719 }
4720 table.code-difftable .add ins {
4720 table.code-difftable .add ins {
4721 background: none repeat scroll 0 0 #AAFFAA;
4721 background: none repeat scroll 0 0 #AAFFAA;
4722 text-decoration: none;
4722 text-decoration: none;
4723 }
4723 }
4724 table.code-difftable .del {
4724 table.code-difftable .del {
4725 background: none repeat scroll 0 0 #FFDDDD;
4725 background: none repeat scroll 0 0 #FFDDDD;
4726 }
4726 }
4727 table.code-difftable .del del {
4727 table.code-difftable .del del {
4728 background: none repeat scroll 0 0 #FFAAAA;
4728 background: none repeat scroll 0 0 #FFAAAA;
4729 text-decoration: none;
4729 text-decoration: none;
4730 }
4730 }
4731
4731
4732 /** LINE NUMBERS **/
4732 /** LINE NUMBERS **/
4733 table.code-difftable .lineno {
4733 table.code-difftable .lineno {
4734
4734
4735 padding-left: 2px;
4735 padding-left: 2px;
4736 padding-right: 2px;
4736 padding-right: 2px;
4737 text-align: right;
4737 text-align: right;
4738 width: 32px;
4738 width: 32px;
4739 -moz-user-select: none;
4739 -moz-user-select: none;
4740 -webkit-user-select: none;
4740 -webkit-user-select: none;
4741 border-right: 1px solid #CCC !important;
4741 border-right: 1px solid #CCC !important;
4742 border-left: 0px solid #CCC !important;
4742 border-left: 0px solid #CCC !important;
4743 border-top: 0px solid #CCC !important;
4743 border-top: 0px solid #CCC !important;
4744 border-bottom: none !important;
4744 border-bottom: none !important;
4745 vertical-align: middle !important;
4745 vertical-align: middle !important;
4746
4746
4747 }
4747 }
4748 table.code-difftable .lineno.new {
4748 table.code-difftable .lineno.new {
4749 }
4749 }
4750 table.code-difftable .lineno.old {
4750 table.code-difftable .lineno.old {
4751 }
4751 }
4752 table.code-difftable .lineno a {
4752 table.code-difftable .lineno a {
4753 color: #747474 !important;
4753 color: #747474 !important;
4754 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4754 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4755 letter-spacing: -1px;
4755 letter-spacing: -1px;
4756 text-align: right;
4756 text-align: right;
4757 padding-right: 2px;
4757 padding-right: 2px;
4758 cursor: pointer;
4758 cursor: pointer;
4759 display: block;
4759 display: block;
4760 width: 32px;
4760 width: 32px;
4761 }
4761 }
4762
4762
4763 table.code-difftable .lineno-inline {
4763 table.code-difftable .lineno-inline {
4764 background: none repeat scroll 0 0 #FFF !important;
4764 background: none repeat scroll 0 0 #FFF !important;
4765 padding-left: 2px;
4765 padding-left: 2px;
4766 padding-right: 2px;
4766 padding-right: 2px;
4767 text-align: right;
4767 text-align: right;
4768 width: 30px;
4768 width: 30px;
4769 -moz-user-select: none;
4769 -moz-user-select: none;
4770 -webkit-user-select: none;
4770 -webkit-user-select: none;
4771 }
4771 }
4772
4772
4773 /** CODE **/
4773 /** CODE **/
4774 table.code-difftable .code {
4774 table.code-difftable .code {
4775 display: block;
4775 display: block;
4776 width: 100%;
4776 width: 100%;
4777 }
4777 }
4778 table.code-difftable .code td {
4778 table.code-difftable .code td {
4779 margin: 0;
4779 margin: 0;
4780 padding: 0;
4780 padding: 0;
4781 }
4781 }
4782 table.code-difftable .code pre {
4782 table.code-difftable .code pre {
4783 margin: 0;
4783 margin: 0;
4784 padding: 0;
4784 padding: 0;
4785 height: 17px;
4785 height: 17px;
4786 line-height: 17px;
4786 line-height: 17px;
4787 }
4787 }
4788
4788
4789
4789
4790 .diffblock.margined.comm .line .code:hover {
4790 .diffblock.margined.comm .line .code:hover {
4791 background-color: #FFFFCC !important;
4791 background-color: #FFFFCC !important;
4792 cursor: pointer !important;
4792 cursor: pointer !important;
4793 background-image: url("../images/icons/comment_add.png") !important;
4793 background-image: url("../images/icons/comment_add.png") !important;
4794 background-repeat: no-repeat !important;
4794 background-repeat: no-repeat !important;
4795 background-position: right !important;
4795 background-position: right !important;
4796 background-position: 0% 50% !important;
4796 background-position: 0% 50% !important;
4797 }
4797 }
4798 .diffblock.margined.comm .line .code.no-comment:hover {
4798 .diffblock.margined.comm .line .code.no-comment:hover {
4799 background-image: none !important;
4799 background-image: none !important;
4800 cursor: auto !important;
4800 cursor: auto !important;
4801 background-color: inherit !important;
4801 background-color: inherit !important;
4802 }
4802 }
4803
4803
4804 div.comment:target>.comment-wrapp {
4804 div.comment:target>.comment-wrapp {
4805 border: solid 2px #ee0 !important;
4805 border: solid 2px #ee0 !important;
4806 }
4806 }
4807
4807
4808 .lineno:target a {
4808 .lineno:target a {
4809 border: solid 2px #ee0 !important;
4809 border: solid 2px #ee0 !important;
4810 margin: -2px;
4810 margin: -2px;
4811 }
4811 } No newline at end of file
@@ -1,94 +1,94 b''
1 <div>
1 <div>
2 ${h.form(url('admin_settings_my_account_update'),method='put')}
2 ${h.form(url('admin_settings_my_account_update'),method='put')}
3 <div class="form">
3 <div class="form">
4
4
5 <div class="field">
5 <div class="field">
6 <div class="gravatar_box">
6 <div class="gravatar_box">
7 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(c.user.email)}"/></div>
7 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(c.user.email)}"/></div>
8 <p>
8 <p>
9 %if c.use_gravatar:
9 %if c.use_gravatar:
10 <strong>${_('Change your avatar at')} <a href="http://gravatar.com">gravatar.com</a></strong>
10 <strong>${_('Change your avatar at')} <a href="http://gravatar.com">gravatar.com</a></strong>
11 <br/>${_('Using')} ${c.user.email}
11 <br/>${_('Using')} ${c.user.email}
12 %else:
12 %else:
13 <br/>${c.user.email}
13 <br/>${c.user.email}
14 %endif
14 %endif
15 </p>
15 </p>
16 </div>
16 </div>
17 </div>
17 </div>
18 <div class="field">
18 <div class="field">
19 <div class="label">
19 <div class="label">
20 <label>${_('API key')}</label> ${c.user.api_key}
20 <label>${_('API key')}</label> ${c.user.api_key}
21 </div>
21 </div>
22 </div>
22 </div>
23 <div class="field">
23 <div class="field">
24 <div class="label">
24 <div class="label">
25 <label>${_('Current IP')}:</label> ${c.perm_user.ip_addr or "?"}
25 <label>${_('Current IP')}:</label> ${c.perm_user.ip_addr or "?"}
26 </div>
26 </div>
27 </div>
27 </div>
28 <div class="fields">
28 <div class="fields">
29 <div class="field">
29 <div class="field">
30 <div class="label">
30 <div class="label">
31 <label for="username">${_('Username')}:</label>
31 <label for="username">${_('Username')}:</label>
32 </div>
32 </div>
33 <div class="input">
33 <div class="input">
34 %if c.ldap_dn:
34 %if c.ldap_dn:
35 ${h.text('username',class_='medium disabled', readonly="readonly")}
35 ${h.text('username',class_='medium disabled', readonly="readonly")}
36 %else:
36 %else:
37 ${h.text('username',class_='medium')}
37 ${h.text('username',class_='medium')}
38 %endif:
38 %endif:
39 </div>
39 </div>
40 </div>
40 </div>
41
41
42 <div class="field">
42 <div class="field">
43 <div class="label">
43 <div class="label">
44 <label for="new_password">${_('New password')}:</label>
44 <label for="new_password">${_('New password')}:</label>
45 </div>
45 </div>
46 <div class="input">
46 <div class="input">
47 ${h.password('new_password',class_="medium",autocomplete="off")}
47 ${h.password('new_password',class_="medium",autocomplete="off")}
48 </div>
48 </div>
49 </div>
49 </div>
50
50
51 <div class="field">
51 <div class="field">
52 <div class="label">
52 <div class="label">
53 <label for="password_confirmation">${_('New password confirmation')}:</label>
53 <label for="password_confirmation">${_('New password confirmation')}:</label>
54 </div>
54 </div>
55 <div class="input">
55 <div class="input">
56 ${h.password('password_confirmation',class_="medium",autocomplete="off")}
56 ${h.password('password_confirmation',class_="medium",autocomplete="off")}
57 </div>
57 </div>
58 </div>
58 </div>
59
59
60 <div class="field">
60 <div class="field">
61 <div class="label">
61 <div class="label">
62 <label for="name">${_('First Name')}:</label>
62 <label for="name">${_('First Name')}:</label>
63 </div>
63 </div>
64 <div class="input">
64 <div class="input">
65 ${h.text('firstname',class_="medium")}
65 ${h.text('firstname',class_="medium")}
66 </div>
66 </div>
67 </div>
67 </div>
68
68
69 <div class="field">
69 <div class="field">
70 <div class="label">
70 <div class="label">
71 <label for="lastname">${_('Last Name')}:</label>
71 <label for="lastname">${_('Last Name')}:</label>
72 </div>
72 </div>
73 <div class="input">
73 <div class="input">
74 ${h.text('lastname',class_="medium")}
74 ${h.text('lastname',class_="medium")}
75 </div>
75 </div>
76 </div>
76 </div>
77
77
78 <div class="field">
78 <div class="field">
79 <div class="label">
79 <div class="label">
80 <label for="email">${_('Email')}:</label>
80 <label for="email">${_('Email')}:</label>
81 </div>
81 </div>
82 <div class="input">
82 <div class="input">
83 ${h.text('email',class_="medium")}
83 ${h.text('email',class_="medium")}
84 </div>
84 </div>
85 </div>
85 </div>
86
86
87 <div class="buttons">
87 <div class="buttons">
88 ${h.submit('save',_('Save'),class_="ui-btn large")}
88 ${h.submit('save',_('Save'),class_="ui-btn large")}
89 ${h.reset('reset',_('Reset'),class_="ui-btn large")}
89 ${h.reset('reset',_('Reset'),class_="ui-btn large")}
90 </div>
90 </div>
91 </div>
91 </div>
92 </div>
92 </div>
93 ${h.end_form()}
93 ${h.end_form()}
94 </div>
94 </div>
General Comments 0
You need to be logged in to leave comments. Login now