##// END OF EJS Templates
implemented #725 Pull Request View - Show origin repo URL
marcink -
r3170:2ab2eed4 beta
parent child Browse files
Show More
@@ -1,1920 +1,1947 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
47
48 from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
48 from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
49 safe_unicode, remove_suffix, remove_prefix
49 safe_unicode, remove_suffix, remove_prefix
50 from rhodecode.lib.compat import json
50 from rhodecode.lib.compat import json
51 from rhodecode.lib.caching_query import FromCache
51 from rhodecode.lib.caching_query import FromCache
52
52
53 from rhodecode.model.meta import Base, Session
53 from rhodecode.model.meta import Base, Session
54
54
55 URL_SEP = '/'
55 URL_SEP = '/'
56 log = logging.getLogger(__name__)
56 log = logging.getLogger(__name__)
57
57
58 #==============================================================================
58 #==============================================================================
59 # BASE CLASSES
59 # BASE CLASSES
60 #==============================================================================
60 #==============================================================================
61
61
62 _hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest()
62 _hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest()
63
63
64
64
65 class BaseModel(object):
65 class BaseModel(object):
66 """
66 """
67 Base Model for all classess
67 Base Model for all classess
68 """
68 """
69
69
70 @classmethod
70 @classmethod
71 def _get_keys(cls):
71 def _get_keys(cls):
72 """return column names for this model """
72 """return column names for this model """
73 return class_mapper(cls).c.keys()
73 return class_mapper(cls).c.keys()
74
74
75 def get_dict(self):
75 def get_dict(self):
76 """
76 """
77 return dict with keys and values corresponding
77 return dict with keys and values corresponding
78 to this model data """
78 to this model data """
79
79
80 d = {}
80 d = {}
81 for k in self._get_keys():
81 for k in self._get_keys():
82 d[k] = getattr(self, k)
82 d[k] = getattr(self, k)
83
83
84 # also use __json__() if present to get additional fields
84 # also use __json__() if present to get additional fields
85 _json_attr = getattr(self, '__json__', None)
85 _json_attr = getattr(self, '__json__', None)
86 if _json_attr:
86 if _json_attr:
87 # update with attributes from __json__
87 # update with attributes from __json__
88 if callable(_json_attr):
88 if callable(_json_attr):
89 _json_attr = _json_attr()
89 _json_attr = _json_attr()
90 for k, val in _json_attr.iteritems():
90 for k, val in _json_attr.iteritems():
91 d[k] = val
91 d[k] = val
92 return d
92 return d
93
93
94 def get_appstruct(self):
94 def get_appstruct(self):
95 """return list with keys and values tupples corresponding
95 """return list with keys and values tupples corresponding
96 to this model data """
96 to this model data """
97
97
98 l = []
98 l = []
99 for k in self._get_keys():
99 for k in self._get_keys():
100 l.append((k, getattr(self, k),))
100 l.append((k, getattr(self, k),))
101 return l
101 return l
102
102
103 def populate_obj(self, populate_dict):
103 def populate_obj(self, populate_dict):
104 """populate model with data from given populate_dict"""
104 """populate model with data from given populate_dict"""
105
105
106 for k in self._get_keys():
106 for k in self._get_keys():
107 if k in populate_dict:
107 if k in populate_dict:
108 setattr(self, k, populate_dict[k])
108 setattr(self, k, populate_dict[k])
109
109
110 @classmethod
110 @classmethod
111 def query(cls):
111 def query(cls):
112 return Session().query(cls)
112 return Session().query(cls)
113
113
114 @classmethod
114 @classmethod
115 def get(cls, id_):
115 def get(cls, id_):
116 if id_:
116 if id_:
117 return cls.query().get(id_)
117 return cls.query().get(id_)
118
118
119 @classmethod
119 @classmethod
120 def get_or_404(cls, id_):
120 def get_or_404(cls, id_):
121 try:
121 try:
122 id_ = int(id_)
122 id_ = int(id_)
123 except (TypeError, ValueError):
123 except (TypeError, ValueError):
124 raise HTTPNotFound
124 raise HTTPNotFound
125
125
126 res = cls.query().get(id_)
126 res = cls.query().get(id_)
127 if not res:
127 if not res:
128 raise HTTPNotFound
128 raise HTTPNotFound
129 return res
129 return res
130
130
131 @classmethod
131 @classmethod
132 def getAll(cls):
132 def getAll(cls):
133 return cls.query().all()
133 return cls.query().all()
134
134
135 @classmethod
135 @classmethod
136 def delete(cls, id_):
136 def delete(cls, id_):
137 obj = cls.query().get(id_)
137 obj = cls.query().get(id_)
138 Session().delete(obj)
138 Session().delete(obj)
139
139
140 def __repr__(self):
140 def __repr__(self):
141 if hasattr(self, '__unicode__'):
141 if hasattr(self, '__unicode__'):
142 # python repr needs to return str
142 # python repr needs to return str
143 return safe_str(self.__unicode__())
143 return safe_str(self.__unicode__())
144 return '<DB:%s>' % (self.__class__.__name__)
144 return '<DB:%s>' % (self.__class__.__name__)
145
145
146
146
147 class RhodeCodeSetting(Base, BaseModel):
147 class RhodeCodeSetting(Base, BaseModel):
148 __tablename__ = 'rhodecode_settings'
148 __tablename__ = 'rhodecode_settings'
149 __table_args__ = (
149 __table_args__ = (
150 UniqueConstraint('app_settings_name'),
150 UniqueConstraint('app_settings_name'),
151 {'extend_existing': True, 'mysql_engine': 'InnoDB',
151 {'extend_existing': True, 'mysql_engine': 'InnoDB',
152 'mysql_charset': 'utf8'}
152 'mysql_charset': 'utf8'}
153 )
153 )
154 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
154 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
155 app_settings_name = Column("app_settings_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
155 app_settings_name = Column("app_settings_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
156 _app_settings_value = Column("app_settings_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
156 _app_settings_value = Column("app_settings_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
157
157
158 def __init__(self, k='', v=''):
158 def __init__(self, k='', v=''):
159 self.app_settings_name = k
159 self.app_settings_name = k
160 self.app_settings_value = v
160 self.app_settings_value = v
161
161
162 @validates('_app_settings_value')
162 @validates('_app_settings_value')
163 def validate_settings_value(self, key, val):
163 def validate_settings_value(self, key, val):
164 assert type(val) == unicode
164 assert type(val) == unicode
165 return val
165 return val
166
166
167 @hybrid_property
167 @hybrid_property
168 def app_settings_value(self):
168 def app_settings_value(self):
169 v = self._app_settings_value
169 v = self._app_settings_value
170 if self.app_settings_name in ["ldap_active",
170 if self.app_settings_name in ["ldap_active",
171 "default_repo_enable_statistics",
171 "default_repo_enable_statistics",
172 "default_repo_enable_locking",
172 "default_repo_enable_locking",
173 "default_repo_private",
173 "default_repo_private",
174 "default_repo_enable_downloads"]:
174 "default_repo_enable_downloads"]:
175 v = str2bool(v)
175 v = str2bool(v)
176 return v
176 return v
177
177
178 @app_settings_value.setter
178 @app_settings_value.setter
179 def app_settings_value(self, val):
179 def app_settings_value(self, val):
180 """
180 """
181 Setter that will always make sure we use unicode in app_settings_value
181 Setter that will always make sure we use unicode in app_settings_value
182
182
183 :param val:
183 :param val:
184 """
184 """
185 self._app_settings_value = safe_unicode(val)
185 self._app_settings_value = safe_unicode(val)
186
186
187 def __unicode__(self):
187 def __unicode__(self):
188 return u"<%s('%s:%s')>" % (
188 return u"<%s('%s:%s')>" % (
189 self.__class__.__name__,
189 self.__class__.__name__,
190 self.app_settings_name, self.app_settings_value
190 self.app_settings_name, self.app_settings_value
191 )
191 )
192
192
193 @classmethod
193 @classmethod
194 def get_by_name(cls, key):
194 def get_by_name(cls, key):
195 return cls.query()\
195 return cls.query()\
196 .filter(cls.app_settings_name == key).scalar()
196 .filter(cls.app_settings_name == key).scalar()
197
197
198 @classmethod
198 @classmethod
199 def get_by_name_or_create(cls, key):
199 def get_by_name_or_create(cls, key):
200 res = cls.get_by_name(key)
200 res = cls.get_by_name(key)
201 if not res:
201 if not res:
202 res = cls(key)
202 res = cls(key)
203 return res
203 return res
204
204
205 @classmethod
205 @classmethod
206 def get_app_settings(cls, cache=False):
206 def get_app_settings(cls, cache=False):
207
207
208 ret = cls.query()
208 ret = cls.query()
209
209
210 if cache:
210 if cache:
211 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
211 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
212
212
213 if not ret:
213 if not ret:
214 raise Exception('Could not get application settings !')
214 raise Exception('Could not get application settings !')
215 settings = {}
215 settings = {}
216 for each in ret:
216 for each in ret:
217 settings['rhodecode_' + each.app_settings_name] = \
217 settings['rhodecode_' + each.app_settings_name] = \
218 each.app_settings_value
218 each.app_settings_value
219
219
220 return settings
220 return settings
221
221
222 @classmethod
222 @classmethod
223 def get_ldap_settings(cls, cache=False):
223 def get_ldap_settings(cls, cache=False):
224 ret = cls.query()\
224 ret = cls.query()\
225 .filter(cls.app_settings_name.startswith('ldap_')).all()
225 .filter(cls.app_settings_name.startswith('ldap_')).all()
226 fd = {}
226 fd = {}
227 for row in ret:
227 for row in ret:
228 fd.update({row.app_settings_name: row.app_settings_value})
228 fd.update({row.app_settings_name: row.app_settings_value})
229
229
230 return fd
230 return fd
231
231
232 @classmethod
232 @classmethod
233 def get_default_repo_settings(cls, cache=False, strip_prefix=False):
233 def get_default_repo_settings(cls, cache=False, strip_prefix=False):
234 ret = cls.query()\
234 ret = cls.query()\
235 .filter(cls.app_settings_name.startswith('default_')).all()
235 .filter(cls.app_settings_name.startswith('default_')).all()
236 fd = {}
236 fd = {}
237 for row in ret:
237 for row in ret:
238 key = row.app_settings_name
238 key = row.app_settings_name
239 if strip_prefix:
239 if strip_prefix:
240 key = remove_prefix(key, prefix='default_')
240 key = remove_prefix(key, prefix='default_')
241 fd.update({key: row.app_settings_value})
241 fd.update({key: row.app_settings_value})
242
242
243 return fd
243 return fd
244
244
245
245
246 class RhodeCodeUi(Base, BaseModel):
246 class RhodeCodeUi(Base, BaseModel):
247 __tablename__ = 'rhodecode_ui'
247 __tablename__ = 'rhodecode_ui'
248 __table_args__ = (
248 __table_args__ = (
249 UniqueConstraint('ui_key'),
249 UniqueConstraint('ui_key'),
250 {'extend_existing': True, 'mysql_engine': 'InnoDB',
250 {'extend_existing': True, 'mysql_engine': 'InnoDB',
251 'mysql_charset': 'utf8'}
251 'mysql_charset': 'utf8'}
252 )
252 )
253
253
254 HOOK_UPDATE = 'changegroup.update'
254 HOOK_UPDATE = 'changegroup.update'
255 HOOK_REPO_SIZE = 'changegroup.repo_size'
255 HOOK_REPO_SIZE = 'changegroup.repo_size'
256 HOOK_PUSH = 'changegroup.push_logger'
256 HOOK_PUSH = 'changegroup.push_logger'
257 HOOK_PRE_PUSH = 'prechangegroup.pre_push'
257 HOOK_PRE_PUSH = 'prechangegroup.pre_push'
258 HOOK_PULL = 'outgoing.pull_logger'
258 HOOK_PULL = 'outgoing.pull_logger'
259 HOOK_PRE_PULL = 'preoutgoing.pre_pull'
259 HOOK_PRE_PULL = 'preoutgoing.pre_pull'
260
260
261 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
261 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
262 ui_section = Column("ui_section", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
262 ui_section = Column("ui_section", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
263 ui_key = Column("ui_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
263 ui_key = Column("ui_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
264 ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
264 ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
265 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
265 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
266
266
267 @classmethod
267 @classmethod
268 def get_by_key(cls, key):
268 def get_by_key(cls, key):
269 return cls.query().filter(cls.ui_key == key).scalar()
269 return cls.query().filter(cls.ui_key == key).scalar()
270
270
271 @classmethod
271 @classmethod
272 def get_builtin_hooks(cls):
272 def get_builtin_hooks(cls):
273 q = cls.query()
273 q = cls.query()
274 q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
274 q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
275 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
275 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
276 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
276 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
277 return q.all()
277 return q.all()
278
278
279 @classmethod
279 @classmethod
280 def get_custom_hooks(cls):
280 def get_custom_hooks(cls):
281 q = cls.query()
281 q = cls.query()
282 q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
282 q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
283 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
283 cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
284 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
284 cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
285 q = q.filter(cls.ui_section == 'hooks')
285 q = q.filter(cls.ui_section == 'hooks')
286 return q.all()
286 return q.all()
287
287
288 @classmethod
288 @classmethod
289 def get_repos_location(cls):
289 def get_repos_location(cls):
290 return cls.get_by_key('/').ui_value
290 return cls.get_by_key('/').ui_value
291
291
292 @classmethod
292 @classmethod
293 def create_or_update_hook(cls, key, val):
293 def create_or_update_hook(cls, key, val):
294 new_ui = cls.get_by_key(key) or cls()
294 new_ui = cls.get_by_key(key) or cls()
295 new_ui.ui_section = 'hooks'
295 new_ui.ui_section = 'hooks'
296 new_ui.ui_active = True
296 new_ui.ui_active = True
297 new_ui.ui_key = key
297 new_ui.ui_key = key
298 new_ui.ui_value = val
298 new_ui.ui_value = val
299
299
300 Session().add(new_ui)
300 Session().add(new_ui)
301
301
302 def __repr__(self):
302 def __repr__(self):
303 return '<DB:%s[%s:%s]>' % (self.__class__.__name__, self.ui_key,
303 return '<DB:%s[%s:%s]>' % (self.__class__.__name__, self.ui_key,
304 self.ui_value)
304 self.ui_value)
305
305
306
306
307 class User(Base, BaseModel):
307 class User(Base, BaseModel):
308 __tablename__ = 'users'
308 __tablename__ = 'users'
309 __table_args__ = (
309 __table_args__ = (
310 UniqueConstraint('username'), UniqueConstraint('email'),
310 UniqueConstraint('username'), UniqueConstraint('email'),
311 Index('u_username_idx', 'username'),
311 Index('u_username_idx', 'username'),
312 Index('u_email_idx', 'email'),
312 Index('u_email_idx', 'email'),
313 {'extend_existing': True, 'mysql_engine': 'InnoDB',
313 {'extend_existing': True, 'mysql_engine': 'InnoDB',
314 'mysql_charset': 'utf8'}
314 'mysql_charset': 'utf8'}
315 )
315 )
316 DEFAULT_USER = 'default'
316 DEFAULT_USER = 'default'
317 DEFAULT_PERMISSIONS = [
317 DEFAULT_PERMISSIONS = [
318 'hg.register.manual_activate', 'hg.create.repository',
318 'hg.register.manual_activate', 'hg.create.repository',
319 'hg.fork.repository', 'repository.read', 'group.read'
319 'hg.fork.repository', 'repository.read', 'group.read'
320 ]
320 ]
321 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
321 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
322 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
322 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
323 password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
323 password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
324 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
324 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
325 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
325 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
326 name = Column("firstname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
326 name = Column("firstname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
327 lastname = Column("lastname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
327 lastname = Column("lastname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
328 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
328 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
329 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
329 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
330 ldap_dn = Column("ldap_dn", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
330 ldap_dn = Column("ldap_dn", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
331 api_key = Column("api_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
331 api_key = Column("api_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
332 inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
332 inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
333
333
334 user_log = relationship('UserLog')
334 user_log = relationship('UserLog')
335 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
335 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
336
336
337 repositories = relationship('Repository')
337 repositories = relationship('Repository')
338 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
338 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
339 followings = relationship('UserFollowing', primaryjoin='UserFollowing.user_id==User.user_id', cascade='all')
339 followings = relationship('UserFollowing', primaryjoin='UserFollowing.user_id==User.user_id', cascade='all')
340
340
341 repo_to_perm = relationship('UserRepoToPerm', primaryjoin='UserRepoToPerm.user_id==User.user_id', cascade='all')
341 repo_to_perm = relationship('UserRepoToPerm', primaryjoin='UserRepoToPerm.user_id==User.user_id', cascade='all')
342 repo_group_to_perm = relationship('UserRepoGroupToPerm', primaryjoin='UserRepoGroupToPerm.user_id==User.user_id', cascade='all')
342 repo_group_to_perm = relationship('UserRepoGroupToPerm', primaryjoin='UserRepoGroupToPerm.user_id==User.user_id', cascade='all')
343
343
344 group_member = relationship('UsersGroupMember', cascade='all')
344 group_member = relationship('UsersGroupMember', cascade='all')
345
345
346 notifications = relationship('UserNotification', cascade='all')
346 notifications = relationship('UserNotification', cascade='all')
347 # notifications assigned to this user
347 # notifications assigned to this user
348 user_created_notifications = relationship('Notification', cascade='all')
348 user_created_notifications = relationship('Notification', cascade='all')
349 # comments created by this user
349 # comments created by this user
350 user_comments = relationship('ChangesetComment', cascade='all')
350 user_comments = relationship('ChangesetComment', cascade='all')
351 #extra emails for this user
351 #extra emails for this user
352 user_emails = relationship('UserEmailMap', cascade='all')
352 user_emails = relationship('UserEmailMap', cascade='all')
353
353
354 @hybrid_property
354 @hybrid_property
355 def email(self):
355 def email(self):
356 return self._email
356 return self._email
357
357
358 @email.setter
358 @email.setter
359 def email(self, val):
359 def email(self, val):
360 self._email = val.lower() if val else None
360 self._email = val.lower() if val else None
361
361
362 @property
362 @property
363 def firstname(self):
363 def firstname(self):
364 # alias for future
364 # alias for future
365 return self.name
365 return self.name
366
366
367 @property
367 @property
368 def emails(self):
368 def emails(self):
369 other = UserEmailMap.query().filter(UserEmailMap.user==self).all()
369 other = UserEmailMap.query().filter(UserEmailMap.user==self).all()
370 return [self.email] + [x.email for x in other]
370 return [self.email] + [x.email for x in other]
371
371
372 @property
372 @property
373 def ip_addresses(self):
373 def ip_addresses(self):
374 ret = UserIpMap.query().filter(UserIpMap.user == self).all()
374 ret = UserIpMap.query().filter(UserIpMap.user == self).all()
375 return [x.ip_addr for x in ret]
375 return [x.ip_addr for x in ret]
376
376
377 @property
377 @property
378 def username_and_name(self):
378 def username_and_name(self):
379 return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
379 return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
380
380
381 @property
381 @property
382 def full_name(self):
382 def full_name(self):
383 return '%s %s' % (self.firstname, self.lastname)
383 return '%s %s' % (self.firstname, self.lastname)
384
384
385 @property
385 @property
386 def full_name_or_username(self):
386 def full_name_or_username(self):
387 return ('%s %s' % (self.firstname, self.lastname)
387 return ('%s %s' % (self.firstname, self.lastname)
388 if (self.firstname and self.lastname) else self.username)
388 if (self.firstname and self.lastname) else self.username)
389
389
390 @property
390 @property
391 def full_contact(self):
391 def full_contact(self):
392 return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
392 return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
393
393
394 @property
394 @property
395 def short_contact(self):
395 def short_contact(self):
396 return '%s %s' % (self.firstname, self.lastname)
396 return '%s %s' % (self.firstname, self.lastname)
397
397
398 @property
398 @property
399 def is_admin(self):
399 def is_admin(self):
400 return self.admin
400 return self.admin
401
401
402 def __unicode__(self):
402 def __unicode__(self):
403 return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
403 return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
404 self.user_id, self.username)
404 self.user_id, self.username)
405
405
406 @classmethod
406 @classmethod
407 def get_by_username(cls, username, case_insensitive=False, cache=False):
407 def get_by_username(cls, username, case_insensitive=False, cache=False):
408 if case_insensitive:
408 if case_insensitive:
409 q = cls.query().filter(cls.username.ilike(username))
409 q = cls.query().filter(cls.username.ilike(username))
410 else:
410 else:
411 q = cls.query().filter(cls.username == username)
411 q = cls.query().filter(cls.username == username)
412
412
413 if cache:
413 if cache:
414 q = q.options(FromCache(
414 q = q.options(FromCache(
415 "sql_cache_short",
415 "sql_cache_short",
416 "get_user_%s" % _hash_key(username)
416 "get_user_%s" % _hash_key(username)
417 )
417 )
418 )
418 )
419 return q.scalar()
419 return q.scalar()
420
420
421 @classmethod
421 @classmethod
422 def get_by_api_key(cls, api_key, cache=False):
422 def get_by_api_key(cls, api_key, cache=False):
423 q = cls.query().filter(cls.api_key == api_key)
423 q = cls.query().filter(cls.api_key == api_key)
424
424
425 if cache:
425 if cache:
426 q = q.options(FromCache("sql_cache_short",
426 q = q.options(FromCache("sql_cache_short",
427 "get_api_key_%s" % api_key))
427 "get_api_key_%s" % api_key))
428 return q.scalar()
428 return q.scalar()
429
429
430 @classmethod
430 @classmethod
431 def get_by_email(cls, email, case_insensitive=False, cache=False):
431 def get_by_email(cls, email, case_insensitive=False, cache=False):
432 if case_insensitive:
432 if case_insensitive:
433 q = cls.query().filter(cls.email.ilike(email))
433 q = cls.query().filter(cls.email.ilike(email))
434 else:
434 else:
435 q = cls.query().filter(cls.email == email)
435 q = cls.query().filter(cls.email == email)
436
436
437 if cache:
437 if cache:
438 q = q.options(FromCache("sql_cache_short",
438 q = q.options(FromCache("sql_cache_short",
439 "get_email_key_%s" % email))
439 "get_email_key_%s" % email))
440
440
441 ret = q.scalar()
441 ret = q.scalar()
442 if ret is None:
442 if ret is None:
443 q = UserEmailMap.query()
443 q = UserEmailMap.query()
444 # try fetching in alternate email map
444 # try fetching in alternate email map
445 if case_insensitive:
445 if case_insensitive:
446 q = q.filter(UserEmailMap.email.ilike(email))
446 q = q.filter(UserEmailMap.email.ilike(email))
447 else:
447 else:
448 q = q.filter(UserEmailMap.email == email)
448 q = q.filter(UserEmailMap.email == email)
449 q = q.options(joinedload(UserEmailMap.user))
449 q = q.options(joinedload(UserEmailMap.user))
450 if cache:
450 if cache:
451 q = q.options(FromCache("sql_cache_short",
451 q = q.options(FromCache("sql_cache_short",
452 "get_email_map_key_%s" % email))
452 "get_email_map_key_%s" % email))
453 ret = getattr(q.scalar(), 'user', None)
453 ret = getattr(q.scalar(), 'user', None)
454
454
455 return ret
455 return ret
456
456
457 def update_lastlogin(self):
457 def update_lastlogin(self):
458 """Update user lastlogin"""
458 """Update user lastlogin"""
459 self.last_login = datetime.datetime.now()
459 self.last_login = datetime.datetime.now()
460 Session().add(self)
460 Session().add(self)
461 log.debug('updated user %s lastlogin' % self.username)
461 log.debug('updated user %s lastlogin' % self.username)
462
462
463 def get_api_data(self):
463 def get_api_data(self):
464 """
464 """
465 Common function for generating user related data for API
465 Common function for generating user related data for API
466 """
466 """
467 user = self
467 user = self
468 data = dict(
468 data = dict(
469 user_id=user.user_id,
469 user_id=user.user_id,
470 username=user.username,
470 username=user.username,
471 firstname=user.name,
471 firstname=user.name,
472 lastname=user.lastname,
472 lastname=user.lastname,
473 email=user.email,
473 email=user.email,
474 emails=user.emails,
474 emails=user.emails,
475 api_key=user.api_key,
475 api_key=user.api_key,
476 active=user.active,
476 active=user.active,
477 admin=user.admin,
477 admin=user.admin,
478 ldap_dn=user.ldap_dn,
478 ldap_dn=user.ldap_dn,
479 last_login=user.last_login,
479 last_login=user.last_login,
480 ip_addresses=user.ip_addresses
480 ip_addresses=user.ip_addresses
481 )
481 )
482 return data
482 return data
483
483
484 def __json__(self):
484 def __json__(self):
485 data = dict(
485 data = dict(
486 full_name=self.full_name,
486 full_name=self.full_name,
487 full_name_or_username=self.full_name_or_username,
487 full_name_or_username=self.full_name_or_username,
488 short_contact=self.short_contact,
488 short_contact=self.short_contact,
489 full_contact=self.full_contact
489 full_contact=self.full_contact
490 )
490 )
491 data.update(self.get_api_data())
491 data.update(self.get_api_data())
492 return data
492 return data
493
493
494
494
495 class UserEmailMap(Base, BaseModel):
495 class UserEmailMap(Base, BaseModel):
496 __tablename__ = 'user_email_map'
496 __tablename__ = 'user_email_map'
497 __table_args__ = (
497 __table_args__ = (
498 Index('uem_email_idx', 'email'),
498 Index('uem_email_idx', 'email'),
499 UniqueConstraint('email'),
499 UniqueConstraint('email'),
500 {'extend_existing': True, 'mysql_engine': 'InnoDB',
500 {'extend_existing': True, 'mysql_engine': 'InnoDB',
501 'mysql_charset': 'utf8'}
501 'mysql_charset': 'utf8'}
502 )
502 )
503 __mapper_args__ = {}
503 __mapper_args__ = {}
504
504
505 email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
505 email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
506 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
506 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
507 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
507 _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
508 user = relationship('User', lazy='joined')
508 user = relationship('User', lazy='joined')
509
509
510 @validates('_email')
510 @validates('_email')
511 def validate_email(self, key, email):
511 def validate_email(self, key, email):
512 # check if this email is not main one
512 # check if this email is not main one
513 main_email = Session().query(User).filter(User.email == email).scalar()
513 main_email = Session().query(User).filter(User.email == email).scalar()
514 if main_email is not None:
514 if main_email is not None:
515 raise AttributeError('email %s is present is user table' % email)
515 raise AttributeError('email %s is present is user table' % email)
516 return email
516 return email
517
517
518 @hybrid_property
518 @hybrid_property
519 def email(self):
519 def email(self):
520 return self._email
520 return self._email
521
521
522 @email.setter
522 @email.setter
523 def email(self, val):
523 def email(self, val):
524 self._email = val.lower() if val else None
524 self._email = val.lower() if val else None
525
525
526
526
527 class UserIpMap(Base, BaseModel):
527 class UserIpMap(Base, BaseModel):
528 __tablename__ = 'user_ip_map'
528 __tablename__ = 'user_ip_map'
529 __table_args__ = (
529 __table_args__ = (
530 UniqueConstraint('user_id', 'ip_addr'),
530 UniqueConstraint('user_id', 'ip_addr'),
531 {'extend_existing': True, 'mysql_engine': 'InnoDB',
531 {'extend_existing': True, 'mysql_engine': 'InnoDB',
532 'mysql_charset': 'utf8'}
532 'mysql_charset': 'utf8'}
533 )
533 )
534 __mapper_args__ = {}
534 __mapper_args__ = {}
535
535
536 ip_id = Column("ip_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
536 ip_id = Column("ip_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
537 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
537 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
538 ip_addr = Column("ip_addr", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
538 ip_addr = Column("ip_addr", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
539 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
539 active = Column("active", Boolean(), nullable=True, unique=None, default=True)
540 user = relationship('User', lazy='joined')
540 user = relationship('User', lazy='joined')
541
541
542 @classmethod
542 @classmethod
543 def _get_ip_range(cls, ip_addr):
543 def _get_ip_range(cls, ip_addr):
544 from rhodecode.lib import ipaddr
544 from rhodecode.lib import ipaddr
545 net = ipaddr.IPv4Network(ip_addr)
545 net = ipaddr.IPv4Network(ip_addr)
546 return [str(net.network), str(net.broadcast)]
546 return [str(net.network), str(net.broadcast)]
547
547
548 def __json__(self):
548 def __json__(self):
549 return dict(
549 return dict(
550 ip_addr=self.ip_addr,
550 ip_addr=self.ip_addr,
551 ip_range=self._get_ip_range(self.ip_addr)
551 ip_range=self._get_ip_range(self.ip_addr)
552 )
552 )
553
553
554
554
555 class UserLog(Base, BaseModel):
555 class UserLog(Base, BaseModel):
556 __tablename__ = 'user_logs'
556 __tablename__ = 'user_logs'
557 __table_args__ = (
557 __table_args__ = (
558 {'extend_existing': True, 'mysql_engine': 'InnoDB',
558 {'extend_existing': True, 'mysql_engine': 'InnoDB',
559 'mysql_charset': 'utf8'},
559 'mysql_charset': 'utf8'},
560 )
560 )
561 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
561 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
562 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
562 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
563 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
563 username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
564 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
564 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
565 repository_name = Column("repository_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
565 repository_name = Column("repository_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
566 user_ip = Column("user_ip", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
566 user_ip = Column("user_ip", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
567 action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
567 action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
568 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
568 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
569
569
570 @property
570 @property
571 def action_as_day(self):
571 def action_as_day(self):
572 return datetime.date(*self.action_date.timetuple()[:3])
572 return datetime.date(*self.action_date.timetuple()[:3])
573
573
574 user = relationship('User')
574 user = relationship('User')
575 repository = relationship('Repository', cascade='')
575 repository = relationship('Repository', cascade='')
576
576
577
577
578 class UsersGroup(Base, BaseModel):
578 class UsersGroup(Base, BaseModel):
579 __tablename__ = 'users_groups'
579 __tablename__ = 'users_groups'
580 __table_args__ = (
580 __table_args__ = (
581 {'extend_existing': True, 'mysql_engine': 'InnoDB',
581 {'extend_existing': True, 'mysql_engine': 'InnoDB',
582 'mysql_charset': 'utf8'},
582 'mysql_charset': 'utf8'},
583 )
583 )
584
584
585 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
585 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
586 users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
586 users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
587 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
587 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
588 inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
588 inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
589
589
590 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
590 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
591 users_group_to_perm = relationship('UsersGroupToPerm', cascade='all')
591 users_group_to_perm = relationship('UsersGroupToPerm', cascade='all')
592 users_group_repo_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
592 users_group_repo_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
593
593
594 def __unicode__(self):
594 def __unicode__(self):
595 return u'<userGroup(%s)>' % (self.users_group_name)
595 return u'<userGroup(%s)>' % (self.users_group_name)
596
596
597 @classmethod
597 @classmethod
598 def get_by_group_name(cls, group_name, cache=False,
598 def get_by_group_name(cls, group_name, cache=False,
599 case_insensitive=False):
599 case_insensitive=False):
600 if case_insensitive:
600 if case_insensitive:
601 q = cls.query().filter(cls.users_group_name.ilike(group_name))
601 q = cls.query().filter(cls.users_group_name.ilike(group_name))
602 else:
602 else:
603 q = cls.query().filter(cls.users_group_name == group_name)
603 q = cls.query().filter(cls.users_group_name == group_name)
604 if cache:
604 if cache:
605 q = q.options(FromCache(
605 q = q.options(FromCache(
606 "sql_cache_short",
606 "sql_cache_short",
607 "get_user_%s" % _hash_key(group_name)
607 "get_user_%s" % _hash_key(group_name)
608 )
608 )
609 )
609 )
610 return q.scalar()
610 return q.scalar()
611
611
612 @classmethod
612 @classmethod
613 def get(cls, users_group_id, cache=False):
613 def get(cls, users_group_id, cache=False):
614 users_group = cls.query()
614 users_group = cls.query()
615 if cache:
615 if cache:
616 users_group = users_group.options(FromCache("sql_cache_short",
616 users_group = users_group.options(FromCache("sql_cache_short",
617 "get_users_group_%s" % users_group_id))
617 "get_users_group_%s" % users_group_id))
618 return users_group.get(users_group_id)
618 return users_group.get(users_group_id)
619
619
620 def get_api_data(self):
620 def get_api_data(self):
621 users_group = self
621 users_group = self
622
622
623 data = dict(
623 data = dict(
624 users_group_id=users_group.users_group_id,
624 users_group_id=users_group.users_group_id,
625 group_name=users_group.users_group_name,
625 group_name=users_group.users_group_name,
626 active=users_group.users_group_active,
626 active=users_group.users_group_active,
627 )
627 )
628
628
629 return data
629 return data
630
630
631
631
632 class UsersGroupMember(Base, BaseModel):
632 class UsersGroupMember(Base, BaseModel):
633 __tablename__ = 'users_groups_members'
633 __tablename__ = 'users_groups_members'
634 __table_args__ = (
634 __table_args__ = (
635 {'extend_existing': True, 'mysql_engine': 'InnoDB',
635 {'extend_existing': True, 'mysql_engine': 'InnoDB',
636 'mysql_charset': 'utf8'},
636 'mysql_charset': 'utf8'},
637 )
637 )
638
638
639 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
639 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
640 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
640 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
641 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
641 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
642
642
643 user = relationship('User', lazy='joined')
643 user = relationship('User', lazy='joined')
644 users_group = relationship('UsersGroup')
644 users_group = relationship('UsersGroup')
645
645
646 def __init__(self, gr_id='', u_id=''):
646 def __init__(self, gr_id='', u_id=''):
647 self.users_group_id = gr_id
647 self.users_group_id = gr_id
648 self.user_id = u_id
648 self.user_id = u_id
649
649
650
650
651 class Repository(Base, BaseModel):
651 class Repository(Base, BaseModel):
652 __tablename__ = 'repositories'
652 __tablename__ = 'repositories'
653 __table_args__ = (
653 __table_args__ = (
654 UniqueConstraint('repo_name'),
654 UniqueConstraint('repo_name'),
655 Index('r_repo_name_idx', 'repo_name'),
655 Index('r_repo_name_idx', 'repo_name'),
656 {'extend_existing': True, 'mysql_engine': 'InnoDB',
656 {'extend_existing': True, 'mysql_engine': 'InnoDB',
657 'mysql_charset': 'utf8'},
657 'mysql_charset': 'utf8'},
658 )
658 )
659
659
660 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
660 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
661 repo_name = Column("repo_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
661 repo_name = Column("repo_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
662 clone_uri = Column("clone_uri", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
662 clone_uri = Column("clone_uri", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
663 repo_type = Column("repo_type", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
663 repo_type = Column("repo_type", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
664 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
664 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
665 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
665 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
666 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
666 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
667 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
667 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
668 description = Column("description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
668 description = Column("description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
669 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
669 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
670 updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
670 updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
671 landing_rev = Column("landing_revision", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
671 landing_rev = Column("landing_revision", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
672 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
672 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
673 _locked = Column("locked", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
673 _locked = Column("locked", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
674 _changeset_cache = Column("changeset_cache", LargeBinary(), nullable=True) #JSON data
674 _changeset_cache = Column("changeset_cache", LargeBinary(), nullable=True) #JSON data
675
675
676 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
676 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
677 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
677 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
678
678
679 user = relationship('User')
679 user = relationship('User')
680 fork = relationship('Repository', remote_side=repo_id)
680 fork = relationship('Repository', remote_side=repo_id)
681 group = relationship('RepoGroup')
681 group = relationship('RepoGroup')
682 repo_to_perm = relationship('UserRepoToPerm', cascade='all', order_by='UserRepoToPerm.repo_to_perm_id')
682 repo_to_perm = relationship('UserRepoToPerm', cascade='all', order_by='UserRepoToPerm.repo_to_perm_id')
683 users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
683 users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
684 stats = relationship('Statistics', cascade='all', uselist=False)
684 stats = relationship('Statistics', cascade='all', uselist=False)
685
685
686 followers = relationship('UserFollowing',
686 followers = relationship('UserFollowing',
687 primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id',
687 primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id',
688 cascade='all')
688 cascade='all')
689
689
690 logs = relationship('UserLog')
690 logs = relationship('UserLog')
691 comments = relationship('ChangesetComment', cascade="all, delete, delete-orphan")
691 comments = relationship('ChangesetComment', cascade="all, delete, delete-orphan")
692
692
693 pull_requests_org = relationship('PullRequest',
693 pull_requests_org = relationship('PullRequest',
694 primaryjoin='PullRequest.org_repo_id==Repository.repo_id',
694 primaryjoin='PullRequest.org_repo_id==Repository.repo_id',
695 cascade="all, delete, delete-orphan")
695 cascade="all, delete, delete-orphan")
696
696
697 pull_requests_other = relationship('PullRequest',
697 pull_requests_other = relationship('PullRequest',
698 primaryjoin='PullRequest.other_repo_id==Repository.repo_id',
698 primaryjoin='PullRequest.other_repo_id==Repository.repo_id',
699 cascade="all, delete, delete-orphan")
699 cascade="all, delete, delete-orphan")
700
700
701 def __unicode__(self):
701 def __unicode__(self):
702 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id,
702 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id,
703 self.repo_name)
703 self.repo_name)
704
704
705 @hybrid_property
705 @hybrid_property
706 def locked(self):
706 def locked(self):
707 # always should return [user_id, timelocked]
707 # always should return [user_id, timelocked]
708 if self._locked:
708 if self._locked:
709 _lock_info = self._locked.split(':')
709 _lock_info = self._locked.split(':')
710 return int(_lock_info[0]), _lock_info[1]
710 return int(_lock_info[0]), _lock_info[1]
711 return [None, None]
711 return [None, None]
712
712
713 @locked.setter
713 @locked.setter
714 def locked(self, val):
714 def locked(self, val):
715 if val and isinstance(val, (list, tuple)):
715 if val and isinstance(val, (list, tuple)):
716 self._locked = ':'.join(map(str, val))
716 self._locked = ':'.join(map(str, val))
717 else:
717 else:
718 self._locked = None
718 self._locked = None
719
719
720 @hybrid_property
720 @hybrid_property
721 def changeset_cache(self):
721 def changeset_cache(self):
722 from rhodecode.lib.vcs.backends.base import EmptyChangeset
722 from rhodecode.lib.vcs.backends.base import EmptyChangeset
723 dummy = EmptyChangeset().__json__()
723 dummy = EmptyChangeset().__json__()
724 if not self._changeset_cache:
724 if not self._changeset_cache:
725 return dummy
725 return dummy
726 try:
726 try:
727 return json.loads(self._changeset_cache)
727 return json.loads(self._changeset_cache)
728 except TypeError:
728 except TypeError:
729 return dummy
729 return dummy
730
730
731 @changeset_cache.setter
731 @changeset_cache.setter
732 def changeset_cache(self, val):
732 def changeset_cache(self, val):
733 try:
733 try:
734 self._changeset_cache = json.dumps(val)
734 self._changeset_cache = json.dumps(val)
735 except:
735 except:
736 log.error(traceback.format_exc())
736 log.error(traceback.format_exc())
737
737
738 @classmethod
738 @classmethod
739 def url_sep(cls):
739 def url_sep(cls):
740 return URL_SEP
740 return URL_SEP
741
741
742 @classmethod
742 @classmethod
743 def normalize_repo_name(cls, repo_name):
743 def normalize_repo_name(cls, repo_name):
744 """
744 """
745 Normalizes os specific repo_name to the format internally stored inside
745 Normalizes os specific repo_name to the format internally stored inside
746 dabatabase using URL_SEP
746 dabatabase using URL_SEP
747
747
748 :param cls:
748 :param cls:
749 :param repo_name:
749 :param repo_name:
750 """
750 """
751 return cls.url_sep().join(repo_name.split(os.sep))
751 return cls.url_sep().join(repo_name.split(os.sep))
752
752
753 @classmethod
753 @classmethod
754 def get_by_repo_name(cls, repo_name):
754 def get_by_repo_name(cls, repo_name):
755 q = Session().query(cls).filter(cls.repo_name == repo_name)
755 q = Session().query(cls).filter(cls.repo_name == repo_name)
756 q = q.options(joinedload(Repository.fork))\
756 q = q.options(joinedload(Repository.fork))\
757 .options(joinedload(Repository.user))\
757 .options(joinedload(Repository.user))\
758 .options(joinedload(Repository.group))
758 .options(joinedload(Repository.group))
759 return q.scalar()
759 return q.scalar()
760
760
761 @classmethod
761 @classmethod
762 def get_by_full_path(cls, repo_full_path):
762 def get_by_full_path(cls, repo_full_path):
763 repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
763 repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
764 repo_name = cls.normalize_repo_name(repo_name)
764 repo_name = cls.normalize_repo_name(repo_name)
765 return cls.get_by_repo_name(repo_name.strip(URL_SEP))
765 return cls.get_by_repo_name(repo_name.strip(URL_SEP))
766
766
767 @classmethod
767 @classmethod
768 def get_repo_forks(cls, repo_id):
768 def get_repo_forks(cls, repo_id):
769 return cls.query().filter(Repository.fork_id == repo_id)
769 return cls.query().filter(Repository.fork_id == repo_id)
770
770
771 @classmethod
771 @classmethod
772 def base_path(cls):
772 def base_path(cls):
773 """
773 """
774 Returns base path when all repos are stored
774 Returns base path when all repos are stored
775
775
776 :param cls:
776 :param cls:
777 """
777 """
778 q = Session().query(RhodeCodeUi)\
778 q = Session().query(RhodeCodeUi)\
779 .filter(RhodeCodeUi.ui_key == cls.url_sep())
779 .filter(RhodeCodeUi.ui_key == cls.url_sep())
780 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
780 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
781 return q.one().ui_value
781 return q.one().ui_value
782
782
783 @property
783 @property
784 def forks(self):
784 def forks(self):
785 """
785 """
786 Return forks of this repo
786 Return forks of this repo
787 """
787 """
788 return Repository.get_repo_forks(self.repo_id)
788 return Repository.get_repo_forks(self.repo_id)
789
789
790 @property
790 @property
791 def parent(self):
791 def parent(self):
792 """
792 """
793 Returns fork parent
793 Returns fork parent
794 """
794 """
795 return self.fork
795 return self.fork
796
796
797 @property
797 @property
798 def just_name(self):
798 def just_name(self):
799 return self.repo_name.split(Repository.url_sep())[-1]
799 return self.repo_name.split(Repository.url_sep())[-1]
800
800
801 @property
801 @property
802 def groups_with_parents(self):
802 def groups_with_parents(self):
803 groups = []
803 groups = []
804 if self.group is None:
804 if self.group is None:
805 return groups
805 return groups
806
806
807 cur_gr = self.group
807 cur_gr = self.group
808 groups.insert(0, cur_gr)
808 groups.insert(0, cur_gr)
809 while 1:
809 while 1:
810 gr = getattr(cur_gr, 'parent_group', None)
810 gr = getattr(cur_gr, 'parent_group', None)
811 cur_gr = cur_gr.parent_group
811 cur_gr = cur_gr.parent_group
812 if gr is None:
812 if gr is None:
813 break
813 break
814 groups.insert(0, gr)
814 groups.insert(0, gr)
815
815
816 return groups
816 return groups
817
817
818 @property
818 @property
819 def groups_and_repo(self):
819 def groups_and_repo(self):
820 return self.groups_with_parents, self.just_name
820 return self.groups_with_parents, self.just_name
821
821
822 @LazyProperty
822 @LazyProperty
823 def repo_path(self):
823 def repo_path(self):
824 """
824 """
825 Returns base full path for that repository means where it actually
825 Returns base full path for that repository means where it actually
826 exists on a filesystem
826 exists on a filesystem
827 """
827 """
828 q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
828 q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
829 Repository.url_sep())
829 Repository.url_sep())
830 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
830 q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
831 return q.one().ui_value
831 return q.one().ui_value
832
832
833 @property
833 @property
834 def repo_full_path(self):
834 def repo_full_path(self):
835 p = [self.repo_path]
835 p = [self.repo_path]
836 # we need to split the name by / since this is how we store the
836 # we need to split the name by / since this is how we store the
837 # names in the database, but that eventually needs to be converted
837 # names in the database, but that eventually needs to be converted
838 # into a valid system path
838 # into a valid system path
839 p += self.repo_name.split(Repository.url_sep())
839 p += self.repo_name.split(Repository.url_sep())
840 return os.path.join(*p)
840 return os.path.join(*p)
841
841
842 @property
842 @property
843 def cache_keys(self):
843 def cache_keys(self):
844 """
844 """
845 Returns associated cache keys for that repo
845 Returns associated cache keys for that repo
846 """
846 """
847 return CacheInvalidation.query()\
847 return CacheInvalidation.query()\
848 .filter(CacheInvalidation.cache_args == self.repo_name)\
848 .filter(CacheInvalidation.cache_args == self.repo_name)\
849 .order_by(CacheInvalidation.cache_key)\
849 .order_by(CacheInvalidation.cache_key)\
850 .all()
850 .all()
851
851
852 def get_new_name(self, repo_name):
852 def get_new_name(self, repo_name):
853 """
853 """
854 returns new full repository name based on assigned group and new new
854 returns new full repository name based on assigned group and new new
855
855
856 :param group_name:
856 :param group_name:
857 """
857 """
858 path_prefix = self.group.full_path_splitted if self.group else []
858 path_prefix = self.group.full_path_splitted if self.group else []
859 return Repository.url_sep().join(path_prefix + [repo_name])
859 return Repository.url_sep().join(path_prefix + [repo_name])
860
860
861 @property
861 @property
862 def _ui(self):
862 def _ui(self):
863 """
863 """
864 Creates an db based ui object for this repository
864 Creates an db based ui object for this repository
865 """
865 """
866 from rhodecode.lib.utils import make_ui
866 from rhodecode.lib.utils import make_ui
867 return make_ui('db', clear_session=False)
867 return make_ui('db', clear_session=False)
868
868
869 @classmethod
869 @classmethod
870 def inject_ui(cls, repo, extras={}):
870 def inject_ui(cls, repo, extras={}):
871 from rhodecode.lib.vcs.backends.hg import MercurialRepository
871 from rhodecode.lib.vcs.backends.hg import MercurialRepository
872 from rhodecode.lib.vcs.backends.git import GitRepository
872 from rhodecode.lib.vcs.backends.git import GitRepository
873 required = (MercurialRepository, GitRepository)
873 required = (MercurialRepository, GitRepository)
874 if not isinstance(repo, required):
874 if not isinstance(repo, required):
875 raise Exception('repo must be instance of %s' % required)
875 raise Exception('repo must be instance of %s' % required)
876
876
877 # inject ui extra param to log this action via push logger
877 # inject ui extra param to log this action via push logger
878 for k, v in extras.items():
878 for k, v in extras.items():
879 repo._repo.ui.setconfig('rhodecode_extras', k, v)
879 repo._repo.ui.setconfig('rhodecode_extras', k, v)
880
880
881 @classmethod
881 @classmethod
882 def is_valid(cls, repo_name):
882 def is_valid(cls, repo_name):
883 """
883 """
884 returns True if given repo name is a valid filesystem repository
884 returns True if given repo name is a valid filesystem repository
885
885
886 :param cls:
886 :param cls:
887 :param repo_name:
887 :param repo_name:
888 """
888 """
889 from rhodecode.lib.utils import is_valid_repo
889 from rhodecode.lib.utils import is_valid_repo
890
890
891 return is_valid_repo(repo_name, cls.base_path())
891 return is_valid_repo(repo_name, cls.base_path())
892
892
893 def get_api_data(self):
893 def get_api_data(self):
894 """
894 """
895 Common function for generating repo api data
895 Common function for generating repo api data
896
896
897 """
897 """
898 repo = self
898 repo = self
899 data = dict(
899 data = dict(
900 repo_id=repo.repo_id,
900 repo_id=repo.repo_id,
901 repo_name=repo.repo_name,
901 repo_name=repo.repo_name,
902 repo_type=repo.repo_type,
902 repo_type=repo.repo_type,
903 clone_uri=repo.clone_uri,
903 clone_uri=repo.clone_uri,
904 private=repo.private,
904 private=repo.private,
905 created_on=repo.created_on,
905 created_on=repo.created_on,
906 description=repo.description,
906 description=repo.description,
907 landing_rev=repo.landing_rev,
907 landing_rev=repo.landing_rev,
908 owner=repo.user.username,
908 owner=repo.user.username,
909 fork_of=repo.fork.repo_name if repo.fork else None,
909 fork_of=repo.fork.repo_name if repo.fork else None,
910 enable_statistics=repo.enable_statistics,
910 enable_statistics=repo.enable_statistics,
911 enable_locking=repo.enable_locking,
911 enable_locking=repo.enable_locking,
912 enable_downloads=repo.enable_downloads
912 enable_downloads=repo.enable_downloads
913 )
913 )
914
914
915 return data
915 return data
916
916
917 @classmethod
917 @classmethod
918 def lock(cls, repo, user_id):
918 def lock(cls, repo, user_id):
919 repo.locked = [user_id, time.time()]
919 repo.locked = [user_id, time.time()]
920 Session().add(repo)
920 Session().add(repo)
921 Session().commit()
921 Session().commit()
922
922
923 @classmethod
923 @classmethod
924 def unlock(cls, repo):
924 def unlock(cls, repo):
925 repo.locked = None
925 repo.locked = None
926 Session().add(repo)
926 Session().add(repo)
927 Session().commit()
927 Session().commit()
928
928
929 @property
929 @property
930 def last_db_change(self):
930 def last_db_change(self):
931 return self.updated_on
931 return self.updated_on
932
932
933 def clone_url(self, **override):
934 from pylons import url
935 from urlparse import urlparse
936 import urllib
937 parsed_url = urlparse(url('home', qualified=True))
938 default_clone_uri = '%(scheme)s://%(user)s%(pass)s%(netloc)s%(prefix)s%(path)s'
939 decoded_path = safe_unicode(urllib.unquote(parsed_url.path))
940 args = {
941 'user': '',
942 'pass': '',
943 'scheme': parsed_url.scheme,
944 'netloc': parsed_url.netloc,
945 'prefix': decoded_path,
946 'path': self.repo_name
947 }
948
949 args.update(override)
950 return default_clone_uri % args
951
933 #==========================================================================
952 #==========================================================================
934 # SCM PROPERTIES
953 # SCM PROPERTIES
935 #==========================================================================
954 #==========================================================================
936
955
937 def get_changeset(self, rev=None):
956 def get_changeset(self, rev=None):
938 return get_changeset_safe(self.scm_instance, rev)
957 return get_changeset_safe(self.scm_instance, rev)
939
958
940 def get_landing_changeset(self):
959 def get_landing_changeset(self):
941 """
960 """
942 Returns landing changeset, or if that doesn't exist returns the tip
961 Returns landing changeset, or if that doesn't exist returns the tip
943 """
962 """
944 cs = self.get_changeset(self.landing_rev) or self.get_changeset()
963 cs = self.get_changeset(self.landing_rev) or self.get_changeset()
945 return cs
964 return cs
946
965
947 def update_changeset_cache(self, cs_cache=None):
966 def update_changeset_cache(self, cs_cache=None):
948 """
967 """
949 Update cache of last changeset for repository, keys should be::
968 Update cache of last changeset for repository, keys should be::
950
969
951 short_id
970 short_id
952 raw_id
971 raw_id
953 revision
972 revision
954 message
973 message
955 date
974 date
956 author
975 author
957
976
958 :param cs_cache:
977 :param cs_cache:
959 """
978 """
960 from rhodecode.lib.vcs.backends.base import BaseChangeset
979 from rhodecode.lib.vcs.backends.base import BaseChangeset
961 if cs_cache is None:
980 if cs_cache is None:
962 cs_cache = self.get_changeset()
981 cs_cache = self.get_changeset()
963 if isinstance(cs_cache, BaseChangeset):
982 if isinstance(cs_cache, BaseChangeset):
964 cs_cache = cs_cache.__json__()
983 cs_cache = cs_cache.__json__()
965
984
966 if cs_cache != self.changeset_cache:
985 if cs_cache != self.changeset_cache:
967 last_change = cs_cache.get('date') or self.last_change
986 last_change = cs_cache.get('date') or self.last_change
968 log.debug('updated repo %s with new cs cache %s' % (self, cs_cache))
987 log.debug('updated repo %s with new cs cache %s' % (self, cs_cache))
969 self.updated_on = last_change
988 self.updated_on = last_change
970 self.changeset_cache = cs_cache
989 self.changeset_cache = cs_cache
971 Session().add(self)
990 Session().add(self)
972 Session().commit()
991 Session().commit()
973
992
974 @property
993 @property
975 def tip(self):
994 def tip(self):
976 return self.get_changeset('tip')
995 return self.get_changeset('tip')
977
996
978 @property
997 @property
979 def author(self):
998 def author(self):
980 return self.tip.author
999 return self.tip.author
981
1000
982 @property
1001 @property
983 def last_change(self):
1002 def last_change(self):
984 return self.scm_instance.last_change
1003 return self.scm_instance.last_change
985
1004
986 def get_comments(self, revisions=None):
1005 def get_comments(self, revisions=None):
987 """
1006 """
988 Returns comments for this repository grouped by revisions
1007 Returns comments for this repository grouped by revisions
989
1008
990 :param revisions: filter query by revisions only
1009 :param revisions: filter query by revisions only
991 """
1010 """
992 cmts = ChangesetComment.query()\
1011 cmts = ChangesetComment.query()\
993 .filter(ChangesetComment.repo == self)
1012 .filter(ChangesetComment.repo == self)
994 if revisions:
1013 if revisions:
995 cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
1014 cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
996 grouped = defaultdict(list)
1015 grouped = defaultdict(list)
997 for cmt in cmts.all():
1016 for cmt in cmts.all():
998 grouped[cmt.revision].append(cmt)
1017 grouped[cmt.revision].append(cmt)
999 return grouped
1018 return grouped
1000
1019
1001 def statuses(self, revisions=None):
1020 def statuses(self, revisions=None):
1002 """
1021 """
1003 Returns statuses for this repository
1022 Returns statuses for this repository
1004
1023
1005 :param revisions: list of revisions to get statuses for
1024 :param revisions: list of revisions to get statuses for
1006 :type revisions: list
1025 :type revisions: list
1007 """
1026 """
1008
1027
1009 statuses = ChangesetStatus.query()\
1028 statuses = ChangesetStatus.query()\
1010 .filter(ChangesetStatus.repo == self)\
1029 .filter(ChangesetStatus.repo == self)\
1011 .filter(ChangesetStatus.version == 0)
1030 .filter(ChangesetStatus.version == 0)
1012 if revisions:
1031 if revisions:
1013 statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
1032 statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
1014 grouped = {}
1033 grouped = {}
1015
1034
1016 #maybe we have open new pullrequest without a status ?
1035 #maybe we have open new pullrequest without a status ?
1017 stat = ChangesetStatus.STATUS_UNDER_REVIEW
1036 stat = ChangesetStatus.STATUS_UNDER_REVIEW
1018 status_lbl = ChangesetStatus.get_status_lbl(stat)
1037 status_lbl = ChangesetStatus.get_status_lbl(stat)
1019 for pr in PullRequest.query().filter(PullRequest.org_repo == self).all():
1038 for pr in PullRequest.query().filter(PullRequest.org_repo == self).all():
1020 for rev in pr.revisions:
1039 for rev in pr.revisions:
1021 pr_id = pr.pull_request_id
1040 pr_id = pr.pull_request_id
1022 pr_repo = pr.other_repo.repo_name
1041 pr_repo = pr.other_repo.repo_name
1023 grouped[rev] = [stat, status_lbl, pr_id, pr_repo]
1042 grouped[rev] = [stat, status_lbl, pr_id, pr_repo]
1024
1043
1025 for stat in statuses.all():
1044 for stat in statuses.all():
1026 pr_id = pr_repo = None
1045 pr_id = pr_repo = None
1027 if stat.pull_request:
1046 if stat.pull_request:
1028 pr_id = stat.pull_request.pull_request_id
1047 pr_id = stat.pull_request.pull_request_id
1029 pr_repo = stat.pull_request.other_repo.repo_name
1048 pr_repo = stat.pull_request.other_repo.repo_name
1030 grouped[stat.revision] = [str(stat.status), stat.status_lbl,
1049 grouped[stat.revision] = [str(stat.status), stat.status_lbl,
1031 pr_id, pr_repo]
1050 pr_id, pr_repo]
1032 return grouped
1051 return grouped
1033
1052
1034 #==========================================================================
1053 #==========================================================================
1035 # SCM CACHE INSTANCE
1054 # SCM CACHE INSTANCE
1036 #==========================================================================
1055 #==========================================================================
1037
1056
1038 @property
1057 @property
1039 def invalidate(self):
1058 def invalidate(self):
1040 return CacheInvalidation.invalidate(self.repo_name)
1059 return CacheInvalidation.invalidate(self.repo_name)
1041
1060
1042 def set_invalidate(self):
1061 def set_invalidate(self):
1043 """
1062 """
1044 set a cache for invalidation for this instance
1063 set a cache for invalidation for this instance
1045 """
1064 """
1046 CacheInvalidation.set_invalidate(repo_name=self.repo_name)
1065 CacheInvalidation.set_invalidate(repo_name=self.repo_name)
1047
1066
1048 @LazyProperty
1067 @LazyProperty
1049 def scm_instance(self):
1068 def scm_instance(self):
1050 import rhodecode
1069 import rhodecode
1051 full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
1070 full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
1052 if full_cache:
1071 if full_cache:
1053 return self.scm_instance_cached()
1072 return self.scm_instance_cached()
1054 return self.__get_instance()
1073 return self.__get_instance()
1055
1074
1056 def scm_instance_cached(self, cache_map=None):
1075 def scm_instance_cached(self, cache_map=None):
1057 @cache_region('long_term')
1076 @cache_region('long_term')
1058 def _c(repo_name):
1077 def _c(repo_name):
1059 return self.__get_instance()
1078 return self.__get_instance()
1060 rn = self.repo_name
1079 rn = self.repo_name
1061 log.debug('Getting cached instance of repo')
1080 log.debug('Getting cached instance of repo')
1062
1081
1063 if cache_map:
1082 if cache_map:
1064 # get using prefilled cache_map
1083 # get using prefilled cache_map
1065 invalidate_repo = cache_map[self.repo_name]
1084 invalidate_repo = cache_map[self.repo_name]
1066 if invalidate_repo:
1085 if invalidate_repo:
1067 invalidate_repo = (None if invalidate_repo.cache_active
1086 invalidate_repo = (None if invalidate_repo.cache_active
1068 else invalidate_repo)
1087 else invalidate_repo)
1069 else:
1088 else:
1070 # get from invalidate
1089 # get from invalidate
1071 invalidate_repo = self.invalidate
1090 invalidate_repo = self.invalidate
1072
1091
1073 if invalidate_repo is not None:
1092 if invalidate_repo is not None:
1074 region_invalidate(_c, None, rn)
1093 region_invalidate(_c, None, rn)
1075 # update our cache
1094 # update our cache
1076 CacheInvalidation.set_valid(invalidate_repo.cache_key)
1095 CacheInvalidation.set_valid(invalidate_repo.cache_key)
1077 return _c(rn)
1096 return _c(rn)
1078
1097
1079 def __get_instance(self):
1098 def __get_instance(self):
1080 repo_full_path = self.repo_full_path
1099 repo_full_path = self.repo_full_path
1081 try:
1100 try:
1082 alias = get_scm(repo_full_path)[0]
1101 alias = get_scm(repo_full_path)[0]
1083 log.debug('Creating instance of %s repository' % alias)
1102 log.debug('Creating instance of %s repository' % alias)
1084 backend = get_backend(alias)
1103 backend = get_backend(alias)
1085 except VCSError:
1104 except VCSError:
1086 log.error(traceback.format_exc())
1105 log.error(traceback.format_exc())
1087 log.error('Perhaps this repository is in db and not in '
1106 log.error('Perhaps this repository is in db and not in '
1088 'filesystem run rescan repositories with '
1107 'filesystem run rescan repositories with '
1089 '"destroy old data " option from admin panel')
1108 '"destroy old data " option from admin panel')
1090 return
1109 return
1091
1110
1092 if alias == 'hg':
1111 if alias == 'hg':
1093
1112
1094 repo = backend(safe_str(repo_full_path), create=False,
1113 repo = backend(safe_str(repo_full_path), create=False,
1095 baseui=self._ui)
1114 baseui=self._ui)
1096 # skip hidden web repository
1115 # skip hidden web repository
1097 if repo._get_hidden():
1116 if repo._get_hidden():
1098 return
1117 return
1099 else:
1118 else:
1100 repo = backend(repo_full_path, create=False)
1119 repo = backend(repo_full_path, create=False)
1101
1120
1102 return repo
1121 return repo
1103
1122
1104
1123
1105 class RepoGroup(Base, BaseModel):
1124 class RepoGroup(Base, BaseModel):
1106 __tablename__ = 'groups'
1125 __tablename__ = 'groups'
1107 __table_args__ = (
1126 __table_args__ = (
1108 UniqueConstraint('group_name', 'group_parent_id'),
1127 UniqueConstraint('group_name', 'group_parent_id'),
1109 CheckConstraint('group_id != group_parent_id'),
1128 CheckConstraint('group_id != group_parent_id'),
1110 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1129 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1111 'mysql_charset': 'utf8'},
1130 'mysql_charset': 'utf8'},
1112 )
1131 )
1113 __mapper_args__ = {'order_by': 'group_name'}
1132 __mapper_args__ = {'order_by': 'group_name'}
1114
1133
1115 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1134 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1116 group_name = Column("group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
1135 group_name = Column("group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
1117 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
1136 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
1118 group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1137 group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1119 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
1138 enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
1120
1139
1121 repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
1140 repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
1122 users_group_to_perm = relationship('UsersGroupRepoGroupToPerm', cascade='all')
1141 users_group_to_perm = relationship('UsersGroupRepoGroupToPerm', cascade='all')
1123
1142
1124 parent_group = relationship('RepoGroup', remote_side=group_id)
1143 parent_group = relationship('RepoGroup', remote_side=group_id)
1125
1144
1126 def __init__(self, group_name='', parent_group=None):
1145 def __init__(self, group_name='', parent_group=None):
1127 self.group_name = group_name
1146 self.group_name = group_name
1128 self.parent_group = parent_group
1147 self.parent_group = parent_group
1129
1148
1130 def __unicode__(self):
1149 def __unicode__(self):
1131 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
1150 return u"<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
1132 self.group_name)
1151 self.group_name)
1133
1152
1134 @classmethod
1153 @classmethod
1135 def groups_choices(cls, check_perms=False):
1154 def groups_choices(cls, check_perms=False):
1136 from webhelpers.html import literal as _literal
1155 from webhelpers.html import literal as _literal
1137 from rhodecode.model.scm import ScmModel
1156 from rhodecode.model.scm import ScmModel
1138 groups = cls.query().all()
1157 groups = cls.query().all()
1139 if check_perms:
1158 if check_perms:
1140 #filter group user have access to, it's done
1159 #filter group user have access to, it's done
1141 #magically inside ScmModel based on current user
1160 #magically inside ScmModel based on current user
1142 groups = ScmModel().get_repos_groups(groups)
1161 groups = ScmModel().get_repos_groups(groups)
1143 repo_groups = [('', '')]
1162 repo_groups = [('', '')]
1144 sep = ' &raquo; '
1163 sep = ' &raquo; '
1145 _name = lambda k: _literal(sep.join(k))
1164 _name = lambda k: _literal(sep.join(k))
1146
1165
1147 repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
1166 repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
1148 for x in groups])
1167 for x in groups])
1149
1168
1150 repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
1169 repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
1151 return repo_groups
1170 return repo_groups
1152
1171
1153 @classmethod
1172 @classmethod
1154 def url_sep(cls):
1173 def url_sep(cls):
1155 return URL_SEP
1174 return URL_SEP
1156
1175
1157 @classmethod
1176 @classmethod
1158 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
1177 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
1159 if case_insensitive:
1178 if case_insensitive:
1160 gr = cls.query()\
1179 gr = cls.query()\
1161 .filter(cls.group_name.ilike(group_name))
1180 .filter(cls.group_name.ilike(group_name))
1162 else:
1181 else:
1163 gr = cls.query()\
1182 gr = cls.query()\
1164 .filter(cls.group_name == group_name)
1183 .filter(cls.group_name == group_name)
1165 if cache:
1184 if cache:
1166 gr = gr.options(FromCache(
1185 gr = gr.options(FromCache(
1167 "sql_cache_short",
1186 "sql_cache_short",
1168 "get_group_%s" % _hash_key(group_name)
1187 "get_group_%s" % _hash_key(group_name)
1169 )
1188 )
1170 )
1189 )
1171 return gr.scalar()
1190 return gr.scalar()
1172
1191
1173 @property
1192 @property
1174 def parents(self):
1193 def parents(self):
1175 parents_recursion_limit = 5
1194 parents_recursion_limit = 5
1176 groups = []
1195 groups = []
1177 if self.parent_group is None:
1196 if self.parent_group is None:
1178 return groups
1197 return groups
1179 cur_gr = self.parent_group
1198 cur_gr = self.parent_group
1180 groups.insert(0, cur_gr)
1199 groups.insert(0, cur_gr)
1181 cnt = 0
1200 cnt = 0
1182 while 1:
1201 while 1:
1183 cnt += 1
1202 cnt += 1
1184 gr = getattr(cur_gr, 'parent_group', None)
1203 gr = getattr(cur_gr, 'parent_group', None)
1185 cur_gr = cur_gr.parent_group
1204 cur_gr = cur_gr.parent_group
1186 if gr is None:
1205 if gr is None:
1187 break
1206 break
1188 if cnt == parents_recursion_limit:
1207 if cnt == parents_recursion_limit:
1189 # this will prevent accidental infinit loops
1208 # this will prevent accidental infinit loops
1190 log.error('group nested more than %s' %
1209 log.error('group nested more than %s' %
1191 parents_recursion_limit)
1210 parents_recursion_limit)
1192 break
1211 break
1193
1212
1194 groups.insert(0, gr)
1213 groups.insert(0, gr)
1195 return groups
1214 return groups
1196
1215
1197 @property
1216 @property
1198 def children(self):
1217 def children(self):
1199 return RepoGroup.query().filter(RepoGroup.parent_group == self)
1218 return RepoGroup.query().filter(RepoGroup.parent_group == self)
1200
1219
1201 @property
1220 @property
1202 def name(self):
1221 def name(self):
1203 return self.group_name.split(RepoGroup.url_sep())[-1]
1222 return self.group_name.split(RepoGroup.url_sep())[-1]
1204
1223
1205 @property
1224 @property
1206 def full_path(self):
1225 def full_path(self):
1207 return self.group_name
1226 return self.group_name
1208
1227
1209 @property
1228 @property
1210 def full_path_splitted(self):
1229 def full_path_splitted(self):
1211 return self.group_name.split(RepoGroup.url_sep())
1230 return self.group_name.split(RepoGroup.url_sep())
1212
1231
1213 @property
1232 @property
1214 def repositories(self):
1233 def repositories(self):
1215 return Repository.query()\
1234 return Repository.query()\
1216 .filter(Repository.group == self)\
1235 .filter(Repository.group == self)\
1217 .order_by(Repository.repo_name)
1236 .order_by(Repository.repo_name)
1218
1237
1219 @property
1238 @property
1220 def repositories_recursive_count(self):
1239 def repositories_recursive_count(self):
1221 cnt = self.repositories.count()
1240 cnt = self.repositories.count()
1222
1241
1223 def children_count(group):
1242 def children_count(group):
1224 cnt = 0
1243 cnt = 0
1225 for child in group.children:
1244 for child in group.children:
1226 cnt += child.repositories.count()
1245 cnt += child.repositories.count()
1227 cnt += children_count(child)
1246 cnt += children_count(child)
1228 return cnt
1247 return cnt
1229
1248
1230 return cnt + children_count(self)
1249 return cnt + children_count(self)
1231
1250
1232 def recursive_groups_and_repos(self):
1251 def recursive_groups_and_repos(self):
1233 """
1252 """
1234 Recursive return all groups, with repositories in those groups
1253 Recursive return all groups, with repositories in those groups
1235 """
1254 """
1236 all_ = []
1255 all_ = []
1237
1256
1238 def _get_members(root_gr):
1257 def _get_members(root_gr):
1239 for r in root_gr.repositories:
1258 for r in root_gr.repositories:
1240 all_.append(r)
1259 all_.append(r)
1241 childs = root_gr.children.all()
1260 childs = root_gr.children.all()
1242 if childs:
1261 if childs:
1243 for gr in childs:
1262 for gr in childs:
1244 all_.append(gr)
1263 all_.append(gr)
1245 _get_members(gr)
1264 _get_members(gr)
1246
1265
1247 _get_members(self)
1266 _get_members(self)
1248 return [self] + all_
1267 return [self] + all_
1249
1268
1250 def get_new_name(self, group_name):
1269 def get_new_name(self, group_name):
1251 """
1270 """
1252 returns new full group name based on parent and new name
1271 returns new full group name based on parent and new name
1253
1272
1254 :param group_name:
1273 :param group_name:
1255 """
1274 """
1256 path_prefix = (self.parent_group.full_path_splitted if
1275 path_prefix = (self.parent_group.full_path_splitted if
1257 self.parent_group else [])
1276 self.parent_group else [])
1258 return RepoGroup.url_sep().join(path_prefix + [group_name])
1277 return RepoGroup.url_sep().join(path_prefix + [group_name])
1259
1278
1260
1279
1261 class Permission(Base, BaseModel):
1280 class Permission(Base, BaseModel):
1262 __tablename__ = 'permissions'
1281 __tablename__ = 'permissions'
1263 __table_args__ = (
1282 __table_args__ = (
1264 Index('p_perm_name_idx', 'permission_name'),
1283 Index('p_perm_name_idx', 'permission_name'),
1265 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1284 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1266 'mysql_charset': 'utf8'},
1285 'mysql_charset': 'utf8'},
1267 )
1286 )
1268 PERMS = [
1287 PERMS = [
1269 ('repository.none', _('Repository no access')),
1288 ('repository.none', _('Repository no access')),
1270 ('repository.read', _('Repository read access')),
1289 ('repository.read', _('Repository read access')),
1271 ('repository.write', _('Repository write access')),
1290 ('repository.write', _('Repository write access')),
1272 ('repository.admin', _('Repository admin access')),
1291 ('repository.admin', _('Repository admin access')),
1273
1292
1274 ('group.none', _('Repositories Group no access')),
1293 ('group.none', _('Repositories Group no access')),
1275 ('group.read', _('Repositories Group read access')),
1294 ('group.read', _('Repositories Group read access')),
1276 ('group.write', _('Repositories Group write access')),
1295 ('group.write', _('Repositories Group write access')),
1277 ('group.admin', _('Repositories Group admin access')),
1296 ('group.admin', _('Repositories Group admin access')),
1278
1297
1279 ('hg.admin', _('RhodeCode Administrator')),
1298 ('hg.admin', _('RhodeCode Administrator')),
1280 ('hg.create.none', _('Repository creation disabled')),
1299 ('hg.create.none', _('Repository creation disabled')),
1281 ('hg.create.repository', _('Repository creation enabled')),
1300 ('hg.create.repository', _('Repository creation enabled')),
1282 ('hg.fork.none', _('Repository forking disabled')),
1301 ('hg.fork.none', _('Repository forking disabled')),
1283 ('hg.fork.repository', _('Repository forking enabled')),
1302 ('hg.fork.repository', _('Repository forking enabled')),
1284 ('hg.register.none', _('Register disabled')),
1303 ('hg.register.none', _('Register disabled')),
1285 ('hg.register.manual_activate', _('Register new user with RhodeCode '
1304 ('hg.register.manual_activate', _('Register new user with RhodeCode '
1286 'with manual activation')),
1305 'with manual activation')),
1287
1306
1288 ('hg.register.auto_activate', _('Register new user with RhodeCode '
1307 ('hg.register.auto_activate', _('Register new user with RhodeCode '
1289 'with auto activation')),
1308 'with auto activation')),
1290 ]
1309 ]
1291
1310
1292 # defines which permissions are more important higher the more important
1311 # defines which permissions are more important higher the more important
1293 PERM_WEIGHTS = {
1312 PERM_WEIGHTS = {
1294 'repository.none': 0,
1313 'repository.none': 0,
1295 'repository.read': 1,
1314 'repository.read': 1,
1296 'repository.write': 3,
1315 'repository.write': 3,
1297 'repository.admin': 4,
1316 'repository.admin': 4,
1298
1317
1299 'group.none': 0,
1318 'group.none': 0,
1300 'group.read': 1,
1319 'group.read': 1,
1301 'group.write': 3,
1320 'group.write': 3,
1302 'group.admin': 4,
1321 'group.admin': 4,
1303
1322
1304 'hg.fork.none': 0,
1323 'hg.fork.none': 0,
1305 'hg.fork.repository': 1,
1324 'hg.fork.repository': 1,
1306 'hg.create.none': 0,
1325 'hg.create.none': 0,
1307 'hg.create.repository':1
1326 'hg.create.repository':1
1308 }
1327 }
1309
1328
1310 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1329 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1311 permission_name = Column("permission_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1330 permission_name = Column("permission_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1312 permission_longname = Column("permission_longname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1331 permission_longname = Column("permission_longname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1313
1332
1314 def __unicode__(self):
1333 def __unicode__(self):
1315 return u"<%s('%s:%s')>" % (
1334 return u"<%s('%s:%s')>" % (
1316 self.__class__.__name__, self.permission_id, self.permission_name
1335 self.__class__.__name__, self.permission_id, self.permission_name
1317 )
1336 )
1318
1337
1319 @classmethod
1338 @classmethod
1320 def get_by_key(cls, key):
1339 def get_by_key(cls, key):
1321 return cls.query().filter(cls.permission_name == key).scalar()
1340 return cls.query().filter(cls.permission_name == key).scalar()
1322
1341
1323 @classmethod
1342 @classmethod
1324 def get_default_perms(cls, default_user_id):
1343 def get_default_perms(cls, default_user_id):
1325 q = Session().query(UserRepoToPerm, Repository, cls)\
1344 q = Session().query(UserRepoToPerm, Repository, cls)\
1326 .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
1345 .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
1327 .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
1346 .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
1328 .filter(UserRepoToPerm.user_id == default_user_id)
1347 .filter(UserRepoToPerm.user_id == default_user_id)
1329
1348
1330 return q.all()
1349 return q.all()
1331
1350
1332 @classmethod
1351 @classmethod
1333 def get_default_group_perms(cls, default_user_id):
1352 def get_default_group_perms(cls, default_user_id):
1334 q = Session().query(UserRepoGroupToPerm, RepoGroup, cls)\
1353 q = Session().query(UserRepoGroupToPerm, RepoGroup, cls)\
1335 .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
1354 .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
1336 .join((cls, UserRepoGroupToPerm.permission_id == cls.permission_id))\
1355 .join((cls, UserRepoGroupToPerm.permission_id == cls.permission_id))\
1337 .filter(UserRepoGroupToPerm.user_id == default_user_id)
1356 .filter(UserRepoGroupToPerm.user_id == default_user_id)
1338
1357
1339 return q.all()
1358 return q.all()
1340
1359
1341
1360
1342 class UserRepoToPerm(Base, BaseModel):
1361 class UserRepoToPerm(Base, BaseModel):
1343 __tablename__ = 'repo_to_perm'
1362 __tablename__ = 'repo_to_perm'
1344 __table_args__ = (
1363 __table_args__ = (
1345 UniqueConstraint('user_id', 'repository_id', 'permission_id'),
1364 UniqueConstraint('user_id', 'repository_id', 'permission_id'),
1346 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1365 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1347 'mysql_charset': 'utf8'}
1366 'mysql_charset': 'utf8'}
1348 )
1367 )
1349 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1368 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1350 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1369 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1351 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1370 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1352 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1371 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1353
1372
1354 user = relationship('User')
1373 user = relationship('User')
1355 repository = relationship('Repository')
1374 repository = relationship('Repository')
1356 permission = relationship('Permission')
1375 permission = relationship('Permission')
1357
1376
1358 @classmethod
1377 @classmethod
1359 def create(cls, user, repository, permission):
1378 def create(cls, user, repository, permission):
1360 n = cls()
1379 n = cls()
1361 n.user = user
1380 n.user = user
1362 n.repository = repository
1381 n.repository = repository
1363 n.permission = permission
1382 n.permission = permission
1364 Session().add(n)
1383 Session().add(n)
1365 return n
1384 return n
1366
1385
1367 def __unicode__(self):
1386 def __unicode__(self):
1368 return u'<user:%s => %s >' % (self.user, self.repository)
1387 return u'<user:%s => %s >' % (self.user, self.repository)
1369
1388
1370
1389
1371 class UserToPerm(Base, BaseModel):
1390 class UserToPerm(Base, BaseModel):
1372 __tablename__ = 'user_to_perm'
1391 __tablename__ = 'user_to_perm'
1373 __table_args__ = (
1392 __table_args__ = (
1374 UniqueConstraint('user_id', 'permission_id'),
1393 UniqueConstraint('user_id', 'permission_id'),
1375 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1394 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1376 'mysql_charset': 'utf8'}
1395 'mysql_charset': 'utf8'}
1377 )
1396 )
1378 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1397 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1379 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1398 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1380 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1399 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1381
1400
1382 user = relationship('User')
1401 user = relationship('User')
1383 permission = relationship('Permission', lazy='joined')
1402 permission = relationship('Permission', lazy='joined')
1384
1403
1385
1404
1386 class UsersGroupRepoToPerm(Base, BaseModel):
1405 class UsersGroupRepoToPerm(Base, BaseModel):
1387 __tablename__ = 'users_group_repo_to_perm'
1406 __tablename__ = 'users_group_repo_to_perm'
1388 __table_args__ = (
1407 __table_args__ = (
1389 UniqueConstraint('repository_id', 'users_group_id', 'permission_id'),
1408 UniqueConstraint('repository_id', 'users_group_id', 'permission_id'),
1390 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1409 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1391 'mysql_charset': 'utf8'}
1410 'mysql_charset': 'utf8'}
1392 )
1411 )
1393 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1412 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1394 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1413 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1395 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1414 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1396 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1415 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
1397
1416
1398 users_group = relationship('UsersGroup')
1417 users_group = relationship('UsersGroup')
1399 permission = relationship('Permission')
1418 permission = relationship('Permission')
1400 repository = relationship('Repository')
1419 repository = relationship('Repository')
1401
1420
1402 @classmethod
1421 @classmethod
1403 def create(cls, users_group, repository, permission):
1422 def create(cls, users_group, repository, permission):
1404 n = cls()
1423 n = cls()
1405 n.users_group = users_group
1424 n.users_group = users_group
1406 n.repository = repository
1425 n.repository = repository
1407 n.permission = permission
1426 n.permission = permission
1408 Session().add(n)
1427 Session().add(n)
1409 return n
1428 return n
1410
1429
1411 def __unicode__(self):
1430 def __unicode__(self):
1412 return u'<userGroup:%s => %s >' % (self.users_group, self.repository)
1431 return u'<userGroup:%s => %s >' % (self.users_group, self.repository)
1413
1432
1414
1433
1415 class UsersGroupToPerm(Base, BaseModel):
1434 class UsersGroupToPerm(Base, BaseModel):
1416 __tablename__ = 'users_group_to_perm'
1435 __tablename__ = 'users_group_to_perm'
1417 __table_args__ = (
1436 __table_args__ = (
1418 UniqueConstraint('users_group_id', 'permission_id',),
1437 UniqueConstraint('users_group_id', 'permission_id',),
1419 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1438 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1420 'mysql_charset': 'utf8'}
1439 'mysql_charset': 'utf8'}
1421 )
1440 )
1422 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1441 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1423 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1442 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1424 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1443 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1425
1444
1426 users_group = relationship('UsersGroup')
1445 users_group = relationship('UsersGroup')
1427 permission = relationship('Permission')
1446 permission = relationship('Permission')
1428
1447
1429
1448
1430 class UserRepoGroupToPerm(Base, BaseModel):
1449 class UserRepoGroupToPerm(Base, BaseModel):
1431 __tablename__ = 'user_repo_group_to_perm'
1450 __tablename__ = 'user_repo_group_to_perm'
1432 __table_args__ = (
1451 __table_args__ = (
1433 UniqueConstraint('user_id', 'group_id', 'permission_id'),
1452 UniqueConstraint('user_id', 'group_id', 'permission_id'),
1434 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1453 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1435 'mysql_charset': 'utf8'}
1454 'mysql_charset': 'utf8'}
1436 )
1455 )
1437
1456
1438 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1457 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1439 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1458 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1440 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1459 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1441 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1460 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1442
1461
1443 user = relationship('User')
1462 user = relationship('User')
1444 group = relationship('RepoGroup')
1463 group = relationship('RepoGroup')
1445 permission = relationship('Permission')
1464 permission = relationship('Permission')
1446
1465
1447
1466
1448 class UsersGroupRepoGroupToPerm(Base, BaseModel):
1467 class UsersGroupRepoGroupToPerm(Base, BaseModel):
1449 __tablename__ = 'users_group_repo_group_to_perm'
1468 __tablename__ = 'users_group_repo_group_to_perm'
1450 __table_args__ = (
1469 __table_args__ = (
1451 UniqueConstraint('users_group_id', 'group_id'),
1470 UniqueConstraint('users_group_id', 'group_id'),
1452 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1471 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1453 'mysql_charset': 'utf8'}
1472 'mysql_charset': 'utf8'}
1454 )
1473 )
1455
1474
1456 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)
1475 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)
1457 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1476 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
1458 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1477 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
1459 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1478 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
1460
1479
1461 users_group = relationship('UsersGroup')
1480 users_group = relationship('UsersGroup')
1462 permission = relationship('Permission')
1481 permission = relationship('Permission')
1463 group = relationship('RepoGroup')
1482 group = relationship('RepoGroup')
1464
1483
1465
1484
1466 class Statistics(Base, BaseModel):
1485 class Statistics(Base, BaseModel):
1467 __tablename__ = 'statistics'
1486 __tablename__ = 'statistics'
1468 __table_args__ = (
1487 __table_args__ = (
1469 UniqueConstraint('repository_id'),
1488 UniqueConstraint('repository_id'),
1470 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1489 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1471 'mysql_charset': 'utf8'}
1490 'mysql_charset': 'utf8'}
1472 )
1491 )
1473 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1492 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1474 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
1493 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
1475 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
1494 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
1476 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
1495 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
1477 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
1496 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
1478 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
1497 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
1479
1498
1480 repository = relationship('Repository', single_parent=True)
1499 repository = relationship('Repository', single_parent=True)
1481
1500
1482
1501
1483 class UserFollowing(Base, BaseModel):
1502 class UserFollowing(Base, BaseModel):
1484 __tablename__ = 'user_followings'
1503 __tablename__ = 'user_followings'
1485 __table_args__ = (
1504 __table_args__ = (
1486 UniqueConstraint('user_id', 'follows_repository_id'),
1505 UniqueConstraint('user_id', 'follows_repository_id'),
1487 UniqueConstraint('user_id', 'follows_user_id'),
1506 UniqueConstraint('user_id', 'follows_user_id'),
1488 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1507 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1489 'mysql_charset': 'utf8'}
1508 'mysql_charset': 'utf8'}
1490 )
1509 )
1491
1510
1492 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1511 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1493 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1512 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
1494 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
1513 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
1495 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
1514 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
1496 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
1515 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
1497
1516
1498 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
1517 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
1499
1518
1500 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
1519 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
1501 follows_repository = relationship('Repository', order_by='Repository.repo_name')
1520 follows_repository = relationship('Repository', order_by='Repository.repo_name')
1502
1521
1503 @classmethod
1522 @classmethod
1504 def get_repo_followers(cls, repo_id):
1523 def get_repo_followers(cls, repo_id):
1505 return cls.query().filter(cls.follows_repo_id == repo_id)
1524 return cls.query().filter(cls.follows_repo_id == repo_id)
1506
1525
1507
1526
1508 class CacheInvalidation(Base, BaseModel):
1527 class CacheInvalidation(Base, BaseModel):
1509 __tablename__ = 'cache_invalidation'
1528 __tablename__ = 'cache_invalidation'
1510 __table_args__ = (
1529 __table_args__ = (
1511 UniqueConstraint('cache_key'),
1530 UniqueConstraint('cache_key'),
1512 Index('key_idx', 'cache_key'),
1531 Index('key_idx', 'cache_key'),
1513 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1532 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1514 'mysql_charset': 'utf8'},
1533 'mysql_charset': 'utf8'},
1515 )
1534 )
1516 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1535 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
1517 cache_key = Column("cache_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1536 cache_key = Column("cache_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1518 cache_args = Column("cache_args", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1537 cache_args = Column("cache_args", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
1519 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
1538 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
1520
1539
1521 def __init__(self, cache_key, cache_args=''):
1540 def __init__(self, cache_key, cache_args=''):
1522 self.cache_key = cache_key
1541 self.cache_key = cache_key
1523 self.cache_args = cache_args
1542 self.cache_args = cache_args
1524 self.cache_active = False
1543 self.cache_active = False
1525
1544
1526 def __unicode__(self):
1545 def __unicode__(self):
1527 return u"<%s('%s:%s')>" % (self.__class__.__name__,
1546 return u"<%s('%s:%s')>" % (self.__class__.__name__,
1528 self.cache_id, self.cache_key)
1547 self.cache_id, self.cache_key)
1529
1548
1530 @property
1549 @property
1531 def prefix(self):
1550 def prefix(self):
1532 _split = self.cache_key.split(self.cache_args, 1)
1551 _split = self.cache_key.split(self.cache_args, 1)
1533 if _split and len(_split) == 2:
1552 if _split and len(_split) == 2:
1534 return _split[0]
1553 return _split[0]
1535 return ''
1554 return ''
1536
1555
1537 @classmethod
1556 @classmethod
1538 def clear_cache(cls):
1557 def clear_cache(cls):
1539 cls.query().delete()
1558 cls.query().delete()
1540
1559
1541 @classmethod
1560 @classmethod
1542 def _get_key(cls, key):
1561 def _get_key(cls, key):
1543 """
1562 """
1544 Wrapper for generating a key, together with a prefix
1563 Wrapper for generating a key, together with a prefix
1545
1564
1546 :param key:
1565 :param key:
1547 """
1566 """
1548 import rhodecode
1567 import rhodecode
1549 prefix = ''
1568 prefix = ''
1550 org_key = key
1569 org_key = key
1551 iid = rhodecode.CONFIG.get('instance_id')
1570 iid = rhodecode.CONFIG.get('instance_id')
1552 if iid:
1571 if iid:
1553 prefix = iid
1572 prefix = iid
1554
1573
1555 return "%s%s" % (prefix, key), prefix, org_key
1574 return "%s%s" % (prefix, key), prefix, org_key
1556
1575
1557 @classmethod
1576 @classmethod
1558 def get_by_key(cls, key):
1577 def get_by_key(cls, key):
1559 return cls.query().filter(cls.cache_key == key).scalar()
1578 return cls.query().filter(cls.cache_key == key).scalar()
1560
1579
1561 @classmethod
1580 @classmethod
1562 def get_by_repo_name(cls, repo_name):
1581 def get_by_repo_name(cls, repo_name):
1563 return cls.query().filter(cls.cache_args == repo_name).all()
1582 return cls.query().filter(cls.cache_args == repo_name).all()
1564
1583
1565 @classmethod
1584 @classmethod
1566 def _get_or_create_key(cls, key, repo_name, commit=True):
1585 def _get_or_create_key(cls, key, repo_name, commit=True):
1567 inv_obj = Session().query(cls).filter(cls.cache_key == key).scalar()
1586 inv_obj = Session().query(cls).filter(cls.cache_key == key).scalar()
1568 if not inv_obj:
1587 if not inv_obj:
1569 try:
1588 try:
1570 inv_obj = CacheInvalidation(key, repo_name)
1589 inv_obj = CacheInvalidation(key, repo_name)
1571 Session().add(inv_obj)
1590 Session().add(inv_obj)
1572 if commit:
1591 if commit:
1573 Session().commit()
1592 Session().commit()
1574 except Exception:
1593 except Exception:
1575 log.error(traceback.format_exc())
1594 log.error(traceback.format_exc())
1576 Session().rollback()
1595 Session().rollback()
1577 return inv_obj
1596 return inv_obj
1578
1597
1579 @classmethod
1598 @classmethod
1580 def invalidate(cls, key):
1599 def invalidate(cls, key):
1581 """
1600 """
1582 Returns Invalidation object if this given key should be invalidated
1601 Returns Invalidation object if this given key should be invalidated
1583 None otherwise. `cache_active = False` means that this cache
1602 None otherwise. `cache_active = False` means that this cache
1584 state is not valid and needs to be invalidated
1603 state is not valid and needs to be invalidated
1585
1604
1586 :param key:
1605 :param key:
1587 """
1606 """
1588 repo_name = key
1607 repo_name = key
1589 repo_name = remove_suffix(repo_name, '_README')
1608 repo_name = remove_suffix(repo_name, '_README')
1590 repo_name = remove_suffix(repo_name, '_RSS')
1609 repo_name = remove_suffix(repo_name, '_RSS')
1591 repo_name = remove_suffix(repo_name, '_ATOM')
1610 repo_name = remove_suffix(repo_name, '_ATOM')
1592
1611
1593 # adds instance prefix
1612 # adds instance prefix
1594 key, _prefix, _org_key = cls._get_key(key)
1613 key, _prefix, _org_key = cls._get_key(key)
1595 inv = cls._get_or_create_key(key, repo_name)
1614 inv = cls._get_or_create_key(key, repo_name)
1596
1615
1597 if inv and inv.cache_active is False:
1616 if inv and inv.cache_active is False:
1598 return inv
1617 return inv
1599
1618
1600 @classmethod
1619 @classmethod
1601 def set_invalidate(cls, key=None, repo_name=None):
1620 def set_invalidate(cls, key=None, repo_name=None):
1602 """
1621 """
1603 Mark this Cache key for invalidation, either by key or whole
1622 Mark this Cache key for invalidation, either by key or whole
1604 cache sets based on repo_name
1623 cache sets based on repo_name
1605
1624
1606 :param key:
1625 :param key:
1607 """
1626 """
1608 if key:
1627 if key:
1609 key, _prefix, _org_key = cls._get_key(key)
1628 key, _prefix, _org_key = cls._get_key(key)
1610 inv_objs = Session().query(cls).filter(cls.cache_key == key).all()
1629 inv_objs = Session().query(cls).filter(cls.cache_key == key).all()
1611 elif repo_name:
1630 elif repo_name:
1612 inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
1631 inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
1613
1632
1614 log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s'
1633 log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s'
1615 % (len(inv_objs), key, repo_name))
1634 % (len(inv_objs), key, repo_name))
1616 try:
1635 try:
1617 for inv_obj in inv_objs:
1636 for inv_obj in inv_objs:
1618 inv_obj.cache_active = False
1637 inv_obj.cache_active = False
1619 Session().add(inv_obj)
1638 Session().add(inv_obj)
1620 Session().commit()
1639 Session().commit()
1621 except Exception:
1640 except Exception:
1622 log.error(traceback.format_exc())
1641 log.error(traceback.format_exc())
1623 Session().rollback()
1642 Session().rollback()
1624
1643
1625 @classmethod
1644 @classmethod
1626 def set_valid(cls, key):
1645 def set_valid(cls, key):
1627 """
1646 """
1628 Mark this cache key as active and currently cached
1647 Mark this cache key as active and currently cached
1629
1648
1630 :param key:
1649 :param key:
1631 """
1650 """
1632 inv_obj = cls.get_by_key(key)
1651 inv_obj = cls.get_by_key(key)
1633 inv_obj.cache_active = True
1652 inv_obj.cache_active = True
1634 Session().add(inv_obj)
1653 Session().add(inv_obj)
1635 Session().commit()
1654 Session().commit()
1636
1655
1637 @classmethod
1656 @classmethod
1638 def get_cache_map(cls):
1657 def get_cache_map(cls):
1639
1658
1640 class cachemapdict(dict):
1659 class cachemapdict(dict):
1641
1660
1642 def __init__(self, *args, **kwargs):
1661 def __init__(self, *args, **kwargs):
1643 fixkey = kwargs.get('fixkey')
1662 fixkey = kwargs.get('fixkey')
1644 if fixkey:
1663 if fixkey:
1645 del kwargs['fixkey']
1664 del kwargs['fixkey']
1646 self.fixkey = fixkey
1665 self.fixkey = fixkey
1647 super(cachemapdict, self).__init__(*args, **kwargs)
1666 super(cachemapdict, self).__init__(*args, **kwargs)
1648
1667
1649 def __getattr__(self, name):
1668 def __getattr__(self, name):
1650 key = name
1669 key = name
1651 if self.fixkey:
1670 if self.fixkey:
1652 key, _prefix, _org_key = cls._get_key(key)
1671 key, _prefix, _org_key = cls._get_key(key)
1653 if key in self.__dict__:
1672 if key in self.__dict__:
1654 return self.__dict__[key]
1673 return self.__dict__[key]
1655 else:
1674 else:
1656 return self[key]
1675 return self[key]
1657
1676
1658 def __getitem__(self, key):
1677 def __getitem__(self, key):
1659 if self.fixkey:
1678 if self.fixkey:
1660 key, _prefix, _org_key = cls._get_key(key)
1679 key, _prefix, _org_key = cls._get_key(key)
1661 try:
1680 try:
1662 return super(cachemapdict, self).__getitem__(key)
1681 return super(cachemapdict, self).__getitem__(key)
1663 except KeyError:
1682 except KeyError:
1664 return
1683 return
1665
1684
1666 cache_map = cachemapdict(fixkey=True)
1685 cache_map = cachemapdict(fixkey=True)
1667 for obj in cls.query().all():
1686 for obj in cls.query().all():
1668 cache_map[obj.cache_key] = cachemapdict(obj.get_dict())
1687 cache_map[obj.cache_key] = cachemapdict(obj.get_dict())
1669 return cache_map
1688 return cache_map
1670
1689
1671
1690
1672 class ChangesetComment(Base, BaseModel):
1691 class ChangesetComment(Base, BaseModel):
1673 __tablename__ = 'changeset_comments'
1692 __tablename__ = 'changeset_comments'
1674 __table_args__ = (
1693 __table_args__ = (
1675 Index('cc_revision_idx', 'revision'),
1694 Index('cc_revision_idx', 'revision'),
1676 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1695 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1677 'mysql_charset': 'utf8'},
1696 'mysql_charset': 'utf8'},
1678 )
1697 )
1679 comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True)
1698 comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True)
1680 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1699 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1681 revision = Column('revision', String(40), nullable=True)
1700 revision = Column('revision', String(40), nullable=True)
1682 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1701 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1683 line_no = Column('line_no', Unicode(10), nullable=True)
1702 line_no = Column('line_no', Unicode(10), nullable=True)
1684 hl_lines = Column('hl_lines', Unicode(512), nullable=True)
1703 hl_lines = Column('hl_lines', Unicode(512), nullable=True)
1685 f_path = Column('f_path', Unicode(1000), nullable=True)
1704 f_path = Column('f_path', Unicode(1000), nullable=True)
1686 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False)
1705 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False)
1687 text = Column('text', UnicodeText(25000), nullable=False)
1706 text = Column('text', UnicodeText(25000), nullable=False)
1688 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1707 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1689 modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1708 modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1690
1709
1691 author = relationship('User', lazy='joined')
1710 author = relationship('User', lazy='joined')
1692 repo = relationship('Repository')
1711 repo = relationship('Repository')
1693 status_change = relationship('ChangesetStatus', cascade="all, delete, delete-orphan")
1712 status_change = relationship('ChangesetStatus', cascade="all, delete, delete-orphan")
1694 pull_request = relationship('PullRequest', lazy='joined')
1713 pull_request = relationship('PullRequest', lazy='joined')
1695
1714
1696 @classmethod
1715 @classmethod
1697 def get_users(cls, revision=None, pull_request_id=None):
1716 def get_users(cls, revision=None, pull_request_id=None):
1698 """
1717 """
1699 Returns user associated with this ChangesetComment. ie those
1718 Returns user associated with this ChangesetComment. ie those
1700 who actually commented
1719 who actually commented
1701
1720
1702 :param cls:
1721 :param cls:
1703 :param revision:
1722 :param revision:
1704 """
1723 """
1705 q = Session().query(User)\
1724 q = Session().query(User)\
1706 .join(ChangesetComment.author)
1725 .join(ChangesetComment.author)
1707 if revision:
1726 if revision:
1708 q = q.filter(cls.revision == revision)
1727 q = q.filter(cls.revision == revision)
1709 elif pull_request_id:
1728 elif pull_request_id:
1710 q = q.filter(cls.pull_request_id == pull_request_id)
1729 q = q.filter(cls.pull_request_id == pull_request_id)
1711 return q.all()
1730 return q.all()
1712
1731
1713
1732
1714 class ChangesetStatus(Base, BaseModel):
1733 class ChangesetStatus(Base, BaseModel):
1715 __tablename__ = 'changeset_statuses'
1734 __tablename__ = 'changeset_statuses'
1716 __table_args__ = (
1735 __table_args__ = (
1717 Index('cs_revision_idx', 'revision'),
1736 Index('cs_revision_idx', 'revision'),
1718 Index('cs_version_idx', 'version'),
1737 Index('cs_version_idx', 'version'),
1719 UniqueConstraint('repo_id', 'revision', 'version'),
1738 UniqueConstraint('repo_id', 'revision', 'version'),
1720 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1739 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1721 'mysql_charset': 'utf8'}
1740 'mysql_charset': 'utf8'}
1722 )
1741 )
1723 STATUS_NOT_REVIEWED = DEFAULT = 'not_reviewed'
1742 STATUS_NOT_REVIEWED = DEFAULT = 'not_reviewed'
1724 STATUS_APPROVED = 'approved'
1743 STATUS_APPROVED = 'approved'
1725 STATUS_REJECTED = 'rejected'
1744 STATUS_REJECTED = 'rejected'
1726 STATUS_UNDER_REVIEW = 'under_review'
1745 STATUS_UNDER_REVIEW = 'under_review'
1727
1746
1728 STATUSES = [
1747 STATUSES = [
1729 (STATUS_NOT_REVIEWED, _("Not Reviewed")), # (no icon) and default
1748 (STATUS_NOT_REVIEWED, _("Not Reviewed")), # (no icon) and default
1730 (STATUS_APPROVED, _("Approved")),
1749 (STATUS_APPROVED, _("Approved")),
1731 (STATUS_REJECTED, _("Rejected")),
1750 (STATUS_REJECTED, _("Rejected")),
1732 (STATUS_UNDER_REVIEW, _("Under Review")),
1751 (STATUS_UNDER_REVIEW, _("Under Review")),
1733 ]
1752 ]
1734
1753
1735 changeset_status_id = Column('changeset_status_id', Integer(), nullable=False, primary_key=True)
1754 changeset_status_id = Column('changeset_status_id', Integer(), nullable=False, primary_key=True)
1736 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1755 repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1737 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1756 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1738 revision = Column('revision', String(40), nullable=False)
1757 revision = Column('revision', String(40), nullable=False)
1739 status = Column('status', String(128), nullable=False, default=DEFAULT)
1758 status = Column('status', String(128), nullable=False, default=DEFAULT)
1740 changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
1759 changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
1741 modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
1760 modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
1742 version = Column('version', Integer(), nullable=False, default=0)
1761 version = Column('version', Integer(), nullable=False, default=0)
1743 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1762 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
1744
1763
1745 author = relationship('User', lazy='joined')
1764 author = relationship('User', lazy='joined')
1746 repo = relationship('Repository')
1765 repo = relationship('Repository')
1747 comment = relationship('ChangesetComment', lazy='joined')
1766 comment = relationship('ChangesetComment', lazy='joined')
1748 pull_request = relationship('PullRequest', lazy='joined')
1767 pull_request = relationship('PullRequest', lazy='joined')
1749
1768
1750 def __unicode__(self):
1769 def __unicode__(self):
1751 return u"<%s('%s:%s')>" % (
1770 return u"<%s('%s:%s')>" % (
1752 self.__class__.__name__,
1771 self.__class__.__name__,
1753 self.status, self.author
1772 self.status, self.author
1754 )
1773 )
1755
1774
1756 @classmethod
1775 @classmethod
1757 def get_status_lbl(cls, value):
1776 def get_status_lbl(cls, value):
1758 return dict(cls.STATUSES).get(value)
1777 return dict(cls.STATUSES).get(value)
1759
1778
1760 @property
1779 @property
1761 def status_lbl(self):
1780 def status_lbl(self):
1762 return ChangesetStatus.get_status_lbl(self.status)
1781 return ChangesetStatus.get_status_lbl(self.status)
1763
1782
1764
1783
1765 class PullRequest(Base, BaseModel):
1784 class PullRequest(Base, BaseModel):
1766 __tablename__ = 'pull_requests'
1785 __tablename__ = 'pull_requests'
1767 __table_args__ = (
1786 __table_args__ = (
1768 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1787 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1769 'mysql_charset': 'utf8'},
1788 'mysql_charset': 'utf8'},
1770 )
1789 )
1771
1790
1772 STATUS_NEW = u'new'
1791 STATUS_NEW = u'new'
1773 STATUS_OPEN = u'open'
1792 STATUS_OPEN = u'open'
1774 STATUS_CLOSED = u'closed'
1793 STATUS_CLOSED = u'closed'
1775
1794
1776 pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True)
1795 pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True)
1777 title = Column('title', Unicode(256), nullable=True)
1796 title = Column('title', Unicode(256), nullable=True)
1778 description = Column('description', UnicodeText(10240), nullable=True)
1797 description = Column('description', UnicodeText(10240), nullable=True)
1779 status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW)
1798 status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW)
1780 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1799 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1781 updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1800 updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1782 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1801 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
1783 _revisions = Column('revisions', UnicodeText(20500)) # 500 revisions max
1802 _revisions = Column('revisions', UnicodeText(20500)) # 500 revisions max
1784 org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1803 org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1785 org_ref = Column('org_ref', Unicode(256), nullable=False)
1804 org_ref = Column('org_ref', Unicode(256), nullable=False)
1786 other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1805 other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
1787 other_ref = Column('other_ref', Unicode(256), nullable=False)
1806 other_ref = Column('other_ref', Unicode(256), nullable=False)
1788
1807
1789 @hybrid_property
1808 @hybrid_property
1790 def revisions(self):
1809 def revisions(self):
1791 return self._revisions.split(':')
1810 return self._revisions.split(':')
1792
1811
1793 @revisions.setter
1812 @revisions.setter
1794 def revisions(self, val):
1813 def revisions(self, val):
1795 self._revisions = ':'.join(val)
1814 self._revisions = ':'.join(val)
1796
1815
1816 @property
1817 def org_ref_parts(self):
1818 return self.org_ref.split(':')
1819
1820 @property
1821 def other_ref_parts(self):
1822 return self.other_ref.split(':')
1823
1797 author = relationship('User', lazy='joined')
1824 author = relationship('User', lazy='joined')
1798 reviewers = relationship('PullRequestReviewers',
1825 reviewers = relationship('PullRequestReviewers',
1799 cascade="all, delete, delete-orphan")
1826 cascade="all, delete, delete-orphan")
1800 org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
1827 org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
1801 other_repo = relationship('Repository', primaryjoin='PullRequest.other_repo_id==Repository.repo_id')
1828 other_repo = relationship('Repository', primaryjoin='PullRequest.other_repo_id==Repository.repo_id')
1802 statuses = relationship('ChangesetStatus')
1829 statuses = relationship('ChangesetStatus')
1803 comments = relationship('ChangesetComment',
1830 comments = relationship('ChangesetComment',
1804 cascade="all, delete, delete-orphan")
1831 cascade="all, delete, delete-orphan")
1805
1832
1806 def is_closed(self):
1833 def is_closed(self):
1807 return self.status == self.STATUS_CLOSED
1834 return self.status == self.STATUS_CLOSED
1808
1835
1809 def __json__(self):
1836 def __json__(self):
1810 return dict(
1837 return dict(
1811 revisions=self.revisions
1838 revisions=self.revisions
1812 )
1839 )
1813
1840
1814
1841
1815 class PullRequestReviewers(Base, BaseModel):
1842 class PullRequestReviewers(Base, BaseModel):
1816 __tablename__ = 'pull_request_reviewers'
1843 __tablename__ = 'pull_request_reviewers'
1817 __table_args__ = (
1844 __table_args__ = (
1818 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1845 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1819 'mysql_charset': 'utf8'},
1846 'mysql_charset': 'utf8'},
1820 )
1847 )
1821
1848
1822 def __init__(self, user=None, pull_request=None):
1849 def __init__(self, user=None, pull_request=None):
1823 self.user = user
1850 self.user = user
1824 self.pull_request = pull_request
1851 self.pull_request = pull_request
1825
1852
1826 pull_requests_reviewers_id = Column('pull_requests_reviewers_id', Integer(), nullable=False, primary_key=True)
1853 pull_requests_reviewers_id = Column('pull_requests_reviewers_id', Integer(), nullable=False, primary_key=True)
1827 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
1854 pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
1828 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True)
1855 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True)
1829
1856
1830 user = relationship('User')
1857 user = relationship('User')
1831 pull_request = relationship('PullRequest')
1858 pull_request = relationship('PullRequest')
1832
1859
1833
1860
1834 class Notification(Base, BaseModel):
1861 class Notification(Base, BaseModel):
1835 __tablename__ = 'notifications'
1862 __tablename__ = 'notifications'
1836 __table_args__ = (
1863 __table_args__ = (
1837 Index('notification_type_idx', 'type'),
1864 Index('notification_type_idx', 'type'),
1838 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1865 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1839 'mysql_charset': 'utf8'},
1866 'mysql_charset': 'utf8'},
1840 )
1867 )
1841
1868
1842 TYPE_CHANGESET_COMMENT = u'cs_comment'
1869 TYPE_CHANGESET_COMMENT = u'cs_comment'
1843 TYPE_MESSAGE = u'message'
1870 TYPE_MESSAGE = u'message'
1844 TYPE_MENTION = u'mention'
1871 TYPE_MENTION = u'mention'
1845 TYPE_REGISTRATION = u'registration'
1872 TYPE_REGISTRATION = u'registration'
1846 TYPE_PULL_REQUEST = u'pull_request'
1873 TYPE_PULL_REQUEST = u'pull_request'
1847 TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment'
1874 TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment'
1848
1875
1849 notification_id = Column('notification_id', Integer(), nullable=False, primary_key=True)
1876 notification_id = Column('notification_id', Integer(), nullable=False, primary_key=True)
1850 subject = Column('subject', Unicode(512), nullable=True)
1877 subject = Column('subject', Unicode(512), nullable=True)
1851 body = Column('body', UnicodeText(50000), nullable=True)
1878 body = Column('body', UnicodeText(50000), nullable=True)
1852 created_by = Column("created_by", Integer(), ForeignKey('users.user_id'), nullable=True)
1879 created_by = Column("created_by", Integer(), ForeignKey('users.user_id'), nullable=True)
1853 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1880 created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
1854 type_ = Column('type', Unicode(256))
1881 type_ = Column('type', Unicode(256))
1855
1882
1856 created_by_user = relationship('User')
1883 created_by_user = relationship('User')
1857 notifications_to_users = relationship('UserNotification', lazy='joined',
1884 notifications_to_users = relationship('UserNotification', lazy='joined',
1858 cascade="all, delete, delete-orphan")
1885 cascade="all, delete, delete-orphan")
1859
1886
1860 @property
1887 @property
1861 def recipients(self):
1888 def recipients(self):
1862 return [x.user for x in UserNotification.query()\
1889 return [x.user for x in UserNotification.query()\
1863 .filter(UserNotification.notification == self)\
1890 .filter(UserNotification.notification == self)\
1864 .order_by(UserNotification.user_id.asc()).all()]
1891 .order_by(UserNotification.user_id.asc()).all()]
1865
1892
1866 @classmethod
1893 @classmethod
1867 def create(cls, created_by, subject, body, recipients, type_=None):
1894 def create(cls, created_by, subject, body, recipients, type_=None):
1868 if type_ is None:
1895 if type_ is None:
1869 type_ = Notification.TYPE_MESSAGE
1896 type_ = Notification.TYPE_MESSAGE
1870
1897
1871 notification = cls()
1898 notification = cls()
1872 notification.created_by_user = created_by
1899 notification.created_by_user = created_by
1873 notification.subject = subject
1900 notification.subject = subject
1874 notification.body = body
1901 notification.body = body
1875 notification.type_ = type_
1902 notification.type_ = type_
1876 notification.created_on = datetime.datetime.now()
1903 notification.created_on = datetime.datetime.now()
1877
1904
1878 for u in recipients:
1905 for u in recipients:
1879 assoc = UserNotification()
1906 assoc = UserNotification()
1880 assoc.notification = notification
1907 assoc.notification = notification
1881 u.notifications.append(assoc)
1908 u.notifications.append(assoc)
1882 Session().add(notification)
1909 Session().add(notification)
1883 return notification
1910 return notification
1884
1911
1885 @property
1912 @property
1886 def description(self):
1913 def description(self):
1887 from rhodecode.model.notification import NotificationModel
1914 from rhodecode.model.notification import NotificationModel
1888 return NotificationModel().make_description(self)
1915 return NotificationModel().make_description(self)
1889
1916
1890
1917
1891 class UserNotification(Base, BaseModel):
1918 class UserNotification(Base, BaseModel):
1892 __tablename__ = 'user_to_notification'
1919 __tablename__ = 'user_to_notification'
1893 __table_args__ = (
1920 __table_args__ = (
1894 UniqueConstraint('user_id', 'notification_id'),
1921 UniqueConstraint('user_id', 'notification_id'),
1895 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1922 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1896 'mysql_charset': 'utf8'}
1923 'mysql_charset': 'utf8'}
1897 )
1924 )
1898 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), primary_key=True)
1925 user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), primary_key=True)
1899 notification_id = Column("notification_id", Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
1926 notification_id = Column("notification_id", Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
1900 read = Column('read', Boolean, default=False)
1927 read = Column('read', Boolean, default=False)
1901 sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
1928 sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
1902
1929
1903 user = relationship('User', lazy="joined")
1930 user = relationship('User', lazy="joined")
1904 notification = relationship('Notification', lazy="joined",
1931 notification = relationship('Notification', lazy="joined",
1905 order_by=lambda: Notification.created_on.desc(),)
1932 order_by=lambda: Notification.created_on.desc(),)
1906
1933
1907 def mark_as_read(self):
1934 def mark_as_read(self):
1908 self.read = True
1935 self.read = True
1909 Session().add(self)
1936 Session().add(self)
1910
1937
1911
1938
1912 class DbMigrateVersion(Base, BaseModel):
1939 class DbMigrateVersion(Base, BaseModel):
1913 __tablename__ = 'db_migrate_version'
1940 __tablename__ = 'db_migrate_version'
1914 __table_args__ = (
1941 __table_args__ = (
1915 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1942 {'extend_existing': True, 'mysql_engine': 'InnoDB',
1916 'mysql_charset': 'utf8'},
1943 'mysql_charset': 'utf8'},
1917 )
1944 )
1918 repository_id = Column('repository_id', String(250), primary_key=True)
1945 repository_id = Column('repository_id', String(250), primary_key=True)
1919 repository_path = Column('repository_path', Text)
1946 repository_path = Column('repository_path', Text)
1920 version = Column('version', Integer)
1947 version = Column('version', Integer)
@@ -1,4847 +1,4849 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 {
2 {
3 border: 0;
3 border: 0;
4 outline: 0;
4 outline: 0;
5 font-size: 100%;
5 font-size: 100%;
6 vertical-align: baseline;
6 vertical-align: baseline;
7 background: transparent;
7 background: transparent;
8 margin: 0;
8 margin: 0;
9 padding: 0;
9 padding: 0;
10 }
10 }
11
11
12 body {
12 body {
13 line-height: 1;
13 line-height: 1;
14 height: 100%;
14 height: 100%;
15 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
16 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
17 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
18 color: #000;
18 color: #000;
19 margin: 0;
19 margin: 0;
20 padding: 0;
20 padding: 0;
21 font-size: 12px;
21 font-size: 12px;
22 }
22 }
23
23
24 ol,ul {
24 ol,ul {
25 list-style: none;
25 list-style: none;
26 }
26 }
27
27
28 blockquote,q {
28 blockquote,q {
29 quotes: none;
29 quotes: none;
30 }
30 }
31
31
32 blockquote:before,blockquote:after,q:before,q:after {
32 blockquote:before,blockquote:after,q:before,q:after {
33 content: none;
33 content: none;
34 }
34 }
35
35
36 :focus {
36 :focus {
37 outline: 0;
37 outline: 0;
38 }
38 }
39
39
40 del {
40 del {
41 text-decoration: line-through;
41 text-decoration: line-through;
42 }
42 }
43
43
44 table {
44 table {
45 border-collapse: collapse;
45 border-collapse: collapse;
46 border-spacing: 0;
46 border-spacing: 0;
47 }
47 }
48
48
49 html {
49 html {
50 height: 100%;
50 height: 100%;
51 }
51 }
52
52
53 a {
53 a {
54 color: #003367;
54 color: #003367;
55 text-decoration: none;
55 text-decoration: none;
56 cursor: pointer;
56 cursor: pointer;
57 }
57 }
58
58
59 a:hover {
59 a:hover {
60 color: #316293;
60 color: #316293;
61 text-decoration: underline;
61 text-decoration: underline;
62 }
62 }
63
63
64 h1,h2,h3,h4,h5,h6,
64 h1,h2,h3,h4,h5,h6,
65 div.h1,div.h2,div.h3,div.h4,div.h5,div.h6 {
65 div.h1,div.h2,div.h3,div.h4,div.h5,div.h6 {
66 color: #292929;
66 color: #292929;
67 font-weight: 700;
67 font-weight: 700;
68 }
68 }
69
69
70 h1,div.h1 {
70 h1,div.h1 {
71 font-size: 22px;
71 font-size: 22px;
72 }
72 }
73
73
74 h2,div.h2 {
74 h2,div.h2 {
75 font-size: 20px;
75 font-size: 20px;
76 }
76 }
77
77
78 h3,div.h3 {
78 h3,div.h3 {
79 font-size: 18px;
79 font-size: 18px;
80 }
80 }
81
81
82 h4,div.h4 {
82 h4,div.h4 {
83 font-size: 16px;
83 font-size: 16px;
84 }
84 }
85
85
86 h5,div.h5 {
86 h5,div.h5 {
87 font-size: 14px;
87 font-size: 14px;
88 }
88 }
89
89
90 h6,div.h6 {
90 h6,div.h6 {
91 font-size: 11px;
91 font-size: 11px;
92 }
92 }
93
93
94 ul.circle {
94 ul.circle {
95 list-style-type: circle;
95 list-style-type: circle;
96 }
96 }
97
97
98 ul.disc {
98 ul.disc {
99 list-style-type: disc;
99 list-style-type: disc;
100 }
100 }
101
101
102 ul.square {
102 ul.square {
103 list-style-type: square;
103 list-style-type: square;
104 }
104 }
105
105
106 ol.lower-roman {
106 ol.lower-roman {
107 list-style-type: lower-roman;
107 list-style-type: lower-roman;
108 }
108 }
109
109
110 ol.upper-roman {
110 ol.upper-roman {
111 list-style-type: upper-roman;
111 list-style-type: upper-roman;
112 }
112 }
113
113
114 ol.lower-alpha {
114 ol.lower-alpha {
115 list-style-type: lower-alpha;
115 list-style-type: lower-alpha;
116 }
116 }
117
117
118 ol.upper-alpha {
118 ol.upper-alpha {
119 list-style-type: upper-alpha;
119 list-style-type: upper-alpha;
120 }
120 }
121
121
122 ol.decimal {
122 ol.decimal {
123 list-style-type: decimal;
123 list-style-type: decimal;
124 }
124 }
125
125
126 div.color {
126 div.color {
127 clear: both;
127 clear: both;
128 overflow: hidden;
128 overflow: hidden;
129 position: absolute;
129 position: absolute;
130 background: #FFF;
130 background: #FFF;
131 margin: 7px 0 0 60px;
131 margin: 7px 0 0 60px;
132 padding: 1px 1px 1px 0;
132 padding: 1px 1px 1px 0;
133 }
133 }
134
134
135 div.color a {
135 div.color a {
136 width: 15px;
136 width: 15px;
137 height: 15px;
137 height: 15px;
138 display: block;
138 display: block;
139 float: left;
139 float: left;
140 margin: 0 0 0 1px;
140 margin: 0 0 0 1px;
141 padding: 0;
141 padding: 0;
142 }
142 }
143
143
144 div.options {
144 div.options {
145 clear: both;
145 clear: both;
146 overflow: hidden;
146 overflow: hidden;
147 position: absolute;
147 position: absolute;
148 background: #FFF;
148 background: #FFF;
149 margin: 7px 0 0 162px;
149 margin: 7px 0 0 162px;
150 padding: 0;
150 padding: 0;
151 }
151 }
152
152
153 div.options a {
153 div.options a {
154 height: 1%;
154 height: 1%;
155 display: block;
155 display: block;
156 text-decoration: none;
156 text-decoration: none;
157 margin: 0;
157 margin: 0;
158 padding: 3px 8px;
158 padding: 3px 8px;
159 }
159 }
160
160
161 .top-left-rounded-corner {
161 .top-left-rounded-corner {
162 -webkit-border-top-left-radius: 8px;
162 -webkit-border-top-left-radius: 8px;
163 -khtml-border-radius-topleft: 8px;
163 -khtml-border-radius-topleft: 8px;
164 -moz-border-radius-topleft: 8px;
164 -moz-border-radius-topleft: 8px;
165 border-top-left-radius: 8px;
165 border-top-left-radius: 8px;
166 }
166 }
167
167
168 .top-right-rounded-corner {
168 .top-right-rounded-corner {
169 -webkit-border-top-right-radius: 8px;
169 -webkit-border-top-right-radius: 8px;
170 -khtml-border-radius-topright: 8px;
170 -khtml-border-radius-topright: 8px;
171 -moz-border-radius-topright: 8px;
171 -moz-border-radius-topright: 8px;
172 border-top-right-radius: 8px;
172 border-top-right-radius: 8px;
173 }
173 }
174
174
175 .bottom-left-rounded-corner {
175 .bottom-left-rounded-corner {
176 -webkit-border-bottom-left-radius: 8px;
176 -webkit-border-bottom-left-radius: 8px;
177 -khtml-border-radius-bottomleft: 8px;
177 -khtml-border-radius-bottomleft: 8px;
178 -moz-border-radius-bottomleft: 8px;
178 -moz-border-radius-bottomleft: 8px;
179 border-bottom-left-radius: 8px;
179 border-bottom-left-radius: 8px;
180 }
180 }
181
181
182 .bottom-right-rounded-corner {
182 .bottom-right-rounded-corner {
183 -webkit-border-bottom-right-radius: 8px;
183 -webkit-border-bottom-right-radius: 8px;
184 -khtml-border-radius-bottomright: 8px;
184 -khtml-border-radius-bottomright: 8px;
185 -moz-border-radius-bottomright: 8px;
185 -moz-border-radius-bottomright: 8px;
186 border-bottom-right-radius: 8px;
186 border-bottom-right-radius: 8px;
187 }
187 }
188
188
189 .top-left-rounded-corner-mid {
189 .top-left-rounded-corner-mid {
190 -webkit-border-top-left-radius: 4px;
190 -webkit-border-top-left-radius: 4px;
191 -khtml-border-radius-topleft: 4px;
191 -khtml-border-radius-topleft: 4px;
192 -moz-border-radius-topleft: 4px;
192 -moz-border-radius-topleft: 4px;
193 border-top-left-radius: 4px;
193 border-top-left-radius: 4px;
194 }
194 }
195
195
196 .top-right-rounded-corner-mid {
196 .top-right-rounded-corner-mid {
197 -webkit-border-top-right-radius: 4px;
197 -webkit-border-top-right-radius: 4px;
198 -khtml-border-radius-topright: 4px;
198 -khtml-border-radius-topright: 4px;
199 -moz-border-radius-topright: 4px;
199 -moz-border-radius-topright: 4px;
200 border-top-right-radius: 4px;
200 border-top-right-radius: 4px;
201 }
201 }
202
202
203 .bottom-left-rounded-corner-mid {
203 .bottom-left-rounded-corner-mid {
204 -webkit-border-bottom-left-radius: 4px;
204 -webkit-border-bottom-left-radius: 4px;
205 -khtml-border-radius-bottomleft: 4px;
205 -khtml-border-radius-bottomleft: 4px;
206 -moz-border-radius-bottomleft: 4px;
206 -moz-border-radius-bottomleft: 4px;
207 border-bottom-left-radius: 4px;
207 border-bottom-left-radius: 4px;
208 }
208 }
209
209
210 .bottom-right-rounded-corner-mid {
210 .bottom-right-rounded-corner-mid {
211 -webkit-border-bottom-right-radius: 4px;
211 -webkit-border-bottom-right-radius: 4px;
212 -khtml-border-radius-bottomright: 4px;
212 -khtml-border-radius-bottomright: 4px;
213 -moz-border-radius-bottomright: 4px;
213 -moz-border-radius-bottomright: 4px;
214 border-bottom-right-radius: 4px;
214 border-bottom-right-radius: 4px;
215 }
215 }
216
216
217 .help-block {
217 .help-block {
218 color: #999999;
218 color: #999999;
219 display: block;
219 display: block;
220 margin-bottom: 0;
220 margin-bottom: 0;
221 margin-top: 5px;
221 margin-top: 5px;
222 }
222 }
223
223
224 .empty_data{
224 .empty_data{
225 color:#B9B9B9;
225 color:#B9B9B9;
226 }
226 }
227
227
228 a.permalink{
228 a.permalink{
229 visibility: hidden;
229 visibility: hidden;
230 }
230 }
231
231
232 a.permalink:hover{
232 a.permalink:hover{
233 text-decoration: none;
233 text-decoration: none;
234 }
234 }
235
235
236 h1:hover > a.permalink,
236 h1:hover > a.permalink,
237 h2:hover > a.permalink,
237 h2:hover > a.permalink,
238 h3:hover > a.permalink,
238 h3:hover > a.permalink,
239 h4:hover > a.permalink,
239 h4:hover > a.permalink,
240 h5:hover > a.permalink,
240 h5:hover > a.permalink,
241 h6:hover > a.permalink,
241 h6:hover > a.permalink,
242 div:hover > a.permalink {
242 div:hover > a.permalink {
243 visibility: visible;
243 visibility: visible;
244 }
244 }
245
245
246 #header {
246 #header {
247 margin: 0;
247 margin: 0;
248 padding: 0 10px;
248 padding: 0 10px;
249 }
249 }
250
250
251 #header ul#logged-user {
251 #header ul#logged-user {
252 margin-bottom: 5px !important;
252 margin-bottom: 5px !important;
253 -webkit-border-radius: 0px 0px 8px 8px;
253 -webkit-border-radius: 0px 0px 8px 8px;
254 -khtml-border-radius: 0px 0px 8px 8px;
254 -khtml-border-radius: 0px 0px 8px 8px;
255 -moz-border-radius: 0px 0px 8px 8px;
255 -moz-border-radius: 0px 0px 8px 8px;
256 border-radius: 0px 0px 8px 8px;
256 border-radius: 0px 0px 8px 8px;
257 height: 37px;
257 height: 37px;
258 background-color: #003B76;
258 background-color: #003B76;
259 background-repeat: repeat-x;
259 background-repeat: repeat-x;
260 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
260 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
261 background-image: -moz-linear-gradient(top, #003b76, #00376e);
261 background-image: -moz-linear-gradient(top, #003b76, #00376e);
262 background-image: -ms-linear-gradient(top, #003b76, #00376e);
262 background-image: -ms-linear-gradient(top, #003b76, #00376e);
263 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
263 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
264 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
264 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
265 background-image: -o-linear-gradient(top, #003b76, #00376e);
265 background-image: -o-linear-gradient(top, #003b76, #00376e);
266 background-image: linear-gradient(top, #003b76, #00376e);
266 background-image: linear-gradient(top, #003b76, #00376e);
267 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
267 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
268 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
268 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
269 }
269 }
270
270
271 #header ul#logged-user li {
271 #header ul#logged-user li {
272 list-style: none;
272 list-style: none;
273 float: left;
273 float: left;
274 margin: 8px 0 0;
274 margin: 8px 0 0;
275 padding: 4px 12px;
275 padding: 4px 12px;
276 border-left: 1px solid #316293;
276 border-left: 1px solid #316293;
277 }
277 }
278
278
279 #header ul#logged-user li.first {
279 #header ul#logged-user li.first {
280 border-left: none;
280 border-left: none;
281 margin: 4px;
281 margin: 4px;
282 }
282 }
283
283
284 #header ul#logged-user li.first div.gravatar {
284 #header ul#logged-user li.first div.gravatar {
285 margin-top: -2px;
285 margin-top: -2px;
286 }
286 }
287
287
288 #header ul#logged-user li.first div.account {
288 #header ul#logged-user li.first div.account {
289 padding-top: 4px;
289 padding-top: 4px;
290 float: left;
290 float: left;
291 }
291 }
292
292
293 #header ul#logged-user li.last {
293 #header ul#logged-user li.last {
294 border-right: none;
294 border-right: none;
295 }
295 }
296
296
297 #header ul#logged-user li a {
297 #header ul#logged-user li a {
298 color: #fff;
298 color: #fff;
299 font-weight: 700;
299 font-weight: 700;
300 text-decoration: none;
300 text-decoration: none;
301 }
301 }
302
302
303 #header ul#logged-user li a:hover {
303 #header ul#logged-user li a:hover {
304 text-decoration: underline;
304 text-decoration: underline;
305 }
305 }
306
306
307 #header ul#logged-user li.highlight a {
307 #header ul#logged-user li.highlight a {
308 color: #fff;
308 color: #fff;
309 }
309 }
310
310
311 #header ul#logged-user li.highlight a:hover {
311 #header ul#logged-user li.highlight a:hover {
312 color: #FFF;
312 color: #FFF;
313 }
313 }
314
314
315 #header #header-inner {
315 #header #header-inner {
316 min-height: 44px;
316 min-height: 44px;
317 clear: both;
317 clear: both;
318 position: relative;
318 position: relative;
319 background-color: #003B76;
319 background-color: #003B76;
320 background-repeat: repeat-x;
320 background-repeat: repeat-x;
321 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
321 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
322 background-image: -moz-linear-gradient(top, #003b76, #00376e);
322 background-image: -moz-linear-gradient(top, #003b76, #00376e);
323 background-image: -ms-linear-gradient(top, #003b76, #00376e);
323 background-image: -ms-linear-gradient(top, #003b76, #00376e);
324 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
324 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
325 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
325 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
326 background-image: -o-linear-gradient(top, #003b76, #00376e);
326 background-image: -o-linear-gradient(top, #003b76, #00376e);
327 background-image: linear-gradient(top, #003b76, #00376e);
327 background-image: linear-gradient(top, #003b76, #00376e);
328 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
328 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
329 margin: 0;
329 margin: 0;
330 padding: 0;
330 padding: 0;
331 display: block;
331 display: block;
332 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
332 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
333 -webkit-border-radius: 4px 4px 4px 4px;
333 -webkit-border-radius: 4px 4px 4px 4px;
334 -khtml-border-radius: 4px 4px 4px 4px;
334 -khtml-border-radius: 4px 4px 4px 4px;
335 -moz-border-radius: 4px 4px 4px 4px;
335 -moz-border-radius: 4px 4px 4px 4px;
336 border-radius: 4px 4px 4px 4px;
336 border-radius: 4px 4px 4px 4px;
337 }
337 }
338 #header #header-inner.hover{
338 #header #header-inner.hover{
339 position: fixed !important;
339 position: fixed !important;
340 width: 100% !important;
340 width: 100% !important;
341 margin-left: -10px !important;
341 margin-left: -10px !important;
342 z-index: 10000;
342 z-index: 10000;
343 -webkit-border-radius: 0px 0px 0px 0px;
343 -webkit-border-radius: 0px 0px 0px 0px;
344 -khtml-border-radius: 0px 0px 0px 0px;
344 -khtml-border-radius: 0px 0px 0px 0px;
345 -moz-border-radius: 0px 0px 0px 0px;
345 -moz-border-radius: 0px 0px 0px 0px;
346 border-radius: 0px 0px 0px 0px;
346 border-radius: 0px 0px 0px 0px;
347 }
347 }
348
348
349 .ie7 #header #header-inner.hover,
349 .ie7 #header #header-inner.hover,
350 .ie8 #header #header-inner.hover,
350 .ie8 #header #header-inner.hover,
351 .ie9 #header #header-inner.hover
351 .ie9 #header #header-inner.hover
352 {
352 {
353 z-index: auto !important;
353 z-index: auto !important;
354 }
354 }
355
355
356 .header-pos-fix, .anchor{
356 .header-pos-fix, .anchor{
357 margin-top: -46px;
357 margin-top: -46px;
358 padding-top: 46px;
358 padding-top: 46px;
359 }
359 }
360
360
361 #header #header-inner #home a {
361 #header #header-inner #home a {
362 height: 40px;
362 height: 40px;
363 width: 46px;
363 width: 46px;
364 display: block;
364 display: block;
365 background: url("../images/button_home.png");
365 background: url("../images/button_home.png");
366 background-position: 0 0;
366 background-position: 0 0;
367 margin: 0;
367 margin: 0;
368 padding: 0;
368 padding: 0;
369 }
369 }
370
370
371 #header #header-inner #home a:hover {
371 #header #header-inner #home a:hover {
372 background-position: 0 -40px;
372 background-position: 0 -40px;
373 }
373 }
374
374
375 #header #header-inner #logo {
375 #header #header-inner #logo {
376 float: left;
376 float: left;
377 position: absolute;
377 position: absolute;
378 }
378 }
379
379
380 #header #header-inner #logo h1 {
380 #header #header-inner #logo h1 {
381 color: #FFF;
381 color: #FFF;
382 font-size: 20px;
382 font-size: 20px;
383 margin: 12px 0 0 13px;
383 margin: 12px 0 0 13px;
384 padding: 0;
384 padding: 0;
385 }
385 }
386
386
387 #header #header-inner #logo a {
387 #header #header-inner #logo a {
388 color: #fff;
388 color: #fff;
389 text-decoration: none;
389 text-decoration: none;
390 }
390 }
391
391
392 #header #header-inner #logo a:hover {
392 #header #header-inner #logo a:hover {
393 color: #bfe3ff;
393 color: #bfe3ff;
394 }
394 }
395
395
396 #header #header-inner #quick,#header #header-inner #quick ul {
396 #header #header-inner #quick,#header #header-inner #quick ul {
397 position: relative;
397 position: relative;
398 float: right;
398 float: right;
399 list-style-type: none;
399 list-style-type: none;
400 list-style-position: outside;
400 list-style-position: outside;
401 margin: 8px 8px 0 0;
401 margin: 8px 8px 0 0;
402 padding: 0;
402 padding: 0;
403 }
403 }
404
404
405 #header #header-inner #quick li {
405 #header #header-inner #quick li {
406 position: relative;
406 position: relative;
407 float: left;
407 float: left;
408 margin: 0 5px 0 0;
408 margin: 0 5px 0 0;
409 padding: 0;
409 padding: 0;
410 }
410 }
411
411
412 #header #header-inner #quick li a.menu_link {
412 #header #header-inner #quick li a.menu_link {
413 top: 0;
413 top: 0;
414 left: 0;
414 left: 0;
415 height: 1%;
415 height: 1%;
416 display: block;
416 display: block;
417 clear: both;
417 clear: both;
418 overflow: hidden;
418 overflow: hidden;
419 color: #FFF;
419 color: #FFF;
420 font-weight: 700;
420 font-weight: 700;
421 text-decoration: none;
421 text-decoration: none;
422 background: #369;
422 background: #369;
423 padding: 0;
423 padding: 0;
424 -webkit-border-radius: 4px 4px 4px 4px;
424 -webkit-border-radius: 4px 4px 4px 4px;
425 -khtml-border-radius: 4px 4px 4px 4px;
425 -khtml-border-radius: 4px 4px 4px 4px;
426 -moz-border-radius: 4px 4px 4px 4px;
426 -moz-border-radius: 4px 4px 4px 4px;
427 border-radius: 4px 4px 4px 4px;
427 border-radius: 4px 4px 4px 4px;
428 }
428 }
429
429
430 #header #header-inner #quick li span.short {
430 #header #header-inner #quick li span.short {
431 padding: 9px 6px 8px 6px;
431 padding: 9px 6px 8px 6px;
432 }
432 }
433
433
434 #header #header-inner #quick li span {
434 #header #header-inner #quick li span {
435 top: 0;
435 top: 0;
436 right: 0;
436 right: 0;
437 height: 1%;
437 height: 1%;
438 display: block;
438 display: block;
439 float: left;
439 float: left;
440 border-left: 1px solid #3f6f9f;
440 border-left: 1px solid #3f6f9f;
441 margin: 0;
441 margin: 0;
442 padding: 10px 12px 8px 10px;
442 padding: 10px 12px 8px 10px;
443 }
443 }
444
444
445 #header #header-inner #quick li span.normal {
445 #header #header-inner #quick li span.normal {
446 border: none;
446 border: none;
447 padding: 10px 12px 8px;
447 padding: 10px 12px 8px;
448 }
448 }
449
449
450 #header #header-inner #quick li span.icon {
450 #header #header-inner #quick li span.icon {
451 top: 0;
451 top: 0;
452 left: 0;
452 left: 0;
453 border-left: none;
453 border-left: none;
454 border-right: 1px solid #2e5c89;
454 border-right: 1px solid #2e5c89;
455 padding: 8px 6px 4px;
455 padding: 8px 6px 4px;
456 }
456 }
457
457
458 #header #header-inner #quick li span.icon_short {
458 #header #header-inner #quick li span.icon_short {
459 top: 0;
459 top: 0;
460 left: 0;
460 left: 0;
461 border-left: none;
461 border-left: none;
462 border-right: 1px solid #2e5c89;
462 border-right: 1px solid #2e5c89;
463 padding: 8px 6px 4px;
463 padding: 8px 6px 4px;
464 }
464 }
465
465
466 #header #header-inner #quick li span.icon img,#header #header-inner #quick li span.icon_short img
466 #header #header-inner #quick li span.icon img,#header #header-inner #quick li span.icon_short img
467 {
467 {
468 margin: 0px -2px 0px 0px;
468 margin: 0px -2px 0px 0px;
469 }
469 }
470
470
471 #header #header-inner #quick li a:hover {
471 #header #header-inner #quick li a:hover {
472 background: #4e4e4e no-repeat top left;
472 background: #4e4e4e no-repeat top left;
473 }
473 }
474
474
475 #header #header-inner #quick li a:hover span {
475 #header #header-inner #quick li a:hover span {
476 border-left: 1px solid #545454;
476 border-left: 1px solid #545454;
477 }
477 }
478
478
479 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short
479 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short
480 {
480 {
481 border-left: none;
481 border-left: none;
482 border-right: 1px solid #464646;
482 border-right: 1px solid #464646;
483 }
483 }
484
484
485 #header #header-inner #quick ul {
485 #header #header-inner #quick ul {
486 top: 29px;
486 top: 29px;
487 right: 0;
487 right: 0;
488 min-width: 200px;
488 min-width: 200px;
489 display: none;
489 display: none;
490 position: absolute;
490 position: absolute;
491 background: #FFF;
491 background: #FFF;
492 border: 1px solid #666;
492 border: 1px solid #666;
493 border-top: 1px solid #003367;
493 border-top: 1px solid #003367;
494 z-index: 100;
494 z-index: 100;
495 margin: 0px 0px 0px 0px;
495 margin: 0px 0px 0px 0px;
496 padding: 0;
496 padding: 0;
497 }
497 }
498
498
499 #header #header-inner #quick ul.repo_switcher {
499 #header #header-inner #quick ul.repo_switcher {
500 max-height: 275px;
500 max-height: 275px;
501 overflow-x: hidden;
501 overflow-x: hidden;
502 overflow-y: auto;
502 overflow-y: auto;
503 }
503 }
504
504
505 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
505 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
506 float: none;
506 float: none;
507 margin: 0;
507 margin: 0;
508 border-bottom: 2px solid #003367;
508 border-bottom: 2px solid #003367;
509 }
509 }
510
510
511 #header #header-inner #quick .repo_switcher_type {
511 #header #header-inner #quick .repo_switcher_type {
512 position: absolute;
512 position: absolute;
513 left: 0;
513 left: 0;
514 top: 9px;
514 top: 9px;
515 }
515 }
516
516
517 #header #header-inner #quick li ul li {
517 #header #header-inner #quick li ul li {
518 border-bottom: 1px solid #ddd;
518 border-bottom: 1px solid #ddd;
519 }
519 }
520
520
521 #header #header-inner #quick li ul li a {
521 #header #header-inner #quick li ul li a {
522 width: 182px;
522 width: 182px;
523 height: auto;
523 height: auto;
524 display: block;
524 display: block;
525 float: left;
525 float: left;
526 background: #FFF;
526 background: #FFF;
527 color: #003367;
527 color: #003367;
528 font-weight: 400;
528 font-weight: 400;
529 margin: 0;
529 margin: 0;
530 padding: 7px 9px;
530 padding: 7px 9px;
531 }
531 }
532
532
533 #header #header-inner #quick li ul li a:hover {
533 #header #header-inner #quick li ul li a:hover {
534 color: #000;
534 color: #000;
535 background: #FFF;
535 background: #FFF;
536 }
536 }
537
537
538 #header #header-inner #quick ul ul {
538 #header #header-inner #quick ul ul {
539 top: auto;
539 top: auto;
540 }
540 }
541
541
542 #header #header-inner #quick li ul ul {
542 #header #header-inner #quick li ul ul {
543 right: 200px;
543 right: 200px;
544 max-height: 290px;
544 max-height: 290px;
545 overflow: auto;
545 overflow: auto;
546 overflow-x: hidden;
546 overflow-x: hidden;
547 white-space: normal;
547 white-space: normal;
548 }
548 }
549
549
550 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover
550 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover
551 {
551 {
552 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
552 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
553 #FFF;
553 #FFF;
554 width: 167px;
554 width: 167px;
555 margin: 0;
555 margin: 0;
556 padding: 12px 9px 7px 24px;
556 padding: 12px 9px 7px 24px;
557 }
557 }
558
558
559 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover
559 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover
560 {
560 {
561 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
561 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
562 #FFF;
562 #FFF;
563 min-width: 167px;
563 min-width: 167px;
564 margin: 0;
564 margin: 0;
565 padding: 12px 9px 7px 24px;
565 padding: 12px 9px 7px 24px;
566 }
566 }
567
567
568 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover
568 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover
569 {
569 {
570 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
570 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
571 9px #FFF;
571 9px #FFF;
572 min-width: 167px;
572 min-width: 167px;
573 margin: 0;
573 margin: 0;
574 padding: 12px 9px 7px 24px;
574 padding: 12px 9px 7px 24px;
575 }
575 }
576
576
577 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover
577 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover
578 {
578 {
579 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
579 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
580 #FFF;
580 #FFF;
581 min-width: 167px;
581 min-width: 167px;
582 margin: 0 0 0 14px;
582 margin: 0 0 0 14px;
583 padding: 12px 9px 7px 24px;
583 padding: 12px 9px 7px 24px;
584 }
584 }
585
585
586 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover
586 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover
587 {
587 {
588 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
588 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
589 #FFF;
589 #FFF;
590 min-width: 167px;
590 min-width: 167px;
591 margin: 0 0 0 14px;
591 margin: 0 0 0 14px;
592 padding: 12px 9px 7px 24px;
592 padding: 12px 9px 7px 24px;
593 }
593 }
594
594
595 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover
595 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover
596 {
596 {
597 background: url("../images/icons/database_edit.png") no-repeat scroll
597 background: url("../images/icons/database_edit.png") no-repeat scroll
598 4px 9px #FFF;
598 4px 9px #FFF;
599 width: 167px;
599 width: 167px;
600 margin: 0;
600 margin: 0;
601 padding: 12px 9px 7px 24px;
601 padding: 12px 9px 7px 24px;
602 }
602 }
603
603
604 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover
604 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover
605 {
605 {
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 {
614 {
615 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
615 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
616 width: 167px;
616 width: 167px;
617 margin: 0;
617 margin: 0;
618 padding: 12px 9px 7px 24px;
618 padding: 12px 9px 7px 24px;
619 }
619 }
620
620
621 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover
621 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover
622 {
622 {
623 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
623 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
624 width: 167px;
624 width: 167px;
625 margin: 0;
625 margin: 0;
626 padding: 12px 9px 7px 24px;
626 padding: 12px 9px 7px 24px;
627 }
627 }
628
628
629 #header #header-inner #quick li ul li a.defaults,#header #header-inner #quick li ul li a.defaults:hover
629 #header #header-inner #quick li ul li a.defaults,#header #header-inner #quick li ul li a.defaults:hover
630 {
630 {
631 background: #FFF url("../images/icons/wrench.png") no-repeat 4px 9px;
631 background: #FFF url("../images/icons/wrench.png") no-repeat 4px 9px;
632 width: 167px;
632 width: 167px;
633 margin: 0;
633 margin: 0;
634 padding: 12px 9px 7px 24px;
634 padding: 12px 9px 7px 24px;
635 }
635 }
636
636
637 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
637 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
638 {
638 {
639 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
639 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
640 width: 167px;
640 width: 167px;
641 margin: 0;
641 margin: 0;
642 padding: 12px 9px 7px 24px;
642 padding: 12px 9px 7px 24px;
643 }
643 }
644
644
645 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover
645 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover
646 {
646 {
647 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
647 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
648 width: 167px;
648 width: 167px;
649 margin: 0;
649 margin: 0;
650 padding: 12px 9px 7px 24px;
650 padding: 12px 9px 7px 24px;
651 }
651 }
652
652
653 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover
653 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover
654 {
654 {
655 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
655 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
656 width: 167px;
656 width: 167px;
657 margin: 0;
657 margin: 0;
658 padding: 12px 9px 7px 24px;
658 padding: 12px 9px 7px 24px;
659 }
659 }
660
660
661 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover
661 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover
662 {
662 {
663 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
663 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
664 9px;
664 9px;
665 width: 167px;
665 width: 167px;
666 margin: 0;
666 margin: 0;
667 padding: 12px 9px 7px 24px;
667 padding: 12px 9px 7px 24px;
668 }
668 }
669
669
670 #header #header-inner #quick li ul li a.locking_add,#header #header-inner #quick li ul li a.locking_add:hover
670 #header #header-inner #quick li ul li a.locking_add,#header #header-inner #quick li ul li a.locking_add:hover
671 {
671 {
672 background: #FFF url("../images/icons/lock_add.png") no-repeat 4px
672 background: #FFF url("../images/icons/lock_add.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.locking_del,#header #header-inner #quick li ul li a.locking_del:hover
679 #header #header-inner #quick li ul li a.locking_del,#header #header-inner #quick li ul li a.locking_del:hover
680 {
680 {
681 background: #FFF url("../images/icons/lock_delete.png") no-repeat 4px
681 background: #FFF url("../images/icons/lock_delete.png") no-repeat 4px
682 9px;
682 9px;
683 width: 167px;
683 width: 167px;
684 margin: 0;
684 margin: 0;
685 padding: 12px 9px 7px 24px;
685 padding: 12px 9px 7px 24px;
686 }
686 }
687
687
688 #header #header-inner #quick li ul li a.pull_request,#header #header-inner #quick li ul li a.pull_request:hover
688 #header #header-inner #quick li ul li a.pull_request,#header #header-inner #quick li ul li a.pull_request:hover
689 {
689 {
690 background: #FFF url("../images/icons/arrow_join.png") no-repeat 4px
690 background: #FFF url("../images/icons/arrow_join.png") no-repeat 4px
691 9px;
691 9px;
692 width: 167px;
692 width: 167px;
693 margin: 0;
693 margin: 0;
694 padding: 12px 9px 7px 24px;
694 padding: 12px 9px 7px 24px;
695 }
695 }
696
696
697 #header #header-inner #quick li ul li a.compare_request,#header #header-inner #quick li ul li a.compare_request:hover
697 #header #header-inner #quick li ul li a.compare_request,#header #header-inner #quick li ul li a.compare_request:hover
698 {
698 {
699 background: #FFF url("../images/icons/arrow_inout.png") no-repeat 4px
699 background: #FFF url("../images/icons/arrow_inout.png") no-repeat 4px
700 9px;
700 9px;
701 width: 167px;
701 width: 167px;
702 margin: 0;
702 margin: 0;
703 padding: 12px 9px 7px 24px;
703 padding: 12px 9px 7px 24px;
704 }
704 }
705
705
706 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover
706 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover
707 {
707 {
708 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
708 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
709 width: 167px;
709 width: 167px;
710 margin: 0;
710 margin: 0;
711 padding: 12px 9px 7px 24px;
711 padding: 12px 9px 7px 24px;
712 }
712 }
713
713
714 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover
714 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover
715 {
715 {
716 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
716 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
717 width: 167px;
717 width: 167px;
718 margin: 0;
718 margin: 0;
719 padding: 12px 9px 7px 24px;
719 padding: 12px 9px 7px 24px;
720 }
720 }
721
721
722 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover
722 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover
723 {
723 {
724 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
724 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
725 9px;
725 9px;
726 width: 167px;
726 width: 167px;
727 margin: 0;
727 margin: 0;
728 padding: 12px 9px 7px 24px;
728 padding: 12px 9px 7px 24px;
729 }
729 }
730
730
731 #header #header-inner #quick li ul li a.tags,
731 #header #header-inner #quick li ul li a.tags,
732 #header #header-inner #quick li ul li a.tags:hover{
732 #header #header-inner #quick li ul li a.tags:hover{
733 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
733 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
734 width: 167px;
734 width: 167px;
735 margin: 0;
735 margin: 0;
736 padding: 12px 9px 7px 24px;
736 padding: 12px 9px 7px 24px;
737 }
737 }
738
738
739 #header #header-inner #quick li ul li a.bookmarks,
739 #header #header-inner #quick li ul li a.bookmarks,
740 #header #header-inner #quick li ul li a.bookmarks:hover{
740 #header #header-inner #quick li ul li a.bookmarks:hover{
741 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
741 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
742 width: 167px;
742 width: 167px;
743 margin: 0;
743 margin: 0;
744 padding: 12px 9px 7px 24px;
744 padding: 12px 9px 7px 24px;
745 }
745 }
746
746
747 #header #header-inner #quick li ul li a.admin,
747 #header #header-inner #quick li ul li a.admin,
748 #header #header-inner #quick li ul li a.admin:hover{
748 #header #header-inner #quick li ul li a.admin:hover{
749 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
749 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
750 width: 167px;
750 width: 167px;
751 margin: 0;
751 margin: 0;
752 padding: 12px 9px 7px 24px;
752 padding: 12px 9px 7px 24px;
753 }
753 }
754
754
755 .groups_breadcrumbs a {
755 .groups_breadcrumbs a {
756 color: #fff;
756 color: #fff;
757 }
757 }
758
758
759 .groups_breadcrumbs a:hover {
759 .groups_breadcrumbs a:hover {
760 color: #bfe3ff;
760 color: #bfe3ff;
761 text-decoration: none;
761 text-decoration: none;
762 }
762 }
763
763
764 td.quick_repo_menu {
764 td.quick_repo_menu {
765 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
765 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
766 cursor: pointer;
766 cursor: pointer;
767 width: 8px;
767 width: 8px;
768 border: 1px solid transparent;
768 border: 1px solid transparent;
769 }
769 }
770
770
771 td.quick_repo_menu.active {
771 td.quick_repo_menu.active {
772 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
772 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
773 border: 1px solid #003367;
773 border: 1px solid #003367;
774 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
774 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
775 cursor: pointer;
775 cursor: pointer;
776 }
776 }
777
777
778 td.quick_repo_menu .menu_items {
778 td.quick_repo_menu .menu_items {
779 margin-top: 10px;
779 margin-top: 10px;
780 margin-left:-6px;
780 margin-left:-6px;
781 width: 150px;
781 width: 150px;
782 position: absolute;
782 position: absolute;
783 background-color: #FFF;
783 background-color: #FFF;
784 background: none repeat scroll 0 0 #FFFFFF;
784 background: none repeat scroll 0 0 #FFFFFF;
785 border-color: #003367 #666666 #666666;
785 border-color: #003367 #666666 #666666;
786 border-right: 1px solid #666666;
786 border-right: 1px solid #666666;
787 border-style: solid;
787 border-style: solid;
788 border-width: 1px;
788 border-width: 1px;
789 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
789 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
790 border-top-style: none;
790 border-top-style: none;
791 }
791 }
792
792
793 td.quick_repo_menu .menu_items li {
793 td.quick_repo_menu .menu_items li {
794 padding: 0 !important;
794 padding: 0 !important;
795 }
795 }
796
796
797 td.quick_repo_menu .menu_items a {
797 td.quick_repo_menu .menu_items a {
798 display: block;
798 display: block;
799 padding: 4px 12px 4px 8px;
799 padding: 4px 12px 4px 8px;
800 }
800 }
801
801
802 td.quick_repo_menu .menu_items a:hover {
802 td.quick_repo_menu .menu_items a:hover {
803 background-color: #EEE;
803 background-color: #EEE;
804 text-decoration: none;
804 text-decoration: none;
805 }
805 }
806
806
807 td.quick_repo_menu .menu_items .icon img {
807 td.quick_repo_menu .menu_items .icon img {
808 margin-bottom: -2px;
808 margin-bottom: -2px;
809 }
809 }
810
810
811 td.quick_repo_menu .menu_items.hidden {
811 td.quick_repo_menu .menu_items.hidden {
812 display: none;
812 display: none;
813 }
813 }
814
814
815 .yui-dt-first th {
815 .yui-dt-first th {
816 text-align: left;
816 text-align: left;
817 }
817 }
818
818
819 /*
819 /*
820 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
820 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
821 Code licensed under the BSD License:
821 Code licensed under the BSD License:
822 http://developer.yahoo.com/yui/license.html
822 http://developer.yahoo.com/yui/license.html
823 version: 2.9.0
823 version: 2.9.0
824 */
824 */
825 .yui-skin-sam .yui-dt-mask {
825 .yui-skin-sam .yui-dt-mask {
826 position: absolute;
826 position: absolute;
827 z-index: 9500;
827 z-index: 9500;
828 }
828 }
829 .yui-dt-tmp {
829 .yui-dt-tmp {
830 position: absolute;
830 position: absolute;
831 left: -9000px;
831 left: -9000px;
832 }
832 }
833 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
833 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
834 .yui-dt-scrollable .yui-dt-hd {
834 .yui-dt-scrollable .yui-dt-hd {
835 overflow: hidden;
835 overflow: hidden;
836 position: relative;
836 position: relative;
837 }
837 }
838 .yui-dt-scrollable .yui-dt-bd thead tr,
838 .yui-dt-scrollable .yui-dt-bd thead tr,
839 .yui-dt-scrollable .yui-dt-bd thead th {
839 .yui-dt-scrollable .yui-dt-bd thead th {
840 position: absolute;
840 position: absolute;
841 left: -1500px;
841 left: -1500px;
842 }
842 }
843 .yui-dt-scrollable tbody { -moz-outline: 0 }
843 .yui-dt-scrollable tbody { -moz-outline: 0 }
844 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
844 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
845 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
845 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
846 .yui-dt-coltarget {
846 .yui-dt-coltarget {
847 position: absolute;
847 position: absolute;
848 z-index: 999;
848 z-index: 999;
849 }
849 }
850 .yui-dt-hd { zoom: 1 }
850 .yui-dt-hd { zoom: 1 }
851 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
851 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
852 .yui-dt-resizer {
852 .yui-dt-resizer {
853 position: absolute;
853 position: absolute;
854 right: 0;
854 right: 0;
855 bottom: 0;
855 bottom: 0;
856 height: 100%;
856 height: 100%;
857 cursor: e-resize;
857 cursor: e-resize;
858 cursor: col-resize;
858 cursor: col-resize;
859 background-color: #CCC;
859 background-color: #CCC;
860 opacity: 0;
860 opacity: 0;
861 filter: alpha(opacity=0);
861 filter: alpha(opacity=0);
862 }
862 }
863 .yui-dt-resizerproxy {
863 .yui-dt-resizerproxy {
864 visibility: hidden;
864 visibility: hidden;
865 position: absolute;
865 position: absolute;
866 z-index: 9000;
866 z-index: 9000;
867 background-color: #CCC;
867 background-color: #CCC;
868 opacity: 0;
868 opacity: 0;
869 filter: alpha(opacity=0);
869 filter: alpha(opacity=0);
870 }
870 }
871 th.yui-dt-hidden .yui-dt-liner,
871 th.yui-dt-hidden .yui-dt-liner,
872 td.yui-dt-hidden .yui-dt-liner,
872 td.yui-dt-hidden .yui-dt-liner,
873 th.yui-dt-hidden .yui-dt-resizer { display: none }
873 th.yui-dt-hidden .yui-dt-resizer { display: none }
874 .yui-dt-editor,
874 .yui-dt-editor,
875 .yui-dt-editor-shim {
875 .yui-dt-editor-shim {
876 position: absolute;
876 position: absolute;
877 z-index: 9000;
877 z-index: 9000;
878 }
878 }
879 .yui-skin-sam .yui-dt table {
879 .yui-skin-sam .yui-dt table {
880 margin: 0;
880 margin: 0;
881 padding: 0;
881 padding: 0;
882 font-family: arial;
882 font-family: arial;
883 font-size: inherit;
883 font-size: inherit;
884 border-collapse: separate;
884 border-collapse: separate;
885 *border-collapse: collapse;
885 *border-collapse: collapse;
886 border-spacing: 0;
886 border-spacing: 0;
887 border: 1px solid #7f7f7f;
887 border: 1px solid #7f7f7f;
888 }
888 }
889 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
889 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
890 .yui-skin-sam .yui-dt caption {
890 .yui-skin-sam .yui-dt caption {
891 color: #000;
891 color: #000;
892 font-size: 85%;
892 font-size: 85%;
893 font-weight: normal;
893 font-weight: normal;
894 font-style: italic;
894 font-style: italic;
895 line-height: 1;
895 line-height: 1;
896 padding: 1em 0;
896 padding: 1em 0;
897 text-align: center;
897 text-align: center;
898 }
898 }
899 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
899 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
900 .yui-skin-sam .yui-dt th,
900 .yui-skin-sam .yui-dt th,
901 .yui-skin-sam .yui-dt th a {
901 .yui-skin-sam .yui-dt th a {
902 font-weight: normal;
902 font-weight: normal;
903 text-decoration: none;
903 text-decoration: none;
904 color: #000;
904 color: #000;
905 vertical-align: bottom;
905 vertical-align: bottom;
906 }
906 }
907 .yui-skin-sam .yui-dt th {
907 .yui-skin-sam .yui-dt th {
908 margin: 0;
908 margin: 0;
909 padding: 0;
909 padding: 0;
910 border: 0;
910 border: 0;
911 border-right: 1px solid #cbcbcb;
911 border-right: 1px solid #cbcbcb;
912 }
912 }
913 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
913 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
914 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
914 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
915 .yui-skin-sam .yui-dt-liner {
915 .yui-skin-sam .yui-dt-liner {
916 margin: 0;
916 margin: 0;
917 padding: 0;
917 padding: 0;
918 }
918 }
919 .yui-skin-sam .yui-dt-coltarget {
919 .yui-skin-sam .yui-dt-coltarget {
920 width: 5px;
920 width: 5px;
921 background-color: red;
921 background-color: red;
922 }
922 }
923 .yui-skin-sam .yui-dt td {
923 .yui-skin-sam .yui-dt td {
924 margin: 0;
924 margin: 0;
925 padding: 0;
925 padding: 0;
926 border: 0;
926 border: 0;
927 border-right: 1px solid #cbcbcb;
927 border-right: 1px solid #cbcbcb;
928 text-align: left;
928 text-align: left;
929 }
929 }
930 .yui-skin-sam .yui-dt-list td { border-right: 0 }
930 .yui-skin-sam .yui-dt-list td { border-right: 0 }
931 .yui-skin-sam .yui-dt-resizer { width: 6px }
931 .yui-skin-sam .yui-dt-resizer { width: 6px }
932 .yui-skin-sam .yui-dt-mask {
932 .yui-skin-sam .yui-dt-mask {
933 background-color: #000;
933 background-color: #000;
934 opacity: .25;
934 opacity: .25;
935 filter: alpha(opacity=25);
935 filter: alpha(opacity=25);
936 }
936 }
937 .yui-skin-sam .yui-dt-message { background-color: #FFF }
937 .yui-skin-sam .yui-dt-message { background-color: #FFF }
938 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
938 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
939 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
939 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
940 border-left: 1px solid #7f7f7f;
940 border-left: 1px solid #7f7f7f;
941 border-top: 1px solid #7f7f7f;
941 border-top: 1px solid #7f7f7f;
942 border-right: 1px solid #7f7f7f;
942 border-right: 1px solid #7f7f7f;
943 }
943 }
944 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
944 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
945 border-left: 1px solid #7f7f7f;
945 border-left: 1px solid #7f7f7f;
946 border-bottom: 1px solid #7f7f7f;
946 border-bottom: 1px solid #7f7f7f;
947 border-right: 1px solid #7f7f7f;
947 border-right: 1px solid #7f7f7f;
948 background-color: #FFF;
948 background-color: #FFF;
949 }
949 }
950 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
950 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
951 .yui-skin-sam th.yui-dt-asc,
951 .yui-skin-sam th.yui-dt-asc,
952 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
952 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
953 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
953 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
954 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
954 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
955 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
955 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
956 tbody .yui-dt-editable { cursor: pointer }
956 tbody .yui-dt-editable { cursor: pointer }
957 .yui-dt-editor {
957 .yui-dt-editor {
958 text-align: left;
958 text-align: left;
959 background-color: #f2f2f2;
959 background-color: #f2f2f2;
960 border: 1px solid #808080;
960 border: 1px solid #808080;
961 padding: 6px;
961 padding: 6px;
962 }
962 }
963 .yui-dt-editor label {
963 .yui-dt-editor label {
964 padding-left: 4px;
964 padding-left: 4px;
965 padding-right: 6px;
965 padding-right: 6px;
966 }
966 }
967 .yui-dt-editor .yui-dt-button {
967 .yui-dt-editor .yui-dt-button {
968 padding-top: 6px;
968 padding-top: 6px;
969 text-align: right;
969 text-align: right;
970 }
970 }
971 .yui-dt-editor .yui-dt-button button {
971 .yui-dt-editor .yui-dt-button button {
972 background: url(../images/sprite.png) repeat-x 0 0;
972 background: url(../images/sprite.png) repeat-x 0 0;
973 border: 1px solid #999;
973 border: 1px solid #999;
974 width: 4em;
974 width: 4em;
975 height: 1.8em;
975 height: 1.8em;
976 margin-left: 6px;
976 margin-left: 6px;
977 }
977 }
978 .yui-dt-editor .yui-dt-button button.yui-dt-default {
978 .yui-dt-editor .yui-dt-button button.yui-dt-default {
979 background: url(../images/sprite.png) repeat-x 0 -1400px;
979 background: url(../images/sprite.png) repeat-x 0 -1400px;
980 background-color: #5584e0;
980 background-color: #5584e0;
981 border: 1px solid #304369;
981 border: 1px solid #304369;
982 color: #FFF;
982 color: #FFF;
983 }
983 }
984 .yui-dt-editor .yui-dt-button button:hover {
984 .yui-dt-editor .yui-dt-button button:hover {
985 background: url(../images/sprite.png) repeat-x 0 -1300px;
985 background: url(../images/sprite.png) repeat-x 0 -1300px;
986 color: #000;
986 color: #000;
987 }
987 }
988 .yui-dt-editor .yui-dt-button button:active {
988 .yui-dt-editor .yui-dt-button button:active {
989 background: url(../images/sprite.png) repeat-x 0 -1700px;
989 background: url(../images/sprite.png) repeat-x 0 -1700px;
990 color: #000;
990 color: #000;
991 }
991 }
992 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
992 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
993 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
993 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
994 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
994 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
995 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
995 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
996 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
996 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
997 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
997 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
998 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
998 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
999 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
999 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
1000 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
1000 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
1001 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
1001 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
1002 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
1002 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
1003 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
1003 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
1004 .yui-skin-sam th.yui-dt-highlighted,
1004 .yui-skin-sam th.yui-dt-highlighted,
1005 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
1005 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
1006 .yui-skin-sam tr.yui-dt-highlighted,
1006 .yui-skin-sam tr.yui-dt-highlighted,
1007 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
1007 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
1008 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
1008 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
1009 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
1009 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
1010 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
1010 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
1011 cursor: pointer;
1011 cursor: pointer;
1012 background-color: #b2d2ff;
1012 background-color: #b2d2ff;
1013 }
1013 }
1014 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
1014 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
1015 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
1015 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
1016 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
1016 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
1017 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
1017 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
1018 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
1018 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
1019 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
1019 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
1020 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
1020 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
1021 cursor: pointer;
1021 cursor: pointer;
1022 background-color: #b2d2ff;
1022 background-color: #b2d2ff;
1023 }
1023 }
1024 .yui-skin-sam th.yui-dt-selected,
1024 .yui-skin-sam th.yui-dt-selected,
1025 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
1025 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
1026 .yui-skin-sam tr.yui-dt-selected td,
1026 .yui-skin-sam tr.yui-dt-selected td,
1027 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
1027 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
1028 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
1028 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
1029 background-color: #426fd9;
1029 background-color: #426fd9;
1030 color: #FFF;
1030 color: #FFF;
1031 }
1031 }
1032 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
1032 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
1033 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
1033 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
1034 background-color: #446cd7;
1034 background-color: #446cd7;
1035 color: #FFF;
1035 color: #FFF;
1036 }
1036 }
1037 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
1037 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
1038 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
1038 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
1039 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
1039 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
1040 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
1040 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
1041 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
1041 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
1042 background-color: #426fd9;
1042 background-color: #426fd9;
1043 color: #FFF;
1043 color: #FFF;
1044 }
1044 }
1045 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
1045 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
1046 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
1046 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
1047 background-color: #446cd7;
1047 background-color: #446cd7;
1048 color: #FFF;
1048 color: #FFF;
1049 }
1049 }
1050 .yui-skin-sam .yui-dt-paginator {
1050 .yui-skin-sam .yui-dt-paginator {
1051 display: block;
1051 display: block;
1052 margin: 6px 0;
1052 margin: 6px 0;
1053 white-space: nowrap;
1053 white-space: nowrap;
1054 }
1054 }
1055 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
1055 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
1056 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
1056 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
1057 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
1057 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
1058 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
1058 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
1059 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
1059 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
1060 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
1060 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
1061 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
1061 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
1062 .yui-skin-sam a.yui-dt-page {
1062 .yui-skin-sam a.yui-dt-page {
1063 border: 1px solid #cbcbcb;
1063 border: 1px solid #cbcbcb;
1064 padding: 2px 6px;
1064 padding: 2px 6px;
1065 text-decoration: none;
1065 text-decoration: none;
1066 background-color: #fff;
1066 background-color: #fff;
1067 }
1067 }
1068 .yui-skin-sam .yui-dt-selected {
1068 .yui-skin-sam .yui-dt-selected {
1069 border: 1px solid #fff;
1069 border: 1px solid #fff;
1070 background-color: #fff;
1070 background-color: #fff;
1071 }
1071 }
1072
1072
1073 #content #left {
1073 #content #left {
1074 left: 0;
1074 left: 0;
1075 width: 280px;
1075 width: 280px;
1076 position: absolute;
1076 position: absolute;
1077 }
1077 }
1078
1078
1079 #content #right {
1079 #content #right {
1080 margin: 0 60px 10px 290px;
1080 margin: 0 60px 10px 290px;
1081 }
1081 }
1082
1082
1083 #content div.box {
1083 #content div.box {
1084 clear: both;
1084 clear: both;
1085 overflow: hidden;
1085 overflow: hidden;
1086 background: #fff;
1086 background: #fff;
1087 margin: 0 0 10px;
1087 margin: 0 0 10px;
1088 padding: 0 0 10px;
1088 padding: 0 0 10px;
1089 -webkit-border-radius: 4px 4px 4px 4px;
1089 -webkit-border-radius: 4px 4px 4px 4px;
1090 -khtml-border-radius: 4px 4px 4px 4px;
1090 -khtml-border-radius: 4px 4px 4px 4px;
1091 -moz-border-radius: 4px 4px 4px 4px;
1091 -moz-border-radius: 4px 4px 4px 4px;
1092 border-radius: 4px 4px 4px 4px;
1092 border-radius: 4px 4px 4px 4px;
1093 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1093 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1094 }
1094 }
1095
1095
1096 #content div.box-left {
1096 #content div.box-left {
1097 width: 49%;
1097 width: 49%;
1098 clear: none;
1098 clear: none;
1099 float: left;
1099 float: left;
1100 margin: 0 0 10px;
1100 margin: 0 0 10px;
1101 }
1101 }
1102
1102
1103 #content div.box-right {
1103 #content div.box-right {
1104 width: 49%;
1104 width: 49%;
1105 clear: none;
1105 clear: none;
1106 float: right;
1106 float: right;
1107 margin: 0 0 10px;
1107 margin: 0 0 10px;
1108 }
1108 }
1109
1109
1110 #content div.box div.title {
1110 #content div.box div.title {
1111 clear: both;
1111 clear: both;
1112 overflow: hidden;
1112 overflow: hidden;
1113 background-color: #003B76;
1113 background-color: #003B76;
1114 background-repeat: repeat-x;
1114 background-repeat: repeat-x;
1115 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1115 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1116 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1116 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1117 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1117 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1118 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1118 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1119 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1119 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1120 background-image: -o-linear-gradient(top, #003b76, #00376e);
1120 background-image: -o-linear-gradient(top, #003b76, #00376e);
1121 background-image: linear-gradient(top, #003b76, #00376e);
1121 background-image: linear-gradient(top, #003b76, #00376e);
1122 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1122 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1123 margin: 0 0 20px;
1123 margin: 0 0 20px;
1124 padding: 0;
1124 padding: 0;
1125 }
1125 }
1126
1126
1127 #content div.box div.title h5 {
1127 #content div.box div.title h5 {
1128 float: left;
1128 float: left;
1129 border: none;
1129 border: none;
1130 color: #fff;
1130 color: #fff;
1131 text-transform: uppercase;
1131 text-transform: uppercase;
1132 margin: 0;
1132 margin: 0;
1133 padding: 11px 0 11px 10px;
1133 padding: 11px 0 11px 10px;
1134 }
1134 }
1135
1135
1136 #content div.box div.title .link-white{
1136 #content div.box div.title .link-white{
1137 color: #FFFFFF;
1137 color: #FFFFFF;
1138 }
1138 }
1139
1139
1140 #content div.box div.title .link-white.current{
1140 #content div.box div.title .link-white.current{
1141 color: #BFE3FF;
1141 color: #BFE3FF;
1142 }
1142 }
1143
1143
1144 #content div.box div.title ul.links li {
1144 #content div.box div.title ul.links li {
1145 list-style: none;
1145 list-style: none;
1146 float: left;
1146 float: left;
1147 margin: 0;
1147 margin: 0;
1148 padding: 0;
1148 padding: 0;
1149 }
1149 }
1150
1150
1151 #content div.box div.title ul.links li a {
1151 #content div.box div.title ul.links li a {
1152 border-left: 1px solid #316293;
1152 border-left: 1px solid #316293;
1153 color: #FFFFFF;
1153 color: #FFFFFF;
1154 display: block;
1154 display: block;
1155 float: left;
1155 float: left;
1156 font-size: 13px;
1156 font-size: 13px;
1157 font-weight: 700;
1157 font-weight: 700;
1158 height: 1%;
1158 height: 1%;
1159 margin: 0;
1159 margin: 0;
1160 padding: 11px 22px 12px;
1160 padding: 11px 22px 12px;
1161 text-decoration: none;
1161 text-decoration: none;
1162 }
1162 }
1163
1163
1164 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6,
1164 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6,
1165 #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
1165 #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
1166
1166
1167 {
1167 {
1168 clear: both;
1168 clear: both;
1169 overflow: hidden;
1169 overflow: hidden;
1170 border-bottom: 1px solid #DDD;
1170 border-bottom: 1px solid #DDD;
1171 margin: 10px 20px;
1171 margin: 10px 20px;
1172 padding: 0 0 15px;
1172 padding: 0 0 15px;
1173 }
1173 }
1174
1174
1175 #content div.box p {
1175 #content div.box p {
1176 color: #5f5f5f;
1176 color: #5f5f5f;
1177 font-size: 12px;
1177 font-size: 12px;
1178 line-height: 150%;
1178 line-height: 150%;
1179 margin: 0 24px 10px;
1179 margin: 0 24px 10px;
1180 padding: 0;
1180 padding: 0;
1181 }
1181 }
1182
1182
1183 #content div.box blockquote {
1183 #content div.box blockquote {
1184 border-left: 4px solid #DDD;
1184 border-left: 4px solid #DDD;
1185 color: #5f5f5f;
1185 color: #5f5f5f;
1186 font-size: 11px;
1186 font-size: 11px;
1187 line-height: 150%;
1187 line-height: 150%;
1188 margin: 0 34px;
1188 margin: 0 34px;
1189 padding: 0 0 0 14px;
1189 padding: 0 0 0 14px;
1190 }
1190 }
1191
1191
1192 #content div.box blockquote p {
1192 #content div.box blockquote p {
1193 margin: 10px 0;
1193 margin: 10px 0;
1194 padding: 0;
1194 padding: 0;
1195 }
1195 }
1196
1196
1197 #content div.box dl {
1197 #content div.box dl {
1198 margin: 10px 0px;
1198 margin: 10px 0px;
1199 }
1199 }
1200
1200
1201 #content div.box dt {
1201 #content div.box dt {
1202 font-size: 12px;
1202 font-size: 12px;
1203 margin: 0;
1203 margin: 0;
1204 }
1204 }
1205
1205
1206 #content div.box dd {
1206 #content div.box dd {
1207 font-size: 12px;
1207 font-size: 12px;
1208 margin: 0;
1208 margin: 0;
1209 padding: 8px 0 8px 15px;
1209 padding: 8px 0 8px 15px;
1210 }
1210 }
1211
1211
1212 #content div.box li {
1212 #content div.box li {
1213 font-size: 12px;
1213 font-size: 12px;
1214 padding: 4px 0;
1214 padding: 4px 0;
1215 }
1215 }
1216
1216
1217 #content div.box ul.disc,#content div.box ul.circle {
1217 #content div.box ul.disc,#content div.box ul.circle {
1218 margin: 10px 24px 10px 38px;
1218 margin: 10px 24px 10px 38px;
1219 }
1219 }
1220
1220
1221 #content div.box ul.square {
1221 #content div.box ul.square {
1222 margin: 10px 24px 10px 40px;
1222 margin: 10px 24px 10px 40px;
1223 }
1223 }
1224
1224
1225 #content div.box img.left {
1225 #content div.box img.left {
1226 border: none;
1226 border: none;
1227 float: left;
1227 float: left;
1228 margin: 10px 10px 10px 0;
1228 margin: 10px 10px 10px 0;
1229 }
1229 }
1230
1230
1231 #content div.box img.right {
1231 #content div.box img.right {
1232 border: none;
1232 border: none;
1233 float: right;
1233 float: right;
1234 margin: 10px 0 10px 10px;
1234 margin: 10px 0 10px 10px;
1235 }
1235 }
1236
1236
1237 #content div.box div.messages {
1237 #content div.box div.messages {
1238 clear: both;
1238 clear: both;
1239 overflow: hidden;
1239 overflow: hidden;
1240 margin: 0 20px;
1240 margin: 0 20px;
1241 padding: 0;
1241 padding: 0;
1242 }
1242 }
1243
1243
1244 #content div.box div.message {
1244 #content div.box div.message {
1245 clear: both;
1245 clear: both;
1246 overflow: hidden;
1246 overflow: hidden;
1247 margin: 0;
1247 margin: 0;
1248 padding: 5px 0;
1248 padding: 5px 0;
1249 white-space: pre-wrap;
1249 white-space: pre-wrap;
1250 }
1250 }
1251 #content div.box div.expand {
1251 #content div.box div.expand {
1252 width: 110%;
1252 width: 110%;
1253 height:14px;
1253 height:14px;
1254 font-size:10px;
1254 font-size:10px;
1255 text-align:center;
1255 text-align:center;
1256 cursor: pointer;
1256 cursor: pointer;
1257 color:#666;
1257 color:#666;
1258
1258
1259 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)));
1259 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)));
1260 background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1260 background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1261 background:-moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1261 background:-moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1262 background:-o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1262 background:-o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1263 background:-ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1263 background:-ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1264 background:linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1264 background:linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1265
1265
1266 display: none;
1266 display: none;
1267 }
1267 }
1268 #content div.box div.expand .expandtext {
1268 #content div.box div.expand .expandtext {
1269 background-color: #ffffff;
1269 background-color: #ffffff;
1270 padding: 2px;
1270 padding: 2px;
1271 border-radius: 2px;
1271 border-radius: 2px;
1272 }
1272 }
1273
1273
1274 #content div.box div.message a {
1274 #content div.box div.message a {
1275 font-weight: 400 !important;
1275 font-weight: 400 !important;
1276 }
1276 }
1277
1277
1278 #content div.box div.message div.image {
1278 #content div.box div.message div.image {
1279 float: left;
1279 float: left;
1280 margin: 9px 0 0 5px;
1280 margin: 9px 0 0 5px;
1281 padding: 6px;
1281 padding: 6px;
1282 }
1282 }
1283
1283
1284 #content div.box div.message div.image img {
1284 #content div.box div.message div.image img {
1285 vertical-align: middle;
1285 vertical-align: middle;
1286 margin: 0;
1286 margin: 0;
1287 }
1287 }
1288
1288
1289 #content div.box div.message div.text {
1289 #content div.box div.message div.text {
1290 float: left;
1290 float: left;
1291 margin: 0;
1291 margin: 0;
1292 padding: 9px 6px;
1292 padding: 9px 6px;
1293 }
1293 }
1294
1294
1295 #content div.box div.message div.dismiss a {
1295 #content div.box div.message div.dismiss a {
1296 height: 16px;
1296 height: 16px;
1297 width: 16px;
1297 width: 16px;
1298 display: block;
1298 display: block;
1299 background: url("../images/icons/cross.png") no-repeat;
1299 background: url("../images/icons/cross.png") no-repeat;
1300 margin: 15px 14px 0 0;
1300 margin: 15px 14px 0 0;
1301 padding: 0;
1301 padding: 0;
1302 }
1302 }
1303
1303
1304 #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
1304 #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
1305 {
1305 {
1306 border: none;
1306 border: none;
1307 margin: 0;
1307 margin: 0;
1308 padding: 0;
1308 padding: 0;
1309 }
1309 }
1310
1310
1311 #content div.box div.message div.text span {
1311 #content div.box div.message div.text span {
1312 height: 1%;
1312 height: 1%;
1313 display: block;
1313 display: block;
1314 margin: 0;
1314 margin: 0;
1315 padding: 5px 0 0;
1315 padding: 5px 0 0;
1316 }
1316 }
1317
1317
1318 #content div.box div.message-error {
1318 #content div.box div.message-error {
1319 height: 1%;
1319 height: 1%;
1320 clear: both;
1320 clear: both;
1321 overflow: hidden;
1321 overflow: hidden;
1322 background: #FBE3E4;
1322 background: #FBE3E4;
1323 border: 1px solid #FBC2C4;
1323 border: 1px solid #FBC2C4;
1324 color: #860006;
1324 color: #860006;
1325 }
1325 }
1326
1326
1327 #content div.box div.message-error h6 {
1327 #content div.box div.message-error h6 {
1328 color: #860006;
1328 color: #860006;
1329 }
1329 }
1330
1330
1331 #content div.box div.message-warning {
1331 #content div.box div.message-warning {
1332 height: 1%;
1332 height: 1%;
1333 clear: both;
1333 clear: both;
1334 overflow: hidden;
1334 overflow: hidden;
1335 background: #FFF6BF;
1335 background: #FFF6BF;
1336 border: 1px solid #FFD324;
1336 border: 1px solid #FFD324;
1337 color: #5f5200;
1337 color: #5f5200;
1338 }
1338 }
1339
1339
1340 #content div.box div.message-warning h6 {
1340 #content div.box div.message-warning h6 {
1341 color: #5f5200;
1341 color: #5f5200;
1342 }
1342 }
1343
1343
1344 #content div.box div.message-notice {
1344 #content div.box div.message-notice {
1345 height: 1%;
1345 height: 1%;
1346 clear: both;
1346 clear: both;
1347 overflow: hidden;
1347 overflow: hidden;
1348 background: #8FBDE0;
1348 background: #8FBDE0;
1349 border: 1px solid #6BACDE;
1349 border: 1px solid #6BACDE;
1350 color: #003863;
1350 color: #003863;
1351 }
1351 }
1352
1352
1353 #content div.box div.message-notice h6 {
1353 #content div.box div.message-notice h6 {
1354 color: #003863;
1354 color: #003863;
1355 }
1355 }
1356
1356
1357 #content div.box div.message-success {
1357 #content div.box div.message-success {
1358 height: 1%;
1358 height: 1%;
1359 clear: both;
1359 clear: both;
1360 overflow: hidden;
1360 overflow: hidden;
1361 background: #E6EFC2;
1361 background: #E6EFC2;
1362 border: 1px solid #C6D880;
1362 border: 1px solid #C6D880;
1363 color: #4e6100;
1363 color: #4e6100;
1364 }
1364 }
1365
1365
1366 #content div.box div.message-success h6 {
1366 #content div.box div.message-success h6 {
1367 color: #4e6100;
1367 color: #4e6100;
1368 }
1368 }
1369
1369
1370 #content div.box div.form div.fields div.field {
1370 #content div.box div.form div.fields div.field {
1371 height: 1%;
1371 height: 1%;
1372 border-bottom: 1px solid #DDD;
1372 border-bottom: 1px solid #DDD;
1373 clear: both;
1373 clear: both;
1374 margin: 0;
1374 margin: 0;
1375 padding: 10px 0;
1375 padding: 10px 0;
1376 }
1376 }
1377
1377
1378 #content div.box div.form div.fields div.field-first {
1378 #content div.box div.form div.fields div.field-first {
1379 padding: 0 0 10px;
1379 padding: 0 0 10px;
1380 }
1380 }
1381
1381
1382 #content div.box div.form div.fields div.field-noborder {
1382 #content div.box div.form div.fields div.field-noborder {
1383 border-bottom: 0 !important;
1383 border-bottom: 0 !important;
1384 }
1384 }
1385
1385
1386 #content div.box div.form div.fields div.field span.error-message {
1386 #content div.box div.form div.fields div.field span.error-message {
1387 height: 1%;
1387 height: 1%;
1388 display: inline-block;
1388 display: inline-block;
1389 color: red;
1389 color: red;
1390 margin: 8px 0 0 4px;
1390 margin: 8px 0 0 4px;
1391 padding: 0;
1391 padding: 0;
1392 }
1392 }
1393
1393
1394 #content div.box div.form div.fields div.field span.success {
1394 #content div.box div.form div.fields div.field span.success {
1395 height: 1%;
1395 height: 1%;
1396 display: block;
1396 display: block;
1397 color: #316309;
1397 color: #316309;
1398 margin: 8px 0 0;
1398 margin: 8px 0 0;
1399 padding: 0;
1399 padding: 0;
1400 }
1400 }
1401
1401
1402 #content div.box div.form div.fields div.field div.label {
1402 #content div.box div.form div.fields div.field div.label {
1403 left: 70px;
1403 left: 70px;
1404 width: 155px;
1404 width: 155px;
1405 position: absolute;
1405 position: absolute;
1406 margin: 0;
1406 margin: 0;
1407 padding: 5px 0 0 0px;
1407 padding: 5px 0 0 0px;
1408 }
1408 }
1409
1409
1410 #content div.box div.form div.fields div.field div.label-summary {
1410 #content div.box div.form div.fields div.field div.label-summary {
1411 left: 30px;
1411 left: 30px;
1412 width: 155px;
1412 width: 155px;
1413 position: absolute;
1413 position: absolute;
1414 margin: 0;
1414 margin: 0;
1415 padding: 0px 0 0 0px;
1415 padding: 0px 0 0 0px;
1416 }
1416 }
1417
1417
1418 #content div.box-left div.form div.fields div.field div.label,
1418 #content div.box-left div.form div.fields div.field div.label,
1419 #content div.box-right div.form div.fields div.field div.label,
1419 #content div.box-right div.form div.fields div.field div.label,
1420 #content div.box-left div.form div.fields div.field div.label,
1420 #content div.box-left div.form div.fields div.field div.label,
1421 #content div.box-left div.form div.fields div.field div.label-summary,
1421 #content div.box-left div.form div.fields div.field div.label-summary,
1422 #content div.box-right div.form div.fields div.field div.label-summary,
1422 #content div.box-right div.form div.fields div.field div.label-summary,
1423 #content div.box-left div.form div.fields div.field div.label-summary
1423 #content div.box-left div.form div.fields div.field div.label-summary
1424 {
1424 {
1425 clear: both;
1425 clear: both;
1426 overflow: hidden;
1426 overflow: hidden;
1427 left: 0;
1427 left: 0;
1428 width: auto;
1428 width: auto;
1429 position: relative;
1429 position: relative;
1430 margin: 0;
1430 margin: 0;
1431 padding: 0 0 8px;
1431 padding: 0 0 8px;
1432 }
1432 }
1433
1433
1434 #content div.box div.form div.fields div.field div.label-select {
1434 #content div.box div.form div.fields div.field div.label-select {
1435 padding: 5px 0 0 5px;
1435 padding: 5px 0 0 5px;
1436 }
1436 }
1437
1437
1438 #content div.box-left div.form div.fields div.field div.label-select,
1438 #content div.box-left div.form div.fields div.field div.label-select,
1439 #content div.box-right div.form div.fields div.field div.label-select
1439 #content div.box-right div.form div.fields div.field div.label-select
1440 {
1440 {
1441 padding: 0 0 8px;
1441 padding: 0 0 8px;
1442 }
1442 }
1443
1443
1444 #content div.box-left div.form div.fields div.field div.label-textarea,
1444 #content div.box-left div.form div.fields div.field div.label-textarea,
1445 #content div.box-right div.form div.fields div.field div.label-textarea
1445 #content div.box-right div.form div.fields div.field div.label-textarea
1446 {
1446 {
1447 padding: 0 0 8px !important;
1447 padding: 0 0 8px !important;
1448 }
1448 }
1449
1449
1450 #content div.box div.form div.fields div.field div.label label,div.label label
1450 #content div.box div.form div.fields div.field div.label label,div.label label
1451 {
1451 {
1452 color: #393939;
1452 color: #393939;
1453 font-weight: 700;
1453 font-weight: 700;
1454 }
1454 }
1455 #content div.box div.form div.fields div.field div.label label,div.label-summary label
1455 #content div.box div.form div.fields div.field div.label label,div.label-summary label
1456 {
1456 {
1457 color: #393939;
1457 color: #393939;
1458 font-weight: 700;
1458 font-weight: 700;
1459 }
1459 }
1460 #content div.box div.form div.fields div.field div.input {
1460 #content div.box div.form div.fields div.field div.input {
1461 margin: 0 0 0 200px;
1461 margin: 0 0 0 200px;
1462 }
1462 }
1463
1463
1464 #content div.box div.form div.fields div.field div.input.summary {
1464 #content div.box div.form div.fields div.field div.input.summary {
1465 margin: 0 0 0 110px;
1465 margin: 0 0 0 110px;
1466 }
1466 }
1467 #content div.box div.form div.fields div.field div.input.summary-short {
1467 #content div.box div.form div.fields div.field div.input.summary-short {
1468 margin: 0 0 0 110px;
1468 margin: 0 0 0 110px;
1469 }
1469 }
1470 #content div.box div.form div.fields div.field div.file {
1470 #content div.box div.form div.fields div.field div.file {
1471 margin: 0 0 0 200px;
1471 margin: 0 0 0 200px;
1472 }
1472 }
1473
1473
1474 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input
1474 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input
1475 {
1475 {
1476 margin: 0 0 0 0px;
1476 margin: 0 0 0 0px;
1477 }
1477 }
1478
1478
1479 #content div.box div.form div.fields div.field div.input input,
1479 #content div.box div.form div.fields div.field div.input input,
1480 .reviewer_ac input {
1480 .reviewer_ac input {
1481 background: #FFF;
1481 background: #FFF;
1482 border-top: 1px solid #b3b3b3;
1482 border-top: 1px solid #b3b3b3;
1483 border-left: 1px solid #b3b3b3;
1483 border-left: 1px solid #b3b3b3;
1484 border-right: 1px solid #eaeaea;
1484 border-right: 1px solid #eaeaea;
1485 border-bottom: 1px solid #eaeaea;
1485 border-bottom: 1px solid #eaeaea;
1486 color: #000;
1486 color: #000;
1487 font-size: 11px;
1487 font-size: 11px;
1488 margin: 0;
1488 margin: 0;
1489 padding: 7px 7px 6px;
1489 padding: 7px 7px 6px;
1490 }
1490 }
1491
1491
1492 #content div.box div.form div.fields div.field div.input input#clone_url,
1492 #content div.box div.form div.fields div.field div.input input#clone_url,
1493 #content div.box div.form div.fields div.field div.input input#clone_url_id
1493 #content div.box div.form div.fields div.field div.input input#clone_url_id
1494 {
1494 {
1495 font-size: 16px;
1495 font-size: 16px;
1496 padding: 2px;
1496 padding: 2px;
1497 }
1497 }
1498
1498
1499 #content div.box div.form div.fields div.field div.file input {
1499 #content div.box div.form div.fields div.field div.file input {
1500 background: none repeat scroll 0 0 #FFFFFF;
1500 background: none repeat scroll 0 0 #FFFFFF;
1501 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1501 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1502 border-style: solid;
1502 border-style: solid;
1503 border-width: 1px;
1503 border-width: 1px;
1504 color: #000000;
1504 color: #000000;
1505 font-size: 11px;
1505 font-size: 11px;
1506 margin: 0;
1506 margin: 0;
1507 padding: 7px 7px 6px;
1507 padding: 7px 7px 6px;
1508 }
1508 }
1509
1509
1510 input.disabled {
1510 input.disabled {
1511 background-color: #F5F5F5 !important;
1511 background-color: #F5F5F5 !important;
1512 }
1512 }
1513 #content div.box div.form div.fields div.field div.input input.small {
1513 #content div.box div.form div.fields div.field div.input input.small {
1514 width: 30%;
1514 width: 30%;
1515 }
1515 }
1516
1516
1517 #content div.box div.form div.fields div.field div.input input.medium {
1517 #content div.box div.form div.fields div.field div.input input.medium {
1518 width: 55%;
1518 width: 55%;
1519 }
1519 }
1520
1520
1521 #content div.box div.form div.fields div.field div.input input.large {
1521 #content div.box div.form div.fields div.field div.input input.large {
1522 width: 85%;
1522 width: 85%;
1523 }
1523 }
1524
1524
1525 #content div.box div.form div.fields div.field div.input input.date {
1525 #content div.box div.form div.fields div.field div.input input.date {
1526 width: 177px;
1526 width: 177px;
1527 }
1527 }
1528
1528
1529 #content div.box div.form div.fields div.field div.input input.button {
1529 #content div.box div.form div.fields div.field div.input input.button {
1530 background: #D4D0C8;
1530 background: #D4D0C8;
1531 border-top: 1px solid #FFF;
1531 border-top: 1px solid #FFF;
1532 border-left: 1px solid #FFF;
1532 border-left: 1px solid #FFF;
1533 border-right: 1px solid #404040;
1533 border-right: 1px solid #404040;
1534 border-bottom: 1px solid #404040;
1534 border-bottom: 1px solid #404040;
1535 color: #000;
1535 color: #000;
1536 margin: 0;
1536 margin: 0;
1537 padding: 4px 8px;
1537 padding: 4px 8px;
1538 }
1538 }
1539
1539
1540 #content div.box div.form div.fields div.field div.textarea {
1540 #content div.box div.form div.fields div.field div.textarea {
1541 border-top: 1px solid #b3b3b3;
1541 border-top: 1px solid #b3b3b3;
1542 border-left: 1px solid #b3b3b3;
1542 border-left: 1px solid #b3b3b3;
1543 border-right: 1px solid #eaeaea;
1543 border-right: 1px solid #eaeaea;
1544 border-bottom: 1px solid #eaeaea;
1544 border-bottom: 1px solid #eaeaea;
1545 margin: 0 0 0 200px;
1545 margin: 0 0 0 200px;
1546 padding: 10px;
1546 padding: 10px;
1547 }
1547 }
1548
1548
1549 #content div.box div.form div.fields div.field div.textarea-editor {
1549 #content div.box div.form div.fields div.field div.textarea-editor {
1550 border: 1px solid #ddd;
1550 border: 1px solid #ddd;
1551 padding: 0;
1551 padding: 0;
1552 }
1552 }
1553
1553
1554 #content div.box div.form div.fields div.field div.textarea textarea {
1554 #content div.box div.form div.fields div.field div.textarea textarea {
1555 width: 100%;
1555 width: 100%;
1556 height: 220px;
1556 height: 220px;
1557 overflow: hidden;
1557 overflow: hidden;
1558 background: #FFF;
1558 background: #FFF;
1559 color: #000;
1559 color: #000;
1560 font-size: 11px;
1560 font-size: 11px;
1561 outline: none;
1561 outline: none;
1562 border-width: 0;
1562 border-width: 0;
1563 margin: 0;
1563 margin: 0;
1564 padding: 0;
1564 padding: 0;
1565 }
1565 }
1566
1566
1567 #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
1567 #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
1568 {
1568 {
1569 width: 100%;
1569 width: 100%;
1570 height: 100px;
1570 height: 100px;
1571 }
1571 }
1572
1572
1573 #content div.box div.form div.fields div.field div.textarea table {
1573 #content div.box div.form div.fields div.field div.textarea table {
1574 width: 100%;
1574 width: 100%;
1575 border: none;
1575 border: none;
1576 margin: 0;
1576 margin: 0;
1577 padding: 0;
1577 padding: 0;
1578 }
1578 }
1579
1579
1580 #content div.box div.form div.fields div.field div.textarea table td {
1580 #content div.box div.form div.fields div.field div.textarea table td {
1581 background: #DDD;
1581 background: #DDD;
1582 border: none;
1582 border: none;
1583 padding: 0;
1583 padding: 0;
1584 }
1584 }
1585
1585
1586 #content div.box div.form div.fields div.field div.textarea table td table
1586 #content div.box div.form div.fields div.field div.textarea table td table
1587 {
1587 {
1588 width: auto;
1588 width: auto;
1589 border: none;
1589 border: none;
1590 margin: 0;
1590 margin: 0;
1591 padding: 0;
1591 padding: 0;
1592 }
1592 }
1593
1593
1594 #content div.box div.form div.fields div.field div.textarea table td table td
1594 #content div.box div.form div.fields div.field div.textarea table td table td
1595 {
1595 {
1596 font-size: 11px;
1596 font-size: 11px;
1597 padding: 5px 5px 5px 0;
1597 padding: 5px 5px 5px 0;
1598 }
1598 }
1599
1599
1600 #content div.box div.form div.fields div.field input[type=text]:focus,
1600 #content div.box div.form div.fields div.field input[type=text]:focus,
1601 #content div.box div.form div.fields div.field input[type=password]:focus,
1601 #content div.box div.form div.fields div.field input[type=password]:focus,
1602 #content div.box div.form div.fields div.field input[type=file]:focus,
1602 #content div.box div.form div.fields div.field input[type=file]:focus,
1603 #content div.box div.form div.fields div.field textarea:focus,
1603 #content div.box div.form div.fields div.field textarea:focus,
1604 #content div.box div.form div.fields div.field select:focus,
1604 #content div.box div.form div.fields div.field select:focus,
1605 .reviewer_ac input:focus
1605 .reviewer_ac input:focus
1606 {
1606 {
1607 background: #f6f6f6;
1607 background: #f6f6f6;
1608 border-color: #666;
1608 border-color: #666;
1609 }
1609 }
1610
1610
1611 .reviewer_ac {
1611 .reviewer_ac {
1612 padding:10px
1612 padding:10px
1613 }
1613 }
1614
1614
1615 div.form div.fields div.field div.button {
1615 div.form div.fields div.field div.button {
1616 margin: 0;
1616 margin: 0;
1617 padding: 0 0 0 8px;
1617 padding: 0 0 0 8px;
1618 }
1618 }
1619 #content div.box table.noborder {
1619 #content div.box table.noborder {
1620 border: 1px solid transparent;
1620 border: 1px solid transparent;
1621 }
1621 }
1622
1622
1623 #content div.box table {
1623 #content div.box table {
1624 width: 100%;
1624 width: 100%;
1625 border-collapse: separate;
1625 border-collapse: separate;
1626 margin: 0;
1626 margin: 0;
1627 padding: 0;
1627 padding: 0;
1628 border: 1px solid #eee;
1628 border: 1px solid #eee;
1629 -webkit-border-radius: 4px;
1629 -webkit-border-radius: 4px;
1630 -moz-border-radius: 4px;
1630 -moz-border-radius: 4px;
1631 border-radius: 4px;
1631 border-radius: 4px;
1632 }
1632 }
1633
1633
1634 #content div.box table th {
1634 #content div.box table th {
1635 background: #eee;
1635 background: #eee;
1636 border-bottom: 1px solid #ddd;
1636 border-bottom: 1px solid #ddd;
1637 padding: 5px 0px 5px 5px;
1637 padding: 5px 0px 5px 5px;
1638 text-align: left;
1638 text-align: left;
1639 }
1639 }
1640
1640
1641 #content div.box table th.left {
1641 #content div.box table th.left {
1642 text-align: left;
1642 text-align: left;
1643 }
1643 }
1644
1644
1645 #content div.box table th.right {
1645 #content div.box table th.right {
1646 text-align: right;
1646 text-align: right;
1647 }
1647 }
1648
1648
1649 #content div.box table th.center {
1649 #content div.box table th.center {
1650 text-align: center;
1650 text-align: center;
1651 }
1651 }
1652
1652
1653 #content div.box table th.selected {
1653 #content div.box table th.selected {
1654 vertical-align: middle;
1654 vertical-align: middle;
1655 padding: 0;
1655 padding: 0;
1656 }
1656 }
1657
1657
1658 #content div.box table td {
1658 #content div.box table td {
1659 background: #fff;
1659 background: #fff;
1660 border-bottom: 1px solid #cdcdcd;
1660 border-bottom: 1px solid #cdcdcd;
1661 vertical-align: middle;
1661 vertical-align: middle;
1662 padding: 5px;
1662 padding: 5px;
1663 }
1663 }
1664
1664
1665 #content div.box table tr.selected td {
1665 #content div.box table tr.selected td {
1666 background: #FFC;
1666 background: #FFC;
1667 }
1667 }
1668
1668
1669 #content div.box table td.selected {
1669 #content div.box table td.selected {
1670 width: 3%;
1670 width: 3%;
1671 text-align: center;
1671 text-align: center;
1672 vertical-align: middle;
1672 vertical-align: middle;
1673 padding: 0;
1673 padding: 0;
1674 }
1674 }
1675
1675
1676 #content div.box table td.action {
1676 #content div.box table td.action {
1677 width: 45%;
1677 width: 45%;
1678 text-align: left;
1678 text-align: left;
1679 }
1679 }
1680
1680
1681 #content div.box table td.date {
1681 #content div.box table td.date {
1682 width: 33%;
1682 width: 33%;
1683 text-align: center;
1683 text-align: center;
1684 }
1684 }
1685
1685
1686 #content div.box div.action {
1686 #content div.box div.action {
1687 float: right;
1687 float: right;
1688 background: #FFF;
1688 background: #FFF;
1689 text-align: right;
1689 text-align: right;
1690 margin: 10px 0 0;
1690 margin: 10px 0 0;
1691 padding: 0;
1691 padding: 0;
1692 }
1692 }
1693
1693
1694 #content div.box div.action select {
1694 #content div.box div.action select {
1695 font-size: 11px;
1695 font-size: 11px;
1696 margin: 0;
1696 margin: 0;
1697 }
1697 }
1698
1698
1699 #content div.box div.action .ui-selectmenu {
1699 #content div.box div.action .ui-selectmenu {
1700 margin: 0;
1700 margin: 0;
1701 padding: 0;
1701 padding: 0;
1702 }
1702 }
1703
1703
1704 #content div.box div.pagination {
1704 #content div.box div.pagination {
1705 height: 1%;
1705 height: 1%;
1706 clear: both;
1706 clear: both;
1707 overflow: hidden;
1707 overflow: hidden;
1708 margin: 10px 0 0;
1708 margin: 10px 0 0;
1709 padding: 0;
1709 padding: 0;
1710 }
1710 }
1711
1711
1712 #content div.box div.pagination ul.pager {
1712 #content div.box div.pagination ul.pager {
1713 float: right;
1713 float: right;
1714 text-align: right;
1714 text-align: right;
1715 margin: 0;
1715 margin: 0;
1716 padding: 0;
1716 padding: 0;
1717 }
1717 }
1718
1718
1719 #content div.box div.pagination ul.pager li {
1719 #content div.box div.pagination ul.pager li {
1720 height: 1%;
1720 height: 1%;
1721 float: left;
1721 float: left;
1722 list-style: none;
1722 list-style: none;
1723 background: #ebebeb url("../images/pager.png") repeat-x;
1723 background: #ebebeb url("../images/pager.png") repeat-x;
1724 border-top: 1px solid #dedede;
1724 border-top: 1px solid #dedede;
1725 border-left: 1px solid #cfcfcf;
1725 border-left: 1px solid #cfcfcf;
1726 border-right: 1px solid #c4c4c4;
1726 border-right: 1px solid #c4c4c4;
1727 border-bottom: 1px solid #c4c4c4;
1727 border-bottom: 1px solid #c4c4c4;
1728 color: #4A4A4A;
1728 color: #4A4A4A;
1729 font-weight: 700;
1729 font-weight: 700;
1730 margin: 0 0 0 4px;
1730 margin: 0 0 0 4px;
1731 padding: 0;
1731 padding: 0;
1732 }
1732 }
1733
1733
1734 #content div.box div.pagination ul.pager li.separator {
1734 #content div.box div.pagination ul.pager li.separator {
1735 padding: 6px;
1735 padding: 6px;
1736 }
1736 }
1737
1737
1738 #content div.box div.pagination ul.pager li.current {
1738 #content div.box div.pagination ul.pager li.current {
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 color: #515151;
1744 color: #515151;
1745 padding: 6px;
1745 padding: 6px;
1746 }
1746 }
1747
1747
1748 #content div.box div.pagination ul.pager li a {
1748 #content div.box div.pagination ul.pager li a {
1749 height: 1%;
1749 height: 1%;
1750 display: block;
1750 display: block;
1751 float: left;
1751 float: left;
1752 color: #515151;
1752 color: #515151;
1753 text-decoration: none;
1753 text-decoration: none;
1754 margin: 0;
1754 margin: 0;
1755 padding: 6px;
1755 padding: 6px;
1756 }
1756 }
1757
1757
1758 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active
1758 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active
1759 {
1759 {
1760 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1760 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1761 border-top: 1px solid #ccc;
1761 border-top: 1px solid #ccc;
1762 border-left: 1px solid #bebebe;
1762 border-left: 1px solid #bebebe;
1763 border-right: 1px solid #b1b1b1;
1763 border-right: 1px solid #b1b1b1;
1764 border-bottom: 1px solid #afafaf;
1764 border-bottom: 1px solid #afafaf;
1765 margin: -1px;
1765 margin: -1px;
1766 }
1766 }
1767
1767
1768 #content div.box div.pagination-wh {
1768 #content div.box div.pagination-wh {
1769 height: 1%;
1769 height: 1%;
1770 clear: both;
1770 clear: both;
1771 overflow: hidden;
1771 overflow: hidden;
1772 text-align: right;
1772 text-align: right;
1773 margin: 10px 0 0;
1773 margin: 10px 0 0;
1774 padding: 0;
1774 padding: 0;
1775 }
1775 }
1776
1776
1777 #content div.box div.pagination-right {
1777 #content div.box div.pagination-right {
1778 float: right;
1778 float: right;
1779 }
1779 }
1780
1780
1781 #content div.box div.pagination-wh a,
1781 #content div.box div.pagination-wh a,
1782 #content div.box div.pagination-wh span.pager_dotdot,
1782 #content div.box div.pagination-wh span.pager_dotdot,
1783 #content div.box div.pagination-wh span.yui-pg-previous,
1783 #content div.box div.pagination-wh span.yui-pg-previous,
1784 #content div.box div.pagination-wh span.yui-pg-last,
1784 #content div.box div.pagination-wh span.yui-pg-last,
1785 #content div.box div.pagination-wh span.yui-pg-next,
1785 #content div.box div.pagination-wh span.yui-pg-next,
1786 #content div.box div.pagination-wh span.yui-pg-first
1786 #content div.box div.pagination-wh span.yui-pg-first
1787 {
1787 {
1788 height: 1%;
1788 height: 1%;
1789 float: left;
1789 float: left;
1790 background: #ebebeb url("../images/pager.png") repeat-x;
1790 background: #ebebeb url("../images/pager.png") repeat-x;
1791 border-top: 1px solid #dedede;
1791 border-top: 1px solid #dedede;
1792 border-left: 1px solid #cfcfcf;
1792 border-left: 1px solid #cfcfcf;
1793 border-right: 1px solid #c4c4c4;
1793 border-right: 1px solid #c4c4c4;
1794 border-bottom: 1px solid #c4c4c4;
1794 border-bottom: 1px solid #c4c4c4;
1795 color: #4A4A4A;
1795 color: #4A4A4A;
1796 font-weight: 700;
1796 font-weight: 700;
1797 margin: 0 0 0 4px;
1797 margin: 0 0 0 4px;
1798 padding: 6px;
1798 padding: 6px;
1799 }
1799 }
1800
1800
1801 #content div.box div.pagination-wh span.pager_curpage {
1801 #content div.box div.pagination-wh span.pager_curpage {
1802 height: 1%;
1802 height: 1%;
1803 float: left;
1803 float: left;
1804 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1804 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1805 border-top: 1px solid #ccc;
1805 border-top: 1px solid #ccc;
1806 border-left: 1px solid #bebebe;
1806 border-left: 1px solid #bebebe;
1807 border-right: 1px solid #b1b1b1;
1807 border-right: 1px solid #b1b1b1;
1808 border-bottom: 1px solid #afafaf;
1808 border-bottom: 1px solid #afafaf;
1809 color: #515151;
1809 color: #515151;
1810 font-weight: 700;
1810 font-weight: 700;
1811 margin: 0 0 0 4px;
1811 margin: 0 0 0 4px;
1812 padding: 6px;
1812 padding: 6px;
1813 }
1813 }
1814
1814
1815 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active
1815 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active
1816 {
1816 {
1817 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1817 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1818 border-top: 1px solid #ccc;
1818 border-top: 1px solid #ccc;
1819 border-left: 1px solid #bebebe;
1819 border-left: 1px solid #bebebe;
1820 border-right: 1px solid #b1b1b1;
1820 border-right: 1px solid #b1b1b1;
1821 border-bottom: 1px solid #afafaf;
1821 border-bottom: 1px solid #afafaf;
1822 text-decoration: none;
1822 text-decoration: none;
1823 }
1823 }
1824
1824
1825 #content div.box div.traffic div.legend {
1825 #content div.box div.traffic div.legend {
1826 clear: both;
1826 clear: both;
1827 overflow: hidden;
1827 overflow: hidden;
1828 border-bottom: 1px solid #ddd;
1828 border-bottom: 1px solid #ddd;
1829 margin: 0 0 10px;
1829 margin: 0 0 10px;
1830 padding: 0 0 10px;
1830 padding: 0 0 10px;
1831 }
1831 }
1832
1832
1833 #content div.box div.traffic div.legend h6 {
1833 #content div.box div.traffic div.legend h6 {
1834 float: left;
1834 float: left;
1835 border: none;
1835 border: none;
1836 margin: 0;
1836 margin: 0;
1837 padding: 0;
1837 padding: 0;
1838 }
1838 }
1839
1839
1840 #content div.box div.traffic div.legend li {
1840 #content div.box div.traffic div.legend li {
1841 list-style: none;
1841 list-style: none;
1842 float: left;
1842 float: left;
1843 font-size: 11px;
1843 font-size: 11px;
1844 margin: 0;
1844 margin: 0;
1845 padding: 0 8px 0 4px;
1845 padding: 0 8px 0 4px;
1846 }
1846 }
1847
1847
1848 #content div.box div.traffic div.legend li.visits {
1848 #content div.box div.traffic div.legend li.visits {
1849 border-left: 12px solid #edc240;
1849 border-left: 12px solid #edc240;
1850 }
1850 }
1851
1851
1852 #content div.box div.traffic div.legend li.pageviews {
1852 #content div.box div.traffic div.legend li.pageviews {
1853 border-left: 12px solid #afd8f8;
1853 border-left: 12px solid #afd8f8;
1854 }
1854 }
1855
1855
1856 #content div.box div.traffic table {
1856 #content div.box div.traffic table {
1857 width: auto;
1857 width: auto;
1858 }
1858 }
1859
1859
1860 #content div.box div.traffic table td {
1860 #content div.box div.traffic table td {
1861 background: transparent;
1861 background: transparent;
1862 border: none;
1862 border: none;
1863 padding: 2px 3px 3px;
1863 padding: 2px 3px 3px;
1864 }
1864 }
1865
1865
1866 #content div.box div.traffic table td.legendLabel {
1866 #content div.box div.traffic table td.legendLabel {
1867 padding: 0 3px 2px;
1867 padding: 0 3px 2px;
1868 }
1868 }
1869
1869
1870 #summary {
1870 #summary {
1871
1871
1872 }
1872 }
1873
1873
1874 #summary .metatag {
1874 #summary .metatag {
1875 display: inline-block;
1875 display: inline-block;
1876 padding: 3px 5px;
1876 padding: 3px 5px;
1877 margin-bottom: 3px;
1877 margin-bottom: 3px;
1878 margin-right: 1px;
1878 margin-right: 1px;
1879 border-radius: 5px;
1879 border-radius: 5px;
1880 }
1880 }
1881
1881
1882 #content div.box #summary p {
1882 #content div.box #summary p {
1883 margin-bottom: -5px;
1883 margin-bottom: -5px;
1884 width: 600px;
1884 width: 600px;
1885 white-space: pre-wrap;
1885 white-space: pre-wrap;
1886 }
1886 }
1887
1887
1888 #content div.box #summary p:last-child {
1888 #content div.box #summary p:last-child {
1889 margin-bottom: 9px;
1889 margin-bottom: 9px;
1890 }
1890 }
1891
1891
1892 #content div.box #summary p:first-of-type {
1892 #content div.box #summary p:first-of-type {
1893 margin-top: 9px;
1893 margin-top: 9px;
1894 }
1894 }
1895
1895
1896 .metatag {
1896 .metatag {
1897 display: inline-block;
1897 display: inline-block;
1898 margin-right: 1px;
1898 margin-right: 1px;
1899 -webkit-border-radius: 4px 4px 4px 4px;
1899 -webkit-border-radius: 4px 4px 4px 4px;
1900 -khtml-border-radius: 4px 4px 4px 4px;
1900 -khtml-border-radius: 4px 4px 4px 4px;
1901 -moz-border-radius: 4px 4px 4px 4px;
1901 -moz-border-radius: 4px 4px 4px 4px;
1902 border-radius: 4px 4px 4px 4px;
1902 border-radius: 4px 4px 4px 4px;
1903
1903
1904 border: solid 1px #9CF;
1904 border: solid 1px #9CF;
1905 padding: 2px 3px 2px 3px !important;
1905 padding: 2px 3px 2px 3px !important;
1906 background-color: #DEF;
1906 background-color: #DEF;
1907 }
1907 }
1908
1908
1909 .metatag[tag="dead"] {
1909 .metatag[tag="dead"] {
1910 background-color: #E44;
1910 background-color: #E44;
1911 }
1911 }
1912
1912
1913 .metatag[tag="stale"] {
1913 .metatag[tag="stale"] {
1914 background-color: #EA4;
1914 background-color: #EA4;
1915 }
1915 }
1916
1916
1917 .metatag[tag="featured"] {
1917 .metatag[tag="featured"] {
1918 background-color: #AEA;
1918 background-color: #AEA;
1919 }
1919 }
1920
1920
1921 .metatag[tag="requires"] {
1921 .metatag[tag="requires"] {
1922 background-color: #9CF;
1922 background-color: #9CF;
1923 }
1923 }
1924
1924
1925 .metatag[tag="recommends"] {
1925 .metatag[tag="recommends"] {
1926 background-color: #BDF;
1926 background-color: #BDF;
1927 }
1927 }
1928
1928
1929 .metatag[tag="lang"] {
1929 .metatag[tag="lang"] {
1930 background-color: #FAF474;
1930 background-color: #FAF474;
1931 }
1931 }
1932
1932
1933 .metatag[tag="license"] {
1933 .metatag[tag="license"] {
1934 border: solid 1px #9CF;
1934 border: solid 1px #9CF;
1935 background-color: #DEF;
1935 background-color: #DEF;
1936 target-new: tab !important;
1936 target-new: tab !important;
1937 }
1937 }
1938 .metatag[tag="see"] {
1938 .metatag[tag="see"] {
1939 border: solid 1px #CBD;
1939 border: solid 1px #CBD;
1940 background-color: #EDF;
1940 background-color: #EDF;
1941 }
1941 }
1942
1942
1943 a.metatag[tag="license"]:hover {
1943 a.metatag[tag="license"]:hover {
1944 background-color: #003367;
1944 background-color: #003367;
1945 color: #FFF;
1945 color: #FFF;
1946 text-decoration: none;
1946 text-decoration: none;
1947 }
1947 }
1948
1948
1949 #summary .desc {
1949 #summary .desc {
1950 white-space: pre;
1950 white-space: pre;
1951 width: 100%;
1951 width: 100%;
1952 }
1952 }
1953
1953
1954 #summary .repo_name {
1954 #summary .repo_name {
1955 font-size: 1.6em;
1955 font-size: 1.6em;
1956 font-weight: bold;
1956 font-weight: bold;
1957 vertical-align: baseline;
1957 vertical-align: baseline;
1958 clear: right
1958 clear: right
1959 }
1959 }
1960
1960
1961 #footer {
1961 #footer {
1962 clear: both;
1962 clear: both;
1963 overflow: hidden;
1963 overflow: hidden;
1964 text-align: right;
1964 text-align: right;
1965 margin: 0;
1965 margin: 0;
1966 padding: 0 10px 4px;
1966 padding: 0 10px 4px;
1967 margin: -10px 0 0;
1967 margin: -10px 0 0;
1968 }
1968 }
1969
1969
1970 #footer div#footer-inner {
1970 #footer div#footer-inner {
1971 background-color: #003B76;
1971 background-color: #003B76;
1972 background-repeat : repeat-x;
1972 background-repeat : repeat-x;
1973 background-image : -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1973 background-image : -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1974 background-image : -moz-linear-gradient(top, #003b76, #00376e);
1974 background-image : -moz-linear-gradient(top, #003b76, #00376e);
1975 background-image : -ms-linear-gradient( top, #003b76, #00376e);
1975 background-image : -ms-linear-gradient( top, #003b76, #00376e);
1976 background-image : -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1976 background-image : -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1977 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1977 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1978 background-image : -o-linear-gradient( top, #003b76, #00376e));
1978 background-image : -o-linear-gradient( top, #003b76, #00376e));
1979 background-image : linear-gradient( top, #003b76, #00376e);
1979 background-image : linear-gradient( top, #003b76, #00376e);
1980 filter :progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1980 filter :progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1981 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1981 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1982 -webkit-border-radius: 4px 4px 4px 4px;
1982 -webkit-border-radius: 4px 4px 4px 4px;
1983 -khtml-border-radius: 4px 4px 4px 4px;
1983 -khtml-border-radius: 4px 4px 4px 4px;
1984 -moz-border-radius: 4px 4px 4px 4px;
1984 -moz-border-radius: 4px 4px 4px 4px;
1985 border-radius: 4px 4px 4px 4px;
1985 border-radius: 4px 4px 4px 4px;
1986 }
1986 }
1987
1987
1988 #footer div#footer-inner p {
1988 #footer div#footer-inner p {
1989 padding: 15px 25px 15px 0;
1989 padding: 15px 25px 15px 0;
1990 color: #FFF;
1990 color: #FFF;
1991 font-weight: 700;
1991 font-weight: 700;
1992 }
1992 }
1993
1993
1994 #footer div#footer-inner .footer-link {
1994 #footer div#footer-inner .footer-link {
1995 float: left;
1995 float: left;
1996 padding-left: 10px;
1996 padding-left: 10px;
1997 }
1997 }
1998
1998
1999 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a
1999 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a
2000 {
2000 {
2001 color: #FFF;
2001 color: #FFF;
2002 }
2002 }
2003
2003
2004 #login div.title {
2004 #login div.title {
2005 clear: both;
2005 clear: both;
2006 overflow: hidden;
2006 overflow: hidden;
2007 position: relative;
2007 position: relative;
2008 background-color: #003B76;
2008 background-color: #003B76;
2009 background-repeat : repeat-x;
2009 background-repeat : repeat-x;
2010 background-image : -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
2010 background-image : -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
2011 background-image : -moz-linear-gradient( top, #003b76, #00376e);
2011 background-image : -moz-linear-gradient( top, #003b76, #00376e);
2012 background-image : -ms-linear-gradient( top, #003b76, #00376e);
2012 background-image : -ms-linear-gradient( top, #003b76, #00376e);
2013 background-image : -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
2013 background-image : -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
2014 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
2014 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
2015 background-image : -o-linear-gradient( top, #003b76, #00376e));
2015 background-image : -o-linear-gradient( top, #003b76, #00376e));
2016 background-image : linear-gradient( top, #003b76, #00376e);
2016 background-image : linear-gradient( top, #003b76, #00376e);
2017 filter : progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
2017 filter : progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
2018 margin: 0 auto;
2018 margin: 0 auto;
2019 padding: 0;
2019 padding: 0;
2020 }
2020 }
2021
2021
2022 #login div.inner {
2022 #login div.inner {
2023 background: #FFF url("../images/login.png") no-repeat top left;
2023 background: #FFF url("../images/login.png") no-repeat top left;
2024 border-top: none;
2024 border-top: none;
2025 border-bottom: none;
2025 border-bottom: none;
2026 margin: 0 auto;
2026 margin: 0 auto;
2027 padding: 20px;
2027 padding: 20px;
2028 }
2028 }
2029
2029
2030 #login div.form div.fields div.field div.label {
2030 #login div.form div.fields div.field div.label {
2031 width: 173px;
2031 width: 173px;
2032 float: left;
2032 float: left;
2033 text-align: right;
2033 text-align: right;
2034 margin: 2px 10px 0 0;
2034 margin: 2px 10px 0 0;
2035 padding: 5px 0 0 5px;
2035 padding: 5px 0 0 5px;
2036 }
2036 }
2037
2037
2038 #login div.form div.fields div.field div.input input {
2038 #login div.form div.fields div.field div.input input {
2039 background: #FFF;
2039 background: #FFF;
2040 border-top: 1px solid #b3b3b3;
2040 border-top: 1px solid #b3b3b3;
2041 border-left: 1px solid #b3b3b3;
2041 border-left: 1px solid #b3b3b3;
2042 border-right: 1px solid #eaeaea;
2042 border-right: 1px solid #eaeaea;
2043 border-bottom: 1px solid #eaeaea;
2043 border-bottom: 1px solid #eaeaea;
2044 color: #000;
2044 color: #000;
2045 font-size: 11px;
2045 font-size: 11px;
2046 margin: 0;
2046 margin: 0;
2047 padding: 7px 7px 6px;
2047 padding: 7px 7px 6px;
2048 }
2048 }
2049
2049
2050 #login div.form div.fields div.buttons {
2050 #login div.form div.fields div.buttons {
2051 clear: both;
2051 clear: both;
2052 overflow: hidden;
2052 overflow: hidden;
2053 border-top: 1px solid #DDD;
2053 border-top: 1px solid #DDD;
2054 text-align: right;
2054 text-align: right;
2055 margin: 0;
2055 margin: 0;
2056 padding: 10px 0 0;
2056 padding: 10px 0 0;
2057 }
2057 }
2058
2058
2059 #login div.form div.links {
2059 #login div.form div.links {
2060 clear: both;
2060 clear: both;
2061 overflow: hidden;
2061 overflow: hidden;
2062 margin: 10px 0 0;
2062 margin: 10px 0 0;
2063 padding: 0 0 2px;
2063 padding: 0 0 2px;
2064 }
2064 }
2065
2065
2066 .user-menu{
2066 .user-menu{
2067 margin: 0px !important;
2067 margin: 0px !important;
2068 float: left;
2068 float: left;
2069 }
2069 }
2070
2070
2071 .user-menu .container{
2071 .user-menu .container{
2072 padding:0px 4px 0px 4px;
2072 padding:0px 4px 0px 4px;
2073 margin: 0px 0px 0px 0px;
2073 margin: 0px 0px 0px 0px;
2074 }
2074 }
2075
2075
2076 .user-menu .gravatar{
2076 .user-menu .gravatar{
2077 margin: 0px 0px 0px 0px;
2077 margin: 0px 0px 0px 0px;
2078 cursor: pointer;
2078 cursor: pointer;
2079 }
2079 }
2080 .user-menu .gravatar.enabled{
2080 .user-menu .gravatar.enabled{
2081 background-color: #FDF784 !important;
2081 background-color: #FDF784 !important;
2082 }
2082 }
2083 .user-menu .gravatar:hover{
2083 .user-menu .gravatar:hover{
2084 background-color: #FDF784 !important;
2084 background-color: #FDF784 !important;
2085 }
2085 }
2086 #quick_login{
2086 #quick_login{
2087 min-height: 80px;
2087 min-height: 80px;
2088 margin: 37px 0 0 -251px;
2088 margin: 37px 0 0 -251px;
2089 padding: 4px;
2089 padding: 4px;
2090 position: absolute;
2090 position: absolute;
2091 width: 278px;
2091 width: 278px;
2092 background-color: #003B76;
2092 background-color: #003B76;
2093 background-repeat: repeat-x;
2093 background-repeat: repeat-x;
2094 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2094 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2095 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2095 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2096 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2096 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2097 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2097 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2098 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2098 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2099 background-image: -o-linear-gradient(top, #003b76, #00376e);
2099 background-image: -o-linear-gradient(top, #003b76, #00376e);
2100 background-image: linear-gradient(top, #003b76, #00376e);
2100 background-image: linear-gradient(top, #003b76, #00376e);
2101 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
2101 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
2102
2102
2103 z-index: 999;
2103 z-index: 999;
2104 -webkit-border-radius: 0px 0px 4px 4px;
2104 -webkit-border-radius: 0px 0px 4px 4px;
2105 -khtml-border-radius: 0px 0px 4px 4px;
2105 -khtml-border-radius: 0px 0px 4px 4px;
2106 -moz-border-radius: 0px 0px 4px 4px;
2106 -moz-border-radius: 0px 0px 4px 4px;
2107 border-radius: 0px 0px 4px 4px;
2107 border-radius: 0px 0px 4px 4px;
2108 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2108 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2109 }
2109 }
2110 #quick_login h4{
2110 #quick_login h4{
2111 color: #fff;
2111 color: #fff;
2112 padding: 5px 0px 5px 14px;
2112 padding: 5px 0px 5px 14px;
2113 }
2113 }
2114
2114
2115 #quick_login .password_forgoten {
2115 #quick_login .password_forgoten {
2116 padding-right: 10px;
2116 padding-right: 10px;
2117 padding-top: 0px;
2117 padding-top: 0px;
2118 text-align: left;
2118 text-align: left;
2119 }
2119 }
2120
2120
2121 #quick_login .password_forgoten a {
2121 #quick_login .password_forgoten a {
2122 font-size: 10px;
2122 font-size: 10px;
2123 color: #fff;
2123 color: #fff;
2124 }
2124 }
2125
2125
2126 #quick_login .register {
2126 #quick_login .register {
2127 padding-right: 10px;
2127 padding-right: 10px;
2128 padding-top: 5px;
2128 padding-top: 5px;
2129 text-align: left;
2129 text-align: left;
2130 }
2130 }
2131
2131
2132 #quick_login .register a {
2132 #quick_login .register a {
2133 font-size: 10px;
2133 font-size: 10px;
2134 color: #fff;
2134 color: #fff;
2135 }
2135 }
2136
2136
2137 #quick_login .submit {
2137 #quick_login .submit {
2138 margin: -20px 0 0 0px;
2138 margin: -20px 0 0 0px;
2139 position: absolute;
2139 position: absolute;
2140 right: 15px;
2140 right: 15px;
2141 }
2141 }
2142
2142
2143 #quick_login .links_left{
2143 #quick_login .links_left{
2144 float: left;
2144 float: left;
2145 }
2145 }
2146 #quick_login .links_right{
2146 #quick_login .links_right{
2147 float: right;
2147 float: right;
2148 }
2148 }
2149 #quick_login .full_name{
2149 #quick_login .full_name{
2150 color: #FFFFFF;
2150 color: #FFFFFF;
2151 font-weight: bold;
2151 font-weight: bold;
2152 padding: 3px;
2152 padding: 3px;
2153 }
2153 }
2154 #quick_login .big_gravatar{
2154 #quick_login .big_gravatar{
2155 padding:4px 0px 0px 6px;
2155 padding:4px 0px 0px 6px;
2156 }
2156 }
2157 #quick_login .inbox{
2157 #quick_login .inbox{
2158 padding:4px 0px 0px 6px;
2158 padding:4px 0px 0px 6px;
2159 color: #FFFFFF;
2159 color: #FFFFFF;
2160 font-weight: bold;
2160 font-weight: bold;
2161 }
2161 }
2162 #quick_login .inbox a{
2162 #quick_login .inbox a{
2163 color: #FFFFFF;
2163 color: #FFFFFF;
2164 }
2164 }
2165 #quick_login .email,#quick_login .email a{
2165 #quick_login .email,#quick_login .email a{
2166 color: #FFFFFF;
2166 color: #FFFFFF;
2167 padding: 3px;
2167 padding: 3px;
2168
2168
2169 }
2169 }
2170 #quick_login .links .logout{
2170 #quick_login .links .logout{
2171
2171
2172 }
2172 }
2173
2173
2174 #quick_login div.form div.fields {
2174 #quick_login div.form div.fields {
2175 padding-top: 2px;
2175 padding-top: 2px;
2176 padding-left: 10px;
2176 padding-left: 10px;
2177 }
2177 }
2178
2178
2179 #quick_login div.form div.fields div.field {
2179 #quick_login div.form div.fields div.field {
2180 padding: 5px;
2180 padding: 5px;
2181 }
2181 }
2182
2182
2183 #quick_login div.form div.fields div.field div.label label {
2183 #quick_login div.form div.fields div.field div.label label {
2184 color: #fff;
2184 color: #fff;
2185 padding-bottom: 3px;
2185 padding-bottom: 3px;
2186 }
2186 }
2187
2187
2188 #quick_login div.form div.fields div.field div.input input {
2188 #quick_login div.form div.fields div.field div.input input {
2189 width: 236px;
2189 width: 236px;
2190 background: #FFF;
2190 background: #FFF;
2191 border-top: 1px solid #b3b3b3;
2191 border-top: 1px solid #b3b3b3;
2192 border-left: 1px solid #b3b3b3;
2192 border-left: 1px solid #b3b3b3;
2193 border-right: 1px solid #eaeaea;
2193 border-right: 1px solid #eaeaea;
2194 border-bottom: 1px solid #eaeaea;
2194 border-bottom: 1px solid #eaeaea;
2195 color: #000;
2195 color: #000;
2196 font-size: 11px;
2196 font-size: 11px;
2197 margin: 0;
2197 margin: 0;
2198 padding: 5px 7px 4px;
2198 padding: 5px 7px 4px;
2199 }
2199 }
2200
2200
2201 #quick_login div.form div.fields div.buttons {
2201 #quick_login div.form div.fields div.buttons {
2202 clear: both;
2202 clear: both;
2203 overflow: hidden;
2203 overflow: hidden;
2204 text-align: right;
2204 text-align: right;
2205 margin: 0;
2205 margin: 0;
2206 padding: 5px 14px 0px 5px;
2206 padding: 5px 14px 0px 5px;
2207 }
2207 }
2208
2208
2209 #quick_login div.form div.links {
2209 #quick_login div.form div.links {
2210 clear: both;
2210 clear: both;
2211 overflow: hidden;
2211 overflow: hidden;
2212 margin: 10px 0 0;
2212 margin: 10px 0 0;
2213 padding: 0 0 2px;
2213 padding: 0 0 2px;
2214 }
2214 }
2215
2215
2216 #quick_login ol.links{
2216 #quick_login ol.links{
2217 display: block;
2217 display: block;
2218 font-weight: bold;
2218 font-weight: bold;
2219 list-style: none outside none;
2219 list-style: none outside none;
2220 text-align: right;
2220 text-align: right;
2221 }
2221 }
2222 #quick_login ol.links li{
2222 #quick_login ol.links li{
2223 line-height: 27px;
2223 line-height: 27px;
2224 margin: 0;
2224 margin: 0;
2225 padding: 0;
2225 padding: 0;
2226 color: #fff;
2226 color: #fff;
2227 display: block;
2227 display: block;
2228 float:none !important;
2228 float:none !important;
2229 }
2229 }
2230
2230
2231 #quick_login ol.links li a{
2231 #quick_login ol.links li a{
2232 color: #fff;
2232 color: #fff;
2233 display: block;
2233 display: block;
2234 padding: 2px;
2234 padding: 2px;
2235 }
2235 }
2236 #quick_login ol.links li a:HOVER{
2236 #quick_login ol.links li a:HOVER{
2237 background-color: inherit !important;
2237 background-color: inherit !important;
2238 }
2238 }
2239
2239
2240 #register div.title {
2240 #register div.title {
2241 clear: both;
2241 clear: both;
2242 overflow: hidden;
2242 overflow: hidden;
2243 position: relative;
2243 position: relative;
2244 background-color: #003B76;
2244 background-color: #003B76;
2245 background-repeat: repeat-x;
2245 background-repeat: repeat-x;
2246 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2246 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2247 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2247 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2248 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2248 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2249 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2249 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2250 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2250 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2251 background-image: -o-linear-gradient(top, #003b76, #00376e);
2251 background-image: -o-linear-gradient(top, #003b76, #00376e);
2252 background-image: linear-gradient(top, #003b76, #00376e);
2252 background-image: linear-gradient(top, #003b76, #00376e);
2253 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2253 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2254 endColorstr='#00376e', GradientType=0 );
2254 endColorstr='#00376e', GradientType=0 );
2255 margin: 0 auto;
2255 margin: 0 auto;
2256 padding: 0;
2256 padding: 0;
2257 }
2257 }
2258
2258
2259 #register div.inner {
2259 #register div.inner {
2260 background: #FFF;
2260 background: #FFF;
2261 border-top: none;
2261 border-top: none;
2262 border-bottom: none;
2262 border-bottom: none;
2263 margin: 0 auto;
2263 margin: 0 auto;
2264 padding: 20px;
2264 padding: 20px;
2265 }
2265 }
2266
2266
2267 #register div.form div.fields div.field div.label {
2267 #register div.form div.fields div.field div.label {
2268 width: 135px;
2268 width: 135px;
2269 float: left;
2269 float: left;
2270 text-align: right;
2270 text-align: right;
2271 margin: 2px 10px 0 0;
2271 margin: 2px 10px 0 0;
2272 padding: 5px 0 0 5px;
2272 padding: 5px 0 0 5px;
2273 }
2273 }
2274
2274
2275 #register div.form div.fields div.field div.input input {
2275 #register div.form div.fields div.field div.input input {
2276 width: 300px;
2276 width: 300px;
2277 background: #FFF;
2277 background: #FFF;
2278 border-top: 1px solid #b3b3b3;
2278 border-top: 1px solid #b3b3b3;
2279 border-left: 1px solid #b3b3b3;
2279 border-left: 1px solid #b3b3b3;
2280 border-right: 1px solid #eaeaea;
2280 border-right: 1px solid #eaeaea;
2281 border-bottom: 1px solid #eaeaea;
2281 border-bottom: 1px solid #eaeaea;
2282 color: #000;
2282 color: #000;
2283 font-size: 11px;
2283 font-size: 11px;
2284 margin: 0;
2284 margin: 0;
2285 padding: 7px 7px 6px;
2285 padding: 7px 7px 6px;
2286 }
2286 }
2287
2287
2288 #register div.form div.fields div.buttons {
2288 #register div.form div.fields div.buttons {
2289 clear: both;
2289 clear: both;
2290 overflow: hidden;
2290 overflow: hidden;
2291 border-top: 1px solid #DDD;
2291 border-top: 1px solid #DDD;
2292 text-align: left;
2292 text-align: left;
2293 margin: 0;
2293 margin: 0;
2294 padding: 10px 0 0 150px;
2294 padding: 10px 0 0 150px;
2295 }
2295 }
2296
2296
2297 #register div.form div.activation_msg {
2297 #register div.form div.activation_msg {
2298 padding-top: 4px;
2298 padding-top: 4px;
2299 padding-bottom: 4px;
2299 padding-bottom: 4px;
2300 }
2300 }
2301
2301
2302 #journal .journal_day {
2302 #journal .journal_day {
2303 font-size: 20px;
2303 font-size: 20px;
2304 padding: 10px 0px;
2304 padding: 10px 0px;
2305 border-bottom: 2px solid #DDD;
2305 border-bottom: 2px solid #DDD;
2306 margin-left: 10px;
2306 margin-left: 10px;
2307 margin-right: 10px;
2307 margin-right: 10px;
2308 }
2308 }
2309
2309
2310 #journal .journal_container {
2310 #journal .journal_container {
2311 padding: 5px;
2311 padding: 5px;
2312 clear: both;
2312 clear: both;
2313 margin: 0px 5px 0px 10px;
2313 margin: 0px 5px 0px 10px;
2314 }
2314 }
2315
2315
2316 #journal .journal_action_container {
2316 #journal .journal_action_container {
2317 padding-left: 38px;
2317 padding-left: 38px;
2318 }
2318 }
2319
2319
2320 #journal .journal_user {
2320 #journal .journal_user {
2321 color: #747474;
2321 color: #747474;
2322 font-size: 14px;
2322 font-size: 14px;
2323 font-weight: bold;
2323 font-weight: bold;
2324 height: 30px;
2324 height: 30px;
2325 }
2325 }
2326
2326
2327 #journal .journal_user.deleted {
2327 #journal .journal_user.deleted {
2328 color: #747474;
2328 color: #747474;
2329 font-size: 14px;
2329 font-size: 14px;
2330 font-weight: normal;
2330 font-weight: normal;
2331 height: 30px;
2331 height: 30px;
2332 font-style: italic;
2332 font-style: italic;
2333 }
2333 }
2334
2334
2335
2335
2336 #journal .journal_icon {
2336 #journal .journal_icon {
2337 clear: both;
2337 clear: both;
2338 float: left;
2338 float: left;
2339 padding-right: 4px;
2339 padding-right: 4px;
2340 padding-top: 3px;
2340 padding-top: 3px;
2341 }
2341 }
2342
2342
2343 #journal .journal_action {
2343 #journal .journal_action {
2344 padding-top: 4px;
2344 padding-top: 4px;
2345 min-height: 2px;
2345 min-height: 2px;
2346 float: left
2346 float: left
2347 }
2347 }
2348
2348
2349 #journal .journal_action_params {
2349 #journal .journal_action_params {
2350 clear: left;
2350 clear: left;
2351 padding-left: 22px;
2351 padding-left: 22px;
2352 }
2352 }
2353
2353
2354 #journal .journal_repo {
2354 #journal .journal_repo {
2355 float: left;
2355 float: left;
2356 margin-left: 6px;
2356 margin-left: 6px;
2357 padding-top: 3px;
2357 padding-top: 3px;
2358 }
2358 }
2359
2359
2360 #journal .date {
2360 #journal .date {
2361 clear: both;
2361 clear: both;
2362 color: #777777;
2362 color: #777777;
2363 font-size: 11px;
2363 font-size: 11px;
2364 padding-left: 22px;
2364 padding-left: 22px;
2365 }
2365 }
2366
2366
2367 #journal .journal_repo .journal_repo_name {
2367 #journal .journal_repo .journal_repo_name {
2368 font-weight: bold;
2368 font-weight: bold;
2369 font-size: 1.1em;
2369 font-size: 1.1em;
2370 }
2370 }
2371
2371
2372 #journal .compare_view {
2372 #journal .compare_view {
2373 padding: 5px 0px 5px 0px;
2373 padding: 5px 0px 5px 0px;
2374 width: 95px;
2374 width: 95px;
2375 }
2375 }
2376
2376
2377 .journal_highlight {
2377 .journal_highlight {
2378 font-weight: bold;
2378 font-weight: bold;
2379 padding: 0 2px;
2379 padding: 0 2px;
2380 vertical-align: bottom;
2380 vertical-align: bottom;
2381 }
2381 }
2382
2382
2383 .trending_language_tbl,.trending_language_tbl td {
2383 .trending_language_tbl,.trending_language_tbl td {
2384 border: 0 !important;
2384 border: 0 !important;
2385 margin: 0 !important;
2385 margin: 0 !important;
2386 padding: 0 !important;
2386 padding: 0 !important;
2387 }
2387 }
2388
2388
2389 .trending_language_tbl,.trending_language_tbl tr {
2389 .trending_language_tbl,.trending_language_tbl tr {
2390 border-spacing: 1px;
2390 border-spacing: 1px;
2391 }
2391 }
2392
2392
2393 .trending_language {
2393 .trending_language {
2394 background-color: #003367;
2394 background-color: #003367;
2395 color: #FFF;
2395 color: #FFF;
2396 display: block;
2396 display: block;
2397 min-width: 20px;
2397 min-width: 20px;
2398 text-decoration: none;
2398 text-decoration: none;
2399 height: 12px;
2399 height: 12px;
2400 margin-bottom: 0px;
2400 margin-bottom: 0px;
2401 margin-left: 5px;
2401 margin-left: 5px;
2402 white-space: pre;
2402 white-space: pre;
2403 padding: 3px;
2403 padding: 3px;
2404 }
2404 }
2405
2405
2406 h3.files_location {
2406 h3.files_location {
2407 font-size: 1.8em;
2407 font-size: 1.8em;
2408 font-weight: 700;
2408 font-weight: 700;
2409 border-bottom: none !important;
2409 border-bottom: none !important;
2410 margin: 10px 0 !important;
2410 margin: 10px 0 !important;
2411 }
2411 }
2412
2412
2413 #files_data dl dt {
2413 #files_data dl dt {
2414 float: left;
2414 float: left;
2415 width: 60px;
2415 width: 60px;
2416 margin: 0 !important;
2416 margin: 0 !important;
2417 padding: 5px;
2417 padding: 5px;
2418 }
2418 }
2419
2419
2420 #files_data dl dd {
2420 #files_data dl dd {
2421 margin: 0 !important;
2421 margin: 0 !important;
2422 padding: 5px !important;
2422 padding: 5px !important;
2423 }
2423 }
2424
2424
2425 .file_history{
2425 .file_history{
2426 padding-top:10px;
2426 padding-top:10px;
2427 font-size:16px;
2427 font-size:16px;
2428 }
2428 }
2429 .file_author{
2429 .file_author{
2430 float: left;
2430 float: left;
2431 }
2431 }
2432
2432
2433 .file_author .item{
2433 .file_author .item{
2434 float:left;
2434 float:left;
2435 padding:5px;
2435 padding:5px;
2436 color: #888;
2436 color: #888;
2437 }
2437 }
2438
2438
2439 .tablerow0 {
2439 .tablerow0 {
2440 background-color: #F8F8F8;
2440 background-color: #F8F8F8;
2441 }
2441 }
2442
2442
2443 .tablerow1 {
2443 .tablerow1 {
2444 background-color: #FFFFFF;
2444 background-color: #FFFFFF;
2445 }
2445 }
2446
2446
2447 .changeset_id {
2447 .changeset_id {
2448 font-family: monospace;
2448 font-family: monospace;
2449 color: #666666;
2449 color: #666666;
2450 }
2450 }
2451
2451
2452 .changeset_hash {
2452 .changeset_hash {
2453 color: #000000;
2453 color: #000000;
2454 }
2454 }
2455
2455
2456 #changeset_content {
2456 #changeset_content {
2457 border-left: 1px solid #CCC;
2457 border-left: 1px solid #CCC;
2458 border-right: 1px solid #CCC;
2458 border-right: 1px solid #CCC;
2459 border-bottom: 1px solid #CCC;
2459 border-bottom: 1px solid #CCC;
2460 padding: 5px;
2460 padding: 5px;
2461 }
2461 }
2462
2462
2463 #changeset_compare_view_content {
2463 #changeset_compare_view_content {
2464 border: 1px solid #CCC;
2464 border: 1px solid #CCC;
2465 padding: 5px;
2465 padding: 5px;
2466 }
2466 }
2467
2467
2468 #changeset_content .container {
2468 #changeset_content .container {
2469 min-height: 100px;
2469 min-height: 100px;
2470 font-size: 1.2em;
2470 font-size: 1.2em;
2471 overflow: hidden;
2471 overflow: hidden;
2472 }
2472 }
2473
2473
2474 #changeset_compare_view_content .compare_view_commits {
2474 #changeset_compare_view_content .compare_view_commits {
2475 width: auto !important;
2475 width: auto !important;
2476 }
2476 }
2477
2477
2478 #changeset_compare_view_content .compare_view_commits td {
2478 #changeset_compare_view_content .compare_view_commits td {
2479 padding: 0px 0px 0px 12px !important;
2479 padding: 0px 0px 0px 12px !important;
2480 }
2480 }
2481
2481
2482 #changeset_content .container .right {
2482 #changeset_content .container .right {
2483 float: right;
2483 float: right;
2484 width: 20%;
2484 width: 20%;
2485 text-align: right;
2485 text-align: right;
2486 }
2486 }
2487
2487
2488 #changeset_content .container .left .message {
2488 #changeset_content .container .left .message {
2489 white-space: pre-wrap;
2489 white-space: pre-wrap;
2490 }
2490 }
2491 #changeset_content .container .left .message a:hover {
2491 #changeset_content .container .left .message a:hover {
2492 text-decoration: none;
2492 text-decoration: none;
2493 }
2493 }
2494 .cs_files .cur_cs {
2494 .cs_files .cur_cs {
2495 margin: 10px 2px;
2495 margin: 10px 2px;
2496 font-weight: bold;
2496 font-weight: bold;
2497 }
2497 }
2498
2498
2499 .cs_files .node {
2499 .cs_files .node {
2500 float: left;
2500 float: left;
2501 }
2501 }
2502
2502
2503 .cs_files .changes {
2503 .cs_files .changes {
2504 float: right;
2504 float: right;
2505 color:#003367;
2505 color:#003367;
2506
2506
2507 }
2507 }
2508
2508
2509 .cs_files .changes .added {
2509 .cs_files .changes .added {
2510 background-color: #BBFFBB;
2510 background-color: #BBFFBB;
2511 float: left;
2511 float: left;
2512 text-align: center;
2512 text-align: center;
2513 font-size: 9px;
2513 font-size: 9px;
2514 padding: 2px 0px 2px 0px;
2514 padding: 2px 0px 2px 0px;
2515 }
2515 }
2516
2516
2517 .cs_files .changes .deleted {
2517 .cs_files .changes .deleted {
2518 background-color: #FF8888;
2518 background-color: #FF8888;
2519 float: left;
2519 float: left;
2520 text-align: center;
2520 text-align: center;
2521 font-size: 9px;
2521 font-size: 9px;
2522 padding: 2px 0px 2px 0px;
2522 padding: 2px 0px 2px 0px;
2523 }
2523 }
2524 /*new binary*/
2524 /*new binary*/
2525 .cs_files .changes .bin1 {
2525 .cs_files .changes .bin1 {
2526 background-color: #BBFFBB;
2526 background-color: #BBFFBB;
2527 float: left;
2527 float: left;
2528 text-align: center;
2528 text-align: center;
2529 font-size: 9px;
2529 font-size: 9px;
2530 padding: 2px 0px 2px 0px;
2530 padding: 2px 0px 2px 0px;
2531 }
2531 }
2532
2532
2533 /*deleted binary*/
2533 /*deleted binary*/
2534 .cs_files .changes .bin2 {
2534 .cs_files .changes .bin2 {
2535 background-color: #FF8888;
2535 background-color: #FF8888;
2536 float: left;
2536 float: left;
2537 text-align: center;
2537 text-align: center;
2538 font-size: 9px;
2538 font-size: 9px;
2539 padding: 2px 0px 2px 0px;
2539 padding: 2px 0px 2px 0px;
2540 }
2540 }
2541
2541
2542 /*mod binary*/
2542 /*mod binary*/
2543 .cs_files .changes .bin3 {
2543 .cs_files .changes .bin3 {
2544 background-color: #DDDDDD;
2544 background-color: #DDDDDD;
2545 float: left;
2545 float: left;
2546 text-align: center;
2546 text-align: center;
2547 font-size: 9px;
2547 font-size: 9px;
2548 padding: 2px 0px 2px 0px;
2548 padding: 2px 0px 2px 0px;
2549 }
2549 }
2550
2550
2551 /*rename file*/
2551 /*rename file*/
2552 .cs_files .changes .bin4 {
2552 .cs_files .changes .bin4 {
2553 background-color: #6D99FF;
2553 background-color: #6D99FF;
2554 float: left;
2554 float: left;
2555 text-align: center;
2555 text-align: center;
2556 font-size: 9px;
2556 font-size: 9px;
2557 padding: 2px 0px 2px 0px;
2557 padding: 2px 0px 2px 0px;
2558 }
2558 }
2559
2559
2560
2560
2561 .cs_files .cs_added,.cs_files .cs_A {
2561 .cs_files .cs_added,.cs_files .cs_A {
2562 background: url("../images/icons/page_white_add.png") no-repeat scroll
2562 background: url("../images/icons/page_white_add.png") no-repeat scroll
2563 3px;
2563 3px;
2564 height: 16px;
2564 height: 16px;
2565 padding-left: 20px;
2565 padding-left: 20px;
2566 margin-top: 7px;
2566 margin-top: 7px;
2567 text-align: left;
2567 text-align: left;
2568 }
2568 }
2569
2569
2570 .cs_files .cs_changed,.cs_files .cs_M {
2570 .cs_files .cs_changed,.cs_files .cs_M {
2571 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2571 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2572 3px;
2572 3px;
2573 height: 16px;
2573 height: 16px;
2574 padding-left: 20px;
2574 padding-left: 20px;
2575 margin-top: 7px;
2575 margin-top: 7px;
2576 text-align: left;
2576 text-align: left;
2577 }
2577 }
2578
2578
2579 .cs_files .cs_removed,.cs_files .cs_D {
2579 .cs_files .cs_removed,.cs_files .cs_D {
2580 background: url("../images/icons/page_white_delete.png") no-repeat
2580 background: url("../images/icons/page_white_delete.png") no-repeat
2581 scroll 3px;
2581 scroll 3px;
2582 height: 16px;
2582 height: 16px;
2583 padding-left: 20px;
2583 padding-left: 20px;
2584 margin-top: 7px;
2584 margin-top: 7px;
2585 text-align: left;
2585 text-align: left;
2586 }
2586 }
2587
2587
2588 #graph {
2588 #graph {
2589 overflow: hidden;
2589 overflow: hidden;
2590 }
2590 }
2591
2591
2592 #graph_nodes {
2592 #graph_nodes {
2593 float: left;
2593 float: left;
2594 margin-right: 0px;
2594 margin-right: 0px;
2595 margin-top: 0px;
2595 margin-top: 0px;
2596 }
2596 }
2597
2597
2598 #graph_content {
2598 #graph_content {
2599 width: 80%;
2599 width: 80%;
2600 float: left;
2600 float: left;
2601 }
2601 }
2602
2602
2603 #graph_content .container_header {
2603 #graph_content .container_header {
2604 border-bottom: 1px solid #DDD;
2604 border-bottom: 1px solid #DDD;
2605 padding: 10px;
2605 padding: 10px;
2606 height: 25px;
2606 height: 25px;
2607 }
2607 }
2608
2608
2609 #graph_content #rev_range_container {
2609 #graph_content #rev_range_container {
2610 float: left;
2610 float: left;
2611 margin: 0px 0px 0px 3px;
2611 margin: 0px 0px 0px 3px;
2612 }
2612 }
2613
2613
2614 #graph_content #rev_range_clear {
2614 #graph_content #rev_range_clear {
2615 float: left;
2615 float: left;
2616 margin: 0px 0px 0px 3px;
2616 margin: 0px 0px 0px 3px;
2617 }
2617 }
2618
2618
2619 #graph_content .container {
2619 #graph_content .container {
2620 border-bottom: 1px solid #DDD;
2620 border-bottom: 1px solid #DDD;
2621 height: 56px;
2621 height: 56px;
2622 overflow: hidden;
2622 overflow: hidden;
2623 }
2623 }
2624
2624
2625 #graph_content .container .right {
2625 #graph_content .container .right {
2626 float: right;
2626 float: right;
2627 width: 23%;
2627 width: 23%;
2628 text-align: right;
2628 text-align: right;
2629 }
2629 }
2630
2630
2631 #graph_content .container .left {
2631 #graph_content .container .left {
2632 float: left;
2632 float: left;
2633 width: 25%;
2633 width: 25%;
2634 padding-left: 5px;
2634 padding-left: 5px;
2635 }
2635 }
2636
2636
2637 #graph_content .container .mid {
2637 #graph_content .container .mid {
2638 float: left;
2638 float: left;
2639 width: 49%;
2639 width: 49%;
2640 }
2640 }
2641
2641
2642
2642
2643 #graph_content .container .left .date {
2643 #graph_content .container .left .date {
2644 color: #666;
2644 color: #666;
2645 padding-left: 22px;
2645 padding-left: 22px;
2646 font-size: 10px;
2646 font-size: 10px;
2647 }
2647 }
2648
2648
2649 #graph_content .container .left .author {
2649 #graph_content .container .left .author {
2650 height: 22px;
2650 height: 22px;
2651 }
2651 }
2652
2652
2653 #graph_content .container .left .author .user {
2653 #graph_content .container .left .author .user {
2654 color: #444444;
2654 color: #444444;
2655 float: left;
2655 float: left;
2656 margin-left: -4px;
2656 margin-left: -4px;
2657 margin-top: 4px;
2657 margin-top: 4px;
2658 }
2658 }
2659
2659
2660 #graph_content .container .mid .message {
2660 #graph_content .container .mid .message {
2661 white-space: pre-wrap;
2661 white-space: pre-wrap;
2662 }
2662 }
2663
2663
2664 #graph_content .container .mid .message a:hover{
2664 #graph_content .container .mid .message a:hover{
2665 text-decoration: none;
2665 text-decoration: none;
2666 }
2666 }
2667
2667
2668 .revision-link
2668 .revision-link
2669 {
2669 {
2670 color:#3F6F9F;
2670 color:#3F6F9F;
2671 font-weight: bold !important;
2671 font-weight: bold !important;
2672 }
2672 }
2673
2673
2674 .issue-tracker-link{
2674 .issue-tracker-link{
2675 color:#3F6F9F;
2675 color:#3F6F9F;
2676 font-weight: bold !important;
2676 font-weight: bold !important;
2677 }
2677 }
2678
2678
2679 .changeset-status-container{
2679 .changeset-status-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 .code-header .changeset-status-container{
2685 .code-header .changeset-status-container{
2686 float:left;
2686 float:left;
2687 padding:2px 0px 0px 2px;
2687 padding:2px 0px 0px 2px;
2688 }
2688 }
2689 .changeset-status-container .changeset-status-lbl{
2689 .changeset-status-container .changeset-status-lbl{
2690 color: rgb(136, 136, 136);
2690 color: rgb(136, 136, 136);
2691 float: left;
2691 float: left;
2692 padding: 3px 4px 0px 0px
2692 padding: 3px 4px 0px 0px
2693 }
2693 }
2694 .code-header .changeset-status-container .changeset-status-lbl{
2694 .code-header .changeset-status-container .changeset-status-lbl{
2695 float: left;
2695 float: left;
2696 padding: 0px 4px 0px 0px;
2696 padding: 0px 4px 0px 0px;
2697 }
2697 }
2698 .changeset-status-container .changeset-status-ico{
2698 .changeset-status-container .changeset-status-ico{
2699 float: left;
2699 float: left;
2700 }
2700 }
2701 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico{
2701 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico{
2702 float: left;
2702 float: left;
2703 }
2703 }
2704 .right .comments-container{
2704 .right .comments-container{
2705 padding-right: 5px;
2705 padding-right: 5px;
2706 margin-top:1px;
2706 margin-top:1px;
2707 float:right;
2707 float:right;
2708 height:14px;
2708 height:14px;
2709 }
2709 }
2710
2710
2711 .right .comments-cnt{
2711 .right .comments-cnt{
2712 float: left;
2712 float: left;
2713 color: rgb(136, 136, 136);
2713 color: rgb(136, 136, 136);
2714 padding-right: 2px;
2714 padding-right: 2px;
2715 }
2715 }
2716
2716
2717 .right .changes{
2717 .right .changes{
2718 clear: both;
2718 clear: both;
2719 }
2719 }
2720
2720
2721 .right .changes .changed_total {
2721 .right .changes .changed_total {
2722 display: block;
2722 display: block;
2723 float: right;
2723 float: right;
2724 text-align: center;
2724 text-align: center;
2725 min-width: 45px;
2725 min-width: 45px;
2726 cursor: pointer;
2726 cursor: pointer;
2727 color: #444444;
2727 color: #444444;
2728 background: #FEA;
2728 background: #FEA;
2729 -webkit-border-radius: 0px 0px 0px 6px;
2729 -webkit-border-radius: 0px 0px 0px 6px;
2730 -moz-border-radius: 0px 0px 0px 6px;
2730 -moz-border-radius: 0px 0px 0px 6px;
2731 border-radius: 0px 0px 0px 6px;
2731 border-radius: 0px 0px 0px 6px;
2732 padding: 1px;
2732 padding: 1px;
2733 }
2733 }
2734
2734
2735 .right .changes .added,.changed,.removed {
2735 .right .changes .added,.changed,.removed {
2736 display: block;
2736 display: block;
2737 padding: 1px;
2737 padding: 1px;
2738 color: #444444;
2738 color: #444444;
2739 float: right;
2739 float: right;
2740 text-align: center;
2740 text-align: center;
2741 min-width: 15px;
2741 min-width: 15px;
2742 }
2742 }
2743
2743
2744 .right .changes .added {
2744 .right .changes .added {
2745 background: #CFC;
2745 background: #CFC;
2746 }
2746 }
2747
2747
2748 .right .changes .changed {
2748 .right .changes .changed {
2749 background: #FEA;
2749 background: #FEA;
2750 }
2750 }
2751
2751
2752 .right .changes .removed {
2752 .right .changes .removed {
2753 background: #FAA;
2753 background: #FAA;
2754 }
2754 }
2755
2755
2756 .right .merge {
2756 .right .merge {
2757 padding: 1px 3px 1px 3px;
2757 padding: 1px 3px 1px 3px;
2758 background-color: #fca062;
2758 background-color: #fca062;
2759 font-size: 10px;
2759 font-size: 10px;
2760 font-weight: bold;
2760 font-weight: bold;
2761 color: #ffffff;
2761 color: #ffffff;
2762 text-transform: uppercase;
2762 text-transform: uppercase;
2763 white-space: nowrap;
2763 white-space: nowrap;
2764 -webkit-border-radius: 3px;
2764 -webkit-border-radius: 3px;
2765 -moz-border-radius: 3px;
2765 -moz-border-radius: 3px;
2766 border-radius: 3px;
2766 border-radius: 3px;
2767 margin-right: 2px;
2767 margin-right: 2px;
2768 }
2768 }
2769
2769
2770 .right .parent {
2770 .right .parent {
2771 color: #666666;
2771 color: #666666;
2772 clear:both;
2772 clear:both;
2773 }
2773 }
2774 .right .logtags{
2774 .right .logtags{
2775 padding: 2px 2px 2px 2px;
2775 padding: 2px 2px 2px 2px;
2776 }
2776 }
2777 .right .logtags .branchtag,.right .logtags .tagtag,.right .logtags .booktag{
2777 .right .logtags .branchtag,.right .logtags .tagtag,.right .logtags .booktag{
2778 margin: 0px 2px;
2778 margin: 0px 2px;
2779 }
2779 }
2780
2780
2781 .right .logtags .branchtag,.logtags .branchtag {
2781 .right .logtags .branchtag,
2782 .logtags .branchtag,
2783 .spantag {
2782 padding: 1px 3px 1px 3px;
2784 padding: 1px 3px 1px 3px;
2783 background-color: #bfbfbf;
2785 background-color: #bfbfbf;
2784 font-size: 10px;
2786 font-size: 10px;
2785 font-weight: bold;
2787 font-weight: bold;
2786 color: #ffffff;
2788 color: #ffffff;
2787 text-transform: uppercase;
2789 text-transform: uppercase;
2788 white-space: nowrap;
2790 white-space: nowrap;
2789 -webkit-border-radius: 3px;
2791 -webkit-border-radius: 3px;
2790 -moz-border-radius: 3px;
2792 -moz-border-radius: 3px;
2791 border-radius: 3px;
2793 border-radius: 3px;
2792 }
2794 }
2793 .right .logtags .branchtag a:hover,.logtags .branchtag a{
2795 .right .logtags .branchtag a:hover,.logtags .branchtag a{
2794 color: #ffffff;
2796 color: #ffffff;
2795 }
2797 }
2796 .right .logtags .branchtag a:hover,.logtags .branchtag a:hover{
2798 .right .logtags .branchtag a:hover,.logtags .branchtag a:hover{
2797 text-decoration: none;
2799 text-decoration: none;
2798 color: #ffffff;
2800 color: #ffffff;
2799 }
2801 }
2800 .right .logtags .tagtag,.logtags .tagtag {
2802 .right .logtags .tagtag,.logtags .tagtag {
2801 padding: 1px 3px 1px 3px;
2803 padding: 1px 3px 1px 3px;
2802 background-color: #62cffc;
2804 background-color: #62cffc;
2803 font-size: 10px;
2805 font-size: 10px;
2804 font-weight: bold;
2806 font-weight: bold;
2805 color: #ffffff;
2807 color: #ffffff;
2806 text-transform: uppercase;
2808 text-transform: uppercase;
2807 white-space: nowrap;
2809 white-space: nowrap;
2808 -webkit-border-radius: 3px;
2810 -webkit-border-radius: 3px;
2809 -moz-border-radius: 3px;
2811 -moz-border-radius: 3px;
2810 border-radius: 3px;
2812 border-radius: 3px;
2811 }
2813 }
2812 .right .logtags .tagtag a:hover,.logtags .tagtag a{
2814 .right .logtags .tagtag a:hover,.logtags .tagtag a{
2813 color: #ffffff;
2815 color: #ffffff;
2814 }
2816 }
2815 .right .logtags .tagtag a:hover,.logtags .tagtag a:hover{
2817 .right .logtags .tagtag a:hover,.logtags .tagtag a:hover{
2816 text-decoration: none;
2818 text-decoration: none;
2817 color: #ffffff;
2819 color: #ffffff;
2818 }
2820 }
2819 .right .logbooks .bookbook,.logbooks .bookbook,.right .logtags .bookbook,.logtags .bookbook {
2821 .right .logbooks .bookbook,.logbooks .bookbook,.right .logtags .bookbook,.logtags .bookbook {
2820 padding: 1px 3px 1px 3px;
2822 padding: 1px 3px 1px 3px;
2821 background-color: #46A546;
2823 background-color: #46A546;
2822 font-size: 10px;
2824 font-size: 10px;
2823 font-weight: bold;
2825 font-weight: bold;
2824 color: #ffffff;
2826 color: #ffffff;
2825 text-transform: uppercase;
2827 text-transform: uppercase;
2826 white-space: nowrap;
2828 white-space: nowrap;
2827 -webkit-border-radius: 3px;
2829 -webkit-border-radius: 3px;
2828 -moz-border-radius: 3px;
2830 -moz-border-radius: 3px;
2829 border-radius: 3px;
2831 border-radius: 3px;
2830 }
2832 }
2831 .right .logbooks .bookbook,.logbooks .bookbook a,.right .logtags .bookbook,.logtags .bookbook a{
2833 .right .logbooks .bookbook,.logbooks .bookbook a,.right .logtags .bookbook,.logtags .bookbook a{
2832 color: #ffffff;
2834 color: #ffffff;
2833 }
2835 }
2834 .right .logbooks .bookbook,.logbooks .bookbook a:hover,.right .logtags .bookbook,.logtags .bookbook a:hover{
2836 .right .logbooks .bookbook,.logbooks .bookbook a:hover,.right .logtags .bookbook,.logtags .bookbook a:hover{
2835 text-decoration: none;
2837 text-decoration: none;
2836 color: #ffffff;
2838 color: #ffffff;
2837 }
2839 }
2838 div.browserblock {
2840 div.browserblock {
2839 overflow: hidden;
2841 overflow: hidden;
2840 border: 1px solid #ccc;
2842 border: 1px solid #ccc;
2841 background: #f8f8f8;
2843 background: #f8f8f8;
2842 font-size: 100%;
2844 font-size: 100%;
2843 line-height: 125%;
2845 line-height: 125%;
2844 padding: 0;
2846 padding: 0;
2845 -webkit-border-radius: 6px 6px 0px 0px;
2847 -webkit-border-radius: 6px 6px 0px 0px;
2846 -moz-border-radius: 6px 6px 0px 0px;
2848 -moz-border-radius: 6px 6px 0px 0px;
2847 border-radius: 6px 6px 0px 0px;
2849 border-radius: 6px 6px 0px 0px;
2848 }
2850 }
2849
2851
2850 div.browserblock .browser-header {
2852 div.browserblock .browser-header {
2851 background: #FFF;
2853 background: #FFF;
2852 padding: 10px 0px 15px 0px;
2854 padding: 10px 0px 15px 0px;
2853 width: 100%;
2855 width: 100%;
2854 }
2856 }
2855
2857
2856 div.browserblock .browser-nav {
2858 div.browserblock .browser-nav {
2857 float: left
2859 float: left
2858 }
2860 }
2859
2861
2860 div.browserblock .browser-branch {
2862 div.browserblock .browser-branch {
2861 float: left;
2863 float: left;
2862 }
2864 }
2863
2865
2864 div.browserblock .browser-branch label {
2866 div.browserblock .browser-branch label {
2865 color: #4A4A4A;
2867 color: #4A4A4A;
2866 vertical-align: text-top;
2868 vertical-align: text-top;
2867 }
2869 }
2868
2870
2869 div.browserblock .browser-header span {
2871 div.browserblock .browser-header span {
2870 margin-left: 5px;
2872 margin-left: 5px;
2871 font-weight: 700;
2873 font-weight: 700;
2872 }
2874 }
2873
2875
2874 div.browserblock .browser-search {
2876 div.browserblock .browser-search {
2875 clear: both;
2877 clear: both;
2876 padding: 8px 8px 0px 5px;
2878 padding: 8px 8px 0px 5px;
2877 height: 20px;
2879 height: 20px;
2878 }
2880 }
2879
2881
2880 div.browserblock #node_filter_box {
2882 div.browserblock #node_filter_box {
2881
2883
2882 }
2884 }
2883
2885
2884 div.browserblock .search_activate {
2886 div.browserblock .search_activate {
2885 float: left
2887 float: left
2886 }
2888 }
2887
2889
2888 div.browserblock .add_node {
2890 div.browserblock .add_node {
2889 float: left;
2891 float: left;
2890 padding-left: 5px;
2892 padding-left: 5px;
2891 }
2893 }
2892
2894
2893 div.browserblock .search_activate a:hover,div.browserblock .add_node a:hover
2895 div.browserblock .search_activate a:hover,div.browserblock .add_node a:hover
2894 {
2896 {
2895 text-decoration: none !important;
2897 text-decoration: none !important;
2896 }
2898 }
2897
2899
2898 div.browserblock .browser-body {
2900 div.browserblock .browser-body {
2899 background: #EEE;
2901 background: #EEE;
2900 border-top: 1px solid #CCC;
2902 border-top: 1px solid #CCC;
2901 }
2903 }
2902
2904
2903 table.code-browser {
2905 table.code-browser {
2904 border-collapse: collapse;
2906 border-collapse: collapse;
2905 width: 100%;
2907 width: 100%;
2906 }
2908 }
2907
2909
2908 table.code-browser tr {
2910 table.code-browser tr {
2909 margin: 3px;
2911 margin: 3px;
2910 }
2912 }
2911
2913
2912 table.code-browser thead th {
2914 table.code-browser thead th {
2913 background-color: #EEE;
2915 background-color: #EEE;
2914 height: 20px;
2916 height: 20px;
2915 font-size: 1.1em;
2917 font-size: 1.1em;
2916 font-weight: 700;
2918 font-weight: 700;
2917 text-align: left;
2919 text-align: left;
2918 padding-left: 10px;
2920 padding-left: 10px;
2919 }
2921 }
2920
2922
2921 table.code-browser tbody td {
2923 table.code-browser tbody td {
2922 padding-left: 10px;
2924 padding-left: 10px;
2923 height: 20px;
2925 height: 20px;
2924 }
2926 }
2925
2927
2926 table.code-browser .browser-file {
2928 table.code-browser .browser-file {
2927 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2929 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2928 height: 16px;
2930 height: 16px;
2929 padding-left: 20px;
2931 padding-left: 20px;
2930 text-align: left;
2932 text-align: left;
2931 }
2933 }
2932 .diffblock .changeset_header {
2934 .diffblock .changeset_header {
2933 height: 16px;
2935 height: 16px;
2934 }
2936 }
2935 .diffblock .changeset_file {
2937 .diffblock .changeset_file {
2936 background: url("../images/icons/file.png") no-repeat scroll 3px;
2938 background: url("../images/icons/file.png") no-repeat scroll 3px;
2937 text-align: left;
2939 text-align: left;
2938 float: left;
2940 float: left;
2939 padding: 2px 0px 2px 22px;
2941 padding: 2px 0px 2px 22px;
2940 }
2942 }
2941 .diffblock .diff-menu-wrapper{
2943 .diffblock .diff-menu-wrapper{
2942 float: left;
2944 float: left;
2943 }
2945 }
2944
2946
2945 .diffblock .diff-menu{
2947 .diffblock .diff-menu{
2946 position: absolute;
2948 position: absolute;
2947 background: none repeat scroll 0 0 #FFFFFF;
2949 background: none repeat scroll 0 0 #FFFFFF;
2948 border-color: #003367 #666666 #666666;
2950 border-color: #003367 #666666 #666666;
2949 border-right: 1px solid #666666;
2951 border-right: 1px solid #666666;
2950 border-style: solid solid solid;
2952 border-style: solid solid solid;
2951 border-width: 1px;
2953 border-width: 1px;
2952 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2954 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2953 margin-top:5px;
2955 margin-top:5px;
2954 margin-left:1px;
2956 margin-left:1px;
2955
2957
2956 }
2958 }
2957 .diffblock .diff-actions {
2959 .diffblock .diff-actions {
2958 padding: 2px 0px 0px 2px;
2960 padding: 2px 0px 0px 2px;
2959 float: left;
2961 float: left;
2960 }
2962 }
2961 .diffblock .diff-menu ul li {
2963 .diffblock .diff-menu ul li {
2962 padding: 0px 0px 0px 0px !important;
2964 padding: 0px 0px 0px 0px !important;
2963 }
2965 }
2964 .diffblock .diff-menu ul li a{
2966 .diffblock .diff-menu ul li a{
2965 display: block;
2967 display: block;
2966 padding: 3px 8px 3px 8px !important;
2968 padding: 3px 8px 3px 8px !important;
2967 }
2969 }
2968 .diffblock .diff-menu ul li a:hover{
2970 .diffblock .diff-menu ul li a:hover{
2969 text-decoration: none;
2971 text-decoration: none;
2970 background-color: #EEEEEE;
2972 background-color: #EEEEEE;
2971 }
2973 }
2972 table.code-browser .browser-dir {
2974 table.code-browser .browser-dir {
2973 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2975 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2974 height: 16px;
2976 height: 16px;
2975 padding-left: 20px;
2977 padding-left: 20px;
2976 text-align: left;
2978 text-align: left;
2977 }
2979 }
2978
2980
2979 table.code-browser .submodule-dir {
2981 table.code-browser .submodule-dir {
2980 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2982 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2981 height: 16px;
2983 height: 16px;
2982 padding-left: 20px;
2984 padding-left: 20px;
2983 text-align: left;
2985 text-align: left;
2984 }
2986 }
2985
2987
2986
2988
2987 .box .search {
2989 .box .search {
2988 clear: both;
2990 clear: both;
2989 overflow: hidden;
2991 overflow: hidden;
2990 margin: 0;
2992 margin: 0;
2991 padding: 0 20px 10px;
2993 padding: 0 20px 10px;
2992 }
2994 }
2993
2995
2994 .box .search div.search_path {
2996 .box .search div.search_path {
2995 background: none repeat scroll 0 0 #EEE;
2997 background: none repeat scroll 0 0 #EEE;
2996 border: 1px solid #CCC;
2998 border: 1px solid #CCC;
2997 color: blue;
2999 color: blue;
2998 margin-bottom: 10px;
3000 margin-bottom: 10px;
2999 padding: 10px 0;
3001 padding: 10px 0;
3000 }
3002 }
3001
3003
3002 .box .search div.search_path div.link {
3004 .box .search div.search_path div.link {
3003 font-weight: 700;
3005 font-weight: 700;
3004 margin-left: 25px;
3006 margin-left: 25px;
3005 }
3007 }
3006
3008
3007 .box .search div.search_path div.link a {
3009 .box .search div.search_path div.link a {
3008 color: #003367;
3010 color: #003367;
3009 cursor: pointer;
3011 cursor: pointer;
3010 text-decoration: none;
3012 text-decoration: none;
3011 }
3013 }
3012
3014
3013 #path_unlock {
3015 #path_unlock {
3014 color: red;
3016 color: red;
3015 font-size: 1.2em;
3017 font-size: 1.2em;
3016 padding-left: 4px;
3018 padding-left: 4px;
3017 }
3019 }
3018
3020
3019 .info_box span {
3021 .info_box span {
3020 margin-left: 3px;
3022 margin-left: 3px;
3021 margin-right: 3px;
3023 margin-right: 3px;
3022 }
3024 }
3023
3025
3024 .info_box .rev {
3026 .info_box .rev {
3025 color: #003367;
3027 color: #003367;
3026 font-size: 1.6em;
3028 font-size: 1.6em;
3027 font-weight: bold;
3029 font-weight: bold;
3028 vertical-align: sub;
3030 vertical-align: sub;
3029 }
3031 }
3030
3032
3031 .info_box input#at_rev,.info_box input#size {
3033 .info_box input#at_rev,.info_box input#size {
3032 background: #FFF;
3034 background: #FFF;
3033 border-top: 1px solid #b3b3b3;
3035 border-top: 1px solid #b3b3b3;
3034 border-left: 1px solid #b3b3b3;
3036 border-left: 1px solid #b3b3b3;
3035 border-right: 1px solid #eaeaea;
3037 border-right: 1px solid #eaeaea;
3036 border-bottom: 1px solid #eaeaea;
3038 border-bottom: 1px solid #eaeaea;
3037 color: #000;
3039 color: #000;
3038 font-size: 12px;
3040 font-size: 12px;
3039 margin: 0;
3041 margin: 0;
3040 padding: 1px 5px 1px;
3042 padding: 1px 5px 1px;
3041 }
3043 }
3042
3044
3043 .info_box input#view {
3045 .info_box input#view {
3044 text-align: center;
3046 text-align: center;
3045 padding: 4px 3px 2px 2px;
3047 padding: 4px 3px 2px 2px;
3046 }
3048 }
3047
3049
3048 .yui-overlay,.yui-panel-container {
3050 .yui-overlay,.yui-panel-container {
3049 visibility: hidden;
3051 visibility: hidden;
3050 position: absolute;
3052 position: absolute;
3051 z-index: 2;
3053 z-index: 2;
3052 }
3054 }
3053
3055
3054 #tip-box {
3056 #tip-box {
3055 position: absolute;
3057 position: absolute;
3056
3058
3057 background-color: #FFF;
3059 background-color: #FFF;
3058 border: 2px solid #003367;
3060 border: 2px solid #003367;
3059 font: 100% sans-serif;
3061 font: 100% sans-serif;
3060 width: auto;
3062 width: auto;
3061 opacity: 1px;
3063 opacity: 1px;
3062 padding: 8px;
3064 padding: 8px;
3063
3065
3064 white-space: pre-wrap;
3066 white-space: pre-wrap;
3065 -webkit-border-radius: 8px 8px 8px 8px;
3067 -webkit-border-radius: 8px 8px 8px 8px;
3066 -khtml-border-radius: 8px 8px 8px 8px;
3068 -khtml-border-radius: 8px 8px 8px 8px;
3067 -moz-border-radius: 8px 8px 8px 8px;
3069 -moz-border-radius: 8px 8px 8px 8px;
3068 border-radius: 8px 8px 8px 8px;
3070 border-radius: 8px 8px 8px 8px;
3069 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3071 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3070 -moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3072 -moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3071 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3073 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3072 }
3074 }
3073
3075
3074 .hl-tip-box {
3076 .hl-tip-box {
3075 visibility: hidden;
3077 visibility: hidden;
3076 position: absolute;
3078 position: absolute;
3077 color: #666;
3079 color: #666;
3078 background-color: #FFF;
3080 background-color: #FFF;
3079 border: 2px solid #003367;
3081 border: 2px solid #003367;
3080 font: 100% sans-serif;
3082 font: 100% sans-serif;
3081 width: auto;
3083 width: auto;
3082 opacity: 1px;
3084 opacity: 1px;
3083 padding: 8px;
3085 padding: 8px;
3084 white-space: pre-wrap;
3086 white-space: pre-wrap;
3085 -webkit-border-radius: 8px 8px 8px 8px;
3087 -webkit-border-radius: 8px 8px 8px 8px;
3086 -khtml-border-radius: 8px 8px 8px 8px;
3088 -khtml-border-radius: 8px 8px 8px 8px;
3087 -moz-border-radius: 8px 8px 8px 8px;
3089 -moz-border-radius: 8px 8px 8px 8px;
3088 border-radius: 8px 8px 8px 8px;
3090 border-radius: 8px 8px 8px 8px;
3089 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3091 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3090 }
3092 }
3091
3093
3092
3094
3093 .mentions-container{
3095 .mentions-container{
3094 width: 90% !important;
3096 width: 90% !important;
3095 }
3097 }
3096 .mentions-container .yui-ac-content{
3098 .mentions-container .yui-ac-content{
3097 width: 100% !important;
3099 width: 100% !important;
3098 }
3100 }
3099
3101
3100 .ac {
3102 .ac {
3101 vertical-align: top;
3103 vertical-align: top;
3102 }
3104 }
3103
3105
3104 .ac .yui-ac {
3106 .ac .yui-ac {
3105 position: inherit;
3107 position: inherit;
3106 font-size: 100%;
3108 font-size: 100%;
3107 }
3109 }
3108
3110
3109 .ac .perm_ac {
3111 .ac .perm_ac {
3110 width: 20em;
3112 width: 20em;
3111 }
3113 }
3112
3114
3113 .ac .yui-ac-input {
3115 .ac .yui-ac-input {
3114 width: 100%;
3116 width: 100%;
3115 }
3117 }
3116
3118
3117 .ac .yui-ac-container {
3119 .ac .yui-ac-container {
3118 position: absolute;
3120 position: absolute;
3119 top: 1.6em;
3121 top: 1.6em;
3120 width: auto;
3122 width: auto;
3121 }
3123 }
3122
3124
3123 .ac .yui-ac-content {
3125 .ac .yui-ac-content {
3124 position: absolute;
3126 position: absolute;
3125 border: 1px solid gray;
3127 border: 1px solid gray;
3126 background: #fff;
3128 background: #fff;
3127 z-index: 9050;
3129 z-index: 9050;
3128
3130
3129 }
3131 }
3130
3132
3131 .ac .yui-ac-shadow {
3133 .ac .yui-ac-shadow {
3132 position: absolute;
3134 position: absolute;
3133 width: 100%;
3135 width: 100%;
3134 background: #000;
3136 background: #000;
3135 -moz-opacity: 0.1px;
3137 -moz-opacity: 0.1px;
3136 opacity: .10;
3138 opacity: .10;
3137 filter: alpha(opacity = 10);
3139 filter: alpha(opacity = 10);
3138 z-index: 9049;
3140 z-index: 9049;
3139 margin: .3em;
3141 margin: .3em;
3140 }
3142 }
3141
3143
3142 .ac .yui-ac-content ul {
3144 .ac .yui-ac-content ul {
3143 width: 100%;
3145 width: 100%;
3144 margin: 0;
3146 margin: 0;
3145 padding: 0;
3147 padding: 0;
3146 z-index: 9050;
3148 z-index: 9050;
3147 }
3149 }
3148
3150
3149 .ac .yui-ac-content li {
3151 .ac .yui-ac-content li {
3150 cursor: default;
3152 cursor: default;
3151 white-space: nowrap;
3153 white-space: nowrap;
3152 margin: 0;
3154 margin: 0;
3153 padding: 2px 5px;
3155 padding: 2px 5px;
3154 height: 18px;
3156 height: 18px;
3155 z-index: 9050;
3157 z-index: 9050;
3156 display: block;
3158 display: block;
3157 width: auto !important;
3159 width: auto !important;
3158 }
3160 }
3159
3161
3160 .ac .yui-ac-content li .ac-container-wrap{
3162 .ac .yui-ac-content li .ac-container-wrap{
3161 width: auto;
3163 width: auto;
3162 }
3164 }
3163
3165
3164 .ac .yui-ac-content li.yui-ac-prehighlight {
3166 .ac .yui-ac-content li.yui-ac-prehighlight {
3165 background: #B3D4FF;
3167 background: #B3D4FF;
3166 z-index: 9050;
3168 z-index: 9050;
3167 }
3169 }
3168
3170
3169 .ac .yui-ac-content li.yui-ac-highlight {
3171 .ac .yui-ac-content li.yui-ac-highlight {
3170 background: #556CB5;
3172 background: #556CB5;
3171 color: #FFF;
3173 color: #FFF;
3172 z-index: 9050;
3174 z-index: 9050;
3173 }
3175 }
3174 .ac .yui-ac-bd{
3176 .ac .yui-ac-bd{
3175 z-index: 9050;
3177 z-index: 9050;
3176 }
3178 }
3177
3179
3178 .follow {
3180 .follow {
3179 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3181 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3180 height: 16px;
3182 height: 16px;
3181 width: 20px;
3183 width: 20px;
3182 cursor: pointer;
3184 cursor: pointer;
3183 display: block;
3185 display: block;
3184 float: right;
3186 float: right;
3185 margin-top: 2px;
3187 margin-top: 2px;
3186 }
3188 }
3187
3189
3188 .following {
3190 .following {
3189 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3191 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3190 height: 16px;
3192 height: 16px;
3191 width: 20px;
3193 width: 20px;
3192 cursor: pointer;
3194 cursor: pointer;
3193 display: block;
3195 display: block;
3194 float: right;
3196 float: right;
3195 margin-top: 2px;
3197 margin-top: 2px;
3196 }
3198 }
3197
3199
3198 .locking_locked{
3200 .locking_locked{
3199 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3201 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3200 height: 16px;
3202 height: 16px;
3201 width: 20px;
3203 width: 20px;
3202 cursor: pointer;
3204 cursor: pointer;
3203 display: block;
3205 display: block;
3204 float: right;
3206 float: right;
3205 margin-top: 2px;
3207 margin-top: 2px;
3206 }
3208 }
3207
3209
3208 .locking_unlocked{
3210 .locking_unlocked{
3209 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3211 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3210 height: 16px;
3212 height: 16px;
3211 width: 20px;
3213 width: 20px;
3212 cursor: pointer;
3214 cursor: pointer;
3213 display: block;
3215 display: block;
3214 float: right;
3216 float: right;
3215 margin-top: 2px;
3217 margin-top: 2px;
3216 }
3218 }
3217
3219
3218 .currently_following {
3220 .currently_following {
3219 padding-left: 10px;
3221 padding-left: 10px;
3220 padding-bottom: 5px;
3222 padding-bottom: 5px;
3221 }
3223 }
3222
3224
3223 .add_icon {
3225 .add_icon {
3224 background: url("../images/icons/add.png") no-repeat scroll 3px;
3226 background: url("../images/icons/add.png") no-repeat scroll 3px;
3225 padding-left: 20px;
3227 padding-left: 20px;
3226 padding-top: 0px;
3228 padding-top: 0px;
3227 text-align: left;
3229 text-align: left;
3228 }
3230 }
3229
3231
3230 .accept_icon {
3232 .accept_icon {
3231 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3233 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3232 padding-left: 20px;
3234 padding-left: 20px;
3233 padding-top: 0px;
3235 padding-top: 0px;
3234 text-align: left;
3236 text-align: left;
3235 }
3237 }
3236
3238
3237 .edit_icon {
3239 .edit_icon {
3238 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3240 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3239 padding-left: 20px;
3241 padding-left: 20px;
3240 padding-top: 0px;
3242 padding-top: 0px;
3241 text-align: left;
3243 text-align: left;
3242 }
3244 }
3243
3245
3244 .delete_icon {
3246 .delete_icon {
3245 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3247 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3246 padding-left: 20px;
3248 padding-left: 20px;
3247 padding-top: 0px;
3249 padding-top: 0px;
3248 text-align: left;
3250 text-align: left;
3249 }
3251 }
3250
3252
3251 .refresh_icon {
3253 .refresh_icon {
3252 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3254 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3253 3px;
3255 3px;
3254 padding-left: 20px;
3256 padding-left: 20px;
3255 padding-top: 0px;
3257 padding-top: 0px;
3256 text-align: left;
3258 text-align: left;
3257 }
3259 }
3258
3260
3259 .pull_icon {
3261 .pull_icon {
3260 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3262 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3261 padding-left: 20px;
3263 padding-left: 20px;
3262 padding-top: 0px;
3264 padding-top: 0px;
3263 text-align: left;
3265 text-align: left;
3264 }
3266 }
3265
3267
3266 .rss_icon {
3268 .rss_icon {
3267 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3269 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3268 padding-left: 20px;
3270 padding-left: 20px;
3269 padding-top: 4px;
3271 padding-top: 4px;
3270 text-align: left;
3272 text-align: left;
3271 font-size: 8px
3273 font-size: 8px
3272 }
3274 }
3273
3275
3274 .atom_icon {
3276 .atom_icon {
3275 background: url("../images/icons/atom.png") no-repeat scroll 3px;
3277 background: url("../images/icons/atom.png") no-repeat scroll 3px;
3276 padding-left: 20px;
3278 padding-left: 20px;
3277 padding-top: 4px;
3279 padding-top: 4px;
3278 text-align: left;
3280 text-align: left;
3279 font-size: 8px
3281 font-size: 8px
3280 }
3282 }
3281
3283
3282 .archive_icon {
3284 .archive_icon {
3283 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3285 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3284 padding-left: 20px;
3286 padding-left: 20px;
3285 text-align: left;
3287 text-align: left;
3286 padding-top: 1px;
3288 padding-top: 1px;
3287 }
3289 }
3288
3290
3289 .start_following_icon {
3291 .start_following_icon {
3290 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3292 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3291 padding-left: 20px;
3293 padding-left: 20px;
3292 text-align: left;
3294 text-align: left;
3293 padding-top: 0px;
3295 padding-top: 0px;
3294 }
3296 }
3295
3297
3296 .stop_following_icon {
3298 .stop_following_icon {
3297 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3299 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3298 padding-left: 20px;
3300 padding-left: 20px;
3299 text-align: left;
3301 text-align: left;
3300 padding-top: 0px;
3302 padding-top: 0px;
3301 }
3303 }
3302
3304
3303 .action_button {
3305 .action_button {
3304 border: 0;
3306 border: 0;
3305 display: inline;
3307 display: inline;
3306 }
3308 }
3307
3309
3308 .action_button:hover {
3310 .action_button:hover {
3309 border: 0;
3311 border: 0;
3310 text-decoration: underline;
3312 text-decoration: underline;
3311 cursor: pointer;
3313 cursor: pointer;
3312 }
3314 }
3313
3315
3314 #switch_repos {
3316 #switch_repos {
3315 position: absolute;
3317 position: absolute;
3316 height: 25px;
3318 height: 25px;
3317 z-index: 1;
3319 z-index: 1;
3318 }
3320 }
3319
3321
3320 #switch_repos select {
3322 #switch_repos select {
3321 min-width: 150px;
3323 min-width: 150px;
3322 max-height: 250px;
3324 max-height: 250px;
3323 z-index: 1;
3325 z-index: 1;
3324 }
3326 }
3325
3327
3326 .breadcrumbs {
3328 .breadcrumbs {
3327 border: medium none;
3329 border: medium none;
3328 color: #FFF;
3330 color: #FFF;
3329 float: left;
3331 float: left;
3330 text-transform: uppercase;
3332 text-transform: uppercase;
3331 font-weight: 700;
3333 font-weight: 700;
3332 font-size: 14px;
3334 font-size: 14px;
3333 margin: 0;
3335 margin: 0;
3334 padding: 11px 0 11px 10px;
3336 padding: 11px 0 11px 10px;
3335 }
3337 }
3336
3338
3337 .breadcrumbs .hash {
3339 .breadcrumbs .hash {
3338 text-transform: none;
3340 text-transform: none;
3339 color: #fff;
3341 color: #fff;
3340 }
3342 }
3341
3343
3342 .breadcrumbs a {
3344 .breadcrumbs a {
3343 color: #FFF;
3345 color: #FFF;
3344 }
3346 }
3345
3347
3346 .flash_msg {
3348 .flash_msg {
3347
3349
3348 }
3350 }
3349
3351
3350 .flash_msg ul {
3352 .flash_msg ul {
3351
3353
3352 }
3354 }
3353
3355
3354 .error_red {
3356 .error_red {
3355 color:red;
3357 color:red;
3356 }
3358 }
3357
3359
3358 .error_msg {
3360 .error_msg {
3359 background-color: #c43c35;
3361 background-color: #c43c35;
3360 background-repeat: repeat-x;
3362 background-repeat: repeat-x;
3361 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3363 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3362 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3364 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3363 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3365 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3364 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3366 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3365 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3367 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3366 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3368 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3367 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3369 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3368 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3370 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3369 border-color: #c43c35 #c43c35 #882a25;
3371 border-color: #c43c35 #c43c35 #882a25;
3370 }
3372 }
3371
3373
3372 .warning_msg {
3374 .warning_msg {
3373 color: #404040 !important;
3375 color: #404040 !important;
3374 background-color: #eedc94;
3376 background-color: #eedc94;
3375 background-repeat: repeat-x;
3377 background-repeat: repeat-x;
3376 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3378 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3377 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3379 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3378 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3380 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3379 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3381 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3380 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3382 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3381 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3383 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3382 background-image: linear-gradient(top, #fceec1, #eedc94);
3384 background-image: linear-gradient(top, #fceec1, #eedc94);
3383 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3385 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3384 border-color: #eedc94 #eedc94 #e4c652;
3386 border-color: #eedc94 #eedc94 #e4c652;
3385 }
3387 }
3386
3388
3387 .success_msg {
3389 .success_msg {
3388 background-color: #57a957;
3390 background-color: #57a957;
3389 background-repeat: repeat-x !important;
3391 background-repeat: repeat-x !important;
3390 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3392 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3391 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3393 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3392 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3394 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3393 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3395 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3394 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3396 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3395 background-image: -o-linear-gradient(top, #62c462, #57a957);
3397 background-image: -o-linear-gradient(top, #62c462, #57a957);
3396 background-image: linear-gradient(top, #62c462, #57a957);
3398 background-image: linear-gradient(top, #62c462, #57a957);
3397 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3399 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3398 border-color: #57a957 #57a957 #3d773d;
3400 border-color: #57a957 #57a957 #3d773d;
3399 }
3401 }
3400
3402
3401 .notice_msg {
3403 .notice_msg {
3402 background-color: #339bb9;
3404 background-color: #339bb9;
3403 background-repeat: repeat-x;
3405 background-repeat: repeat-x;
3404 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3406 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3405 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3407 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3406 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3408 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3407 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3409 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3408 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3410 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3409 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3411 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3410 background-image: linear-gradient(top, #5bc0de, #339bb9);
3412 background-image: linear-gradient(top, #5bc0de, #339bb9);
3411 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3413 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3412 border-color: #339bb9 #339bb9 #22697d;
3414 border-color: #339bb9 #339bb9 #22697d;
3413 }
3415 }
3414
3416
3415 .success_msg,.error_msg,.notice_msg,.warning_msg {
3417 .success_msg,.error_msg,.notice_msg,.warning_msg {
3416 font-size: 12px;
3418 font-size: 12px;
3417 font-weight: 700;
3419 font-weight: 700;
3418 min-height: 14px;
3420 min-height: 14px;
3419 line-height: 14px;
3421 line-height: 14px;
3420 margin-bottom: 10px;
3422 margin-bottom: 10px;
3421 margin-top: 0;
3423 margin-top: 0;
3422 display: block;
3424 display: block;
3423 overflow: auto;
3425 overflow: auto;
3424 padding: 6px 10px 6px 10px;
3426 padding: 6px 10px 6px 10px;
3425 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3427 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3426 position: relative;
3428 position: relative;
3427 color: #FFF;
3429 color: #FFF;
3428 border-width: 1px;
3430 border-width: 1px;
3429 border-style: solid;
3431 border-style: solid;
3430 -webkit-border-radius: 4px;
3432 -webkit-border-radius: 4px;
3431 -moz-border-radius: 4px;
3433 -moz-border-radius: 4px;
3432 border-radius: 4px;
3434 border-radius: 4px;
3433 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3435 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3434 -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3436 -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3435 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3437 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3436 }
3438 }
3437
3439
3438 #msg_close {
3440 #msg_close {
3439 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3441 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3440 cursor: pointer;
3442 cursor: pointer;
3441 height: 16px;
3443 height: 16px;
3442 position: absolute;
3444 position: absolute;
3443 right: 5px;
3445 right: 5px;
3444 top: 5px;
3446 top: 5px;
3445 width: 16px;
3447 width: 16px;
3446 }
3448 }
3447 div#legend_data{
3449 div#legend_data{
3448 padding-left:10px;
3450 padding-left:10px;
3449 }
3451 }
3450 div#legend_container table{
3452 div#legend_container table{
3451 border: none !important;
3453 border: none !important;
3452 }
3454 }
3453 div#legend_container table,div#legend_choices table {
3455 div#legend_container table,div#legend_choices table {
3454 width: auto !important;
3456 width: auto !important;
3455 }
3457 }
3456
3458
3457 table#permissions_manage {
3459 table#permissions_manage {
3458 width: 0 !important;
3460 width: 0 !important;
3459 }
3461 }
3460
3462
3461 table#permissions_manage span.private_repo_msg {
3463 table#permissions_manage span.private_repo_msg {
3462 font-size: 0.8em;
3464 font-size: 0.8em;
3463 opacity: 0.6px;
3465 opacity: 0.6px;
3464 }
3466 }
3465
3467
3466 table#permissions_manage td.private_repo_msg {
3468 table#permissions_manage td.private_repo_msg {
3467 font-size: 0.8em;
3469 font-size: 0.8em;
3468 }
3470 }
3469
3471
3470 table#permissions_manage tr#add_perm_input td {
3472 table#permissions_manage tr#add_perm_input td {
3471 vertical-align: middle;
3473 vertical-align: middle;
3472 }
3474 }
3473
3475
3474 div.gravatar {
3476 div.gravatar {
3475 background-color: #FFF;
3477 background-color: #FFF;
3476 float: left;
3478 float: left;
3477 margin-right: 0.7em;
3479 margin-right: 0.7em;
3478 padding: 1px 1px 1px 1px;
3480 padding: 1px 1px 1px 1px;
3479 line-height:0;
3481 line-height:0;
3480 -webkit-border-radius: 3px;
3482 -webkit-border-radius: 3px;
3481 -khtml-border-radius: 3px;
3483 -khtml-border-radius: 3px;
3482 -moz-border-radius: 3px;
3484 -moz-border-radius: 3px;
3483 border-radius: 3px;
3485 border-radius: 3px;
3484 }
3486 }
3485
3487
3486 div.gravatar img {
3488 div.gravatar img {
3487 -webkit-border-radius: 2px;
3489 -webkit-border-radius: 2px;
3488 -khtml-border-radius: 2px;
3490 -khtml-border-radius: 2px;
3489 -moz-border-radius: 2px;
3491 -moz-border-radius: 2px;
3490 border-radius: 2px;
3492 border-radius: 2px;
3491 }
3493 }
3492
3494
3493 #header,#content,#footer {
3495 #header,#content,#footer {
3494 min-width: 978px;
3496 min-width: 978px;
3495 }
3497 }
3496
3498
3497 #content {
3499 #content {
3498 clear: both;
3500 clear: both;
3499 overflow: hidden;
3501 overflow: hidden;
3500 padding: 54px 10px 14px 10px;
3502 padding: 54px 10px 14px 10px;
3501 }
3503 }
3502
3504
3503 #content div.box div.title div.search {
3505 #content div.box div.title div.search {
3504
3506
3505 border-left: 1px solid #316293;
3507 border-left: 1px solid #316293;
3506 }
3508 }
3507
3509
3508 #content div.box div.title div.search div.input input {
3510 #content div.box div.title div.search div.input input {
3509 border: 1px solid #316293;
3511 border: 1px solid #316293;
3510 }
3512 }
3511
3513
3512 .ui-btn{
3514 .ui-btn{
3513 color: #515151;
3515 color: #515151;
3514 background-color: #DADADA;
3516 background-color: #DADADA;
3515 background-repeat: repeat-x;
3517 background-repeat: repeat-x;
3516 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3518 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3517 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3519 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3518 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3520 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3519 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3521 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3520 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3522 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3521 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3523 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3522 background-image: linear-gradient(top, #F4F4F4, #DADADA);
3524 background-image: linear-gradient(top, #F4F4F4, #DADADA);
3523 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3525 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3524
3526
3525 border-top: 1px solid #DDD;
3527 border-top: 1px solid #DDD;
3526 border-left: 1px solid #c6c6c6;
3528 border-left: 1px solid #c6c6c6;
3527 border-right: 1px solid #DDD;
3529 border-right: 1px solid #DDD;
3528 border-bottom: 1px solid #c6c6c6;
3530 border-bottom: 1px solid #c6c6c6;
3529 color: #515151;
3531 color: #515151;
3530 outline: none;
3532 outline: none;
3531 margin: 0px 3px 3px 0px;
3533 margin: 0px 3px 3px 0px;
3532 -webkit-border-radius: 4px 4px 4px 4px !important;
3534 -webkit-border-radius: 4px 4px 4px 4px !important;
3533 -khtml-border-radius: 4px 4px 4px 4px !important;
3535 -khtml-border-radius: 4px 4px 4px 4px !important;
3534 -moz-border-radius: 4px 4px 4px 4px !important;
3536 -moz-border-radius: 4px 4px 4px 4px !important;
3535 border-radius: 4px 4px 4px 4px !important;
3537 border-radius: 4px 4px 4px 4px !important;
3536 cursor: pointer !important;
3538 cursor: pointer !important;
3537 padding: 3px 3px 3px 3px;
3539 padding: 3px 3px 3px 3px;
3538 background-position: 0 -15px;
3540 background-position: 0 -15px;
3539
3541
3540 }
3542 }
3541 .ui-btn.xsmall{
3543 .ui-btn.xsmall{
3542 padding: 1px 2px 1px 1px;
3544 padding: 1px 2px 1px 1px;
3543 }
3545 }
3544
3546
3545 .ui-btn.large{
3547 .ui-btn.large{
3546 padding: 6px 12px;
3548 padding: 6px 12px;
3547 }
3549 }
3548
3550
3549 .ui-btn.clone{
3551 .ui-btn.clone{
3550 padding: 5px 2px 6px 1px;
3552 padding: 5px 2px 6px 1px;
3551 margin: 0px -4px 3px 0px;
3553 margin: 0px -4px 3px 0px;
3552 -webkit-border-radius: 4px 0px 0px 4px !important;
3554 -webkit-border-radius: 4px 0px 0px 4px !important;
3553 -khtml-border-radius: 4px 0px 0px 4px !important;
3555 -khtml-border-radius: 4px 0px 0px 4px !important;
3554 -moz-border-radius: 4px 0px 0px 4px !important;
3556 -moz-border-radius: 4px 0px 0px 4px !important;
3555 border-radius: 4px 0px 0px 4px !important;
3557 border-radius: 4px 0px 0px 4px !important;
3556 width: 100px;
3558 width: 100px;
3557 text-align: center;
3559 text-align: center;
3558 float: left;
3560 float: left;
3559 position: absolute;
3561 position: absolute;
3560 }
3562 }
3561 .ui-btn:focus {
3563 .ui-btn:focus {
3562 outline: none;
3564 outline: none;
3563 }
3565 }
3564 .ui-btn:hover{
3566 .ui-btn:hover{
3565 background-position: 0 0px;
3567 background-position: 0 0px;
3566 text-decoration: none;
3568 text-decoration: none;
3567 color: #515151;
3569 color: #515151;
3568 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3570 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3569 }
3571 }
3570
3572
3571 .ui-btn.red{
3573 .ui-btn.red{
3572 color:#fff;
3574 color:#fff;
3573 background-color: #c43c35;
3575 background-color: #c43c35;
3574 background-repeat: repeat-x;
3576 background-repeat: repeat-x;
3575 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3577 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3576 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3578 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3577 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3579 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3578 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3580 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3579 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3581 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3580 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3582 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3581 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3583 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3582 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3584 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3583 border-color: #c43c35 #c43c35 #882a25;
3585 border-color: #c43c35 #c43c35 #882a25;
3584 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3586 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3585 }
3587 }
3586
3588
3587
3589
3588 .ui-btn.blue{
3590 .ui-btn.blue{
3589 color:#fff;
3591 color:#fff;
3590 background-color: #339bb9;
3592 background-color: #339bb9;
3591 background-repeat: repeat-x;
3593 background-repeat: repeat-x;
3592 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3594 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3593 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3595 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3594 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3596 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3595 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3597 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3596 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3598 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3597 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3599 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3598 background-image: linear-gradient(top, #5bc0de, #339bb9);
3600 background-image: linear-gradient(top, #5bc0de, #339bb9);
3599 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3601 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3600 border-color: #339bb9 #339bb9 #22697d;
3602 border-color: #339bb9 #339bb9 #22697d;
3601 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3603 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3602 }
3604 }
3603
3605
3604 .ui-btn.green{
3606 .ui-btn.green{
3605 background-color: #57a957;
3607 background-color: #57a957;
3606 background-repeat: repeat-x;
3608 background-repeat: repeat-x;
3607 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3609 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3608 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3610 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3609 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3611 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3610 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3612 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3611 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3613 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3612 background-image: -o-linear-gradient(top, #62c462, #57a957);
3614 background-image: -o-linear-gradient(top, #62c462, #57a957);
3613 background-image: linear-gradient(top, #62c462, #57a957);
3615 background-image: linear-gradient(top, #62c462, #57a957);
3614 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3616 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3615 border-color: #57a957 #57a957 #3d773d;
3617 border-color: #57a957 #57a957 #3d773d;
3616 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3618 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3617 }
3619 }
3618
3620
3619 .ui-btn.blue.hidden{
3621 .ui-btn.blue.hidden{
3620 display: none;
3622 display: none;
3621 }
3623 }
3622
3624
3623 .ui-btn.active{
3625 .ui-btn.active{
3624 font-weight: bold;
3626 font-weight: bold;
3625 }
3627 }
3626
3628
3627 ins,div.options a:hover {
3629 ins,div.options a:hover {
3628 text-decoration: none;
3630 text-decoration: none;
3629 }
3631 }
3630
3632
3631 img,
3633 img,
3632 #header #header-inner #quick li a:hover span.normal,
3634 #header #header-inner #quick li a:hover span.normal,
3633 #header #header-inner #quick li ul li.last,
3635 #header #header-inner #quick li ul li.last,
3634 #content div.box div.form div.fields div.field div.textarea table td table td a,
3636 #content div.box div.form div.fields div.field div.textarea table td table td a,
3635 #clone_url,
3637 #clone_url,
3636 #clone_url_id
3638 #clone_url_id
3637 {
3639 {
3638 border: none;
3640 border: none;
3639 }
3641 }
3640
3642
3641 img.icon,.right .merge img {
3643 img.icon,.right .merge img {
3642 vertical-align: bottom;
3644 vertical-align: bottom;
3643 }
3645 }
3644
3646
3645 #header ul#logged-user,#content div.box div.title ul.links,
3647 #header ul#logged-user,#content div.box div.title ul.links,
3646 #content div.box div.message div.dismiss,
3648 #content div.box div.message div.dismiss,
3647 #content div.box div.traffic div.legend ul
3649 #content div.box div.traffic div.legend ul
3648 {
3650 {
3649 float: right;
3651 float: right;
3650 margin: 0;
3652 margin: 0;
3651 padding: 0;
3653 padding: 0;
3652 }
3654 }
3653
3655
3654 #header #header-inner #home,#header #header-inner #logo,
3656 #header #header-inner #home,#header #header-inner #logo,
3655 #content div.box ul.left,#content div.box ol.left,
3657 #content div.box ul.left,#content div.box ol.left,
3656 #content div.box div.pagination-left,div#commit_history,
3658 #content div.box div.pagination-left,div#commit_history,
3657 div#legend_data,div#legend_container,div#legend_choices
3659 div#legend_data,div#legend_container,div#legend_choices
3658 {
3660 {
3659 float: left;
3661 float: left;
3660 }
3662 }
3661
3663
3662 #header #header-inner #quick li:hover ul ul,
3664 #header #header-inner #quick li:hover ul ul,
3663 #header #header-inner #quick li:hover ul ul ul,
3665 #header #header-inner #quick li:hover ul ul ul,
3664 #header #header-inner #quick li:hover ul ul ul ul,
3666 #header #header-inner #quick li:hover ul ul ul ul,
3665 #content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow
3667 #content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow
3666 {
3668 {
3667 display: none;
3669 display: none;
3668 }
3670 }
3669
3671
3670 #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
3672 #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
3671 {
3673 {
3672 display: block;
3674 display: block;
3673 }
3675 }
3674
3676
3675 #content div.graph {
3677 #content div.graph {
3676 padding: 0 10px 10px;
3678 padding: 0 10px 10px;
3677 }
3679 }
3678
3680
3679 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a
3681 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a
3680 {
3682 {
3681 color: #bfe3ff;
3683 color: #bfe3ff;
3682 }
3684 }
3683
3685
3684 #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
3686 #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
3685 {
3687 {
3686 margin: 10px 24px 10px 44px;
3688 margin: 10px 24px 10px 44px;
3687 }
3689 }
3688
3690
3689 #content div.box div.form,#content div.box div.table,#content div.box div.traffic
3691 #content div.box div.form,#content div.box div.table,#content div.box div.traffic
3690 {
3692 {
3691 clear: both;
3693 clear: both;
3692 overflow: hidden;
3694 overflow: hidden;
3693 margin: 0;
3695 margin: 0;
3694 padding: 0 20px 10px;
3696 padding: 0 20px 10px;
3695 }
3697 }
3696
3698
3697 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields
3699 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields
3698 {
3700 {
3699 clear: both;
3701 clear: both;
3700 overflow: hidden;
3702 overflow: hidden;
3701 margin: 0;
3703 margin: 0;
3702 padding: 0;
3704 padding: 0;
3703 }
3705 }
3704
3706
3705 #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
3707 #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
3706 {
3708 {
3707 height: 1%;
3709 height: 1%;
3708 display: block;
3710 display: block;
3709 color: #363636;
3711 color: #363636;
3710 margin: 0;
3712 margin: 0;
3711 padding: 2px 0 0;
3713 padding: 2px 0 0;
3712 }
3714 }
3713
3715
3714 #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
3716 #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
3715 {
3717 {
3716 background: #FBE3E4;
3718 background: #FBE3E4;
3717 border-top: 1px solid #e1b2b3;
3719 border-top: 1px solid #e1b2b3;
3718 border-left: 1px solid #e1b2b3;
3720 border-left: 1px solid #e1b2b3;
3719 border-right: 1px solid #FBC2C4;
3721 border-right: 1px solid #FBC2C4;
3720 border-bottom: 1px solid #FBC2C4;
3722 border-bottom: 1px solid #FBC2C4;
3721 }
3723 }
3722
3724
3723 #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
3725 #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
3724 {
3726 {
3725 background: #E6EFC2;
3727 background: #E6EFC2;
3726 border-top: 1px solid #cebb98;
3728 border-top: 1px solid #cebb98;
3727 border-left: 1px solid #cebb98;
3729 border-left: 1px solid #cebb98;
3728 border-right: 1px solid #c6d880;
3730 border-right: 1px solid #c6d880;
3729 border-bottom: 1px solid #c6d880;
3731 border-bottom: 1px solid #c6d880;
3730 }
3732 }
3731
3733
3732 #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
3734 #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
3733 {
3735 {
3734 margin: 0;
3736 margin: 0;
3735 }
3737 }
3736
3738
3737 #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
3739 #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
3738 {
3740 {
3739 margin: 0 0 0 0px !important;
3741 margin: 0 0 0 0px !important;
3740 padding: 0;
3742 padding: 0;
3741 }
3743 }
3742
3744
3743 #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
3745 #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
3744 {
3746 {
3745 margin: 0 0 0 200px;
3747 margin: 0 0 0 200px;
3746 padding: 0;
3748 padding: 0;
3747 }
3749 }
3748
3750
3749 #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
3751 #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
3750 {
3752 {
3751 color: #000;
3753 color: #000;
3752 text-decoration: none;
3754 text-decoration: none;
3753 }
3755 }
3754
3756
3755 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus
3757 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus
3756 {
3758 {
3757 border: 1px solid #666;
3759 border: 1px solid #666;
3758 }
3760 }
3759
3761
3760 #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
3762 #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
3761 {
3763 {
3762 clear: both;
3764 clear: both;
3763 overflow: hidden;
3765 overflow: hidden;
3764 margin: 0;
3766 margin: 0;
3765 padding: 8px 0 2px;
3767 padding: 8px 0 2px;
3766 }
3768 }
3767
3769
3768 #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
3770 #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
3769 {
3771 {
3770 float: left;
3772 float: left;
3771 margin: 0;
3773 margin: 0;
3772 }
3774 }
3773
3775
3774 #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
3776 #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
3775 {
3777 {
3776 height: 1%;
3778 height: 1%;
3777 display: block;
3779 display: block;
3778 float: left;
3780 float: left;
3779 margin: 2px 0 0 4px;
3781 margin: 2px 0 0 4px;
3780 }
3782 }
3781
3783
3782 div.form div.fields div.field div.button input,
3784 div.form div.fields div.field div.button input,
3783 #content div.box div.form div.fields div.buttons input
3785 #content div.box div.form div.fields div.buttons input
3784 div.form div.fields div.buttons input,
3786 div.form div.fields div.buttons input,
3785 #content div.box div.action div.button input {
3787 #content div.box div.action div.button input {
3786 /*color: #000;*/
3788 /*color: #000;*/
3787 font-size: 11px;
3789 font-size: 11px;
3788 font-weight: 700;
3790 font-weight: 700;
3789 margin: 0;
3791 margin: 0;
3790 }
3792 }
3791
3793
3792 input.ui-button {
3794 input.ui-button {
3793 background: #e5e3e3 url("../images/button.png") repeat-x;
3795 background: #e5e3e3 url("../images/button.png") repeat-x;
3794 border-top: 1px solid #DDD;
3796 border-top: 1px solid #DDD;
3795 border-left: 1px solid #c6c6c6;
3797 border-left: 1px solid #c6c6c6;
3796 border-right: 1px solid #DDD;
3798 border-right: 1px solid #DDD;
3797 border-bottom: 1px solid #c6c6c6;
3799 border-bottom: 1px solid #c6c6c6;
3798 color: #515151 !important;
3800 color: #515151 !important;
3799 outline: none;
3801 outline: none;
3800 margin: 0;
3802 margin: 0;
3801 padding: 6px 12px;
3803 padding: 6px 12px;
3802 -webkit-border-radius: 4px 4px 4px 4px;
3804 -webkit-border-radius: 4px 4px 4px 4px;
3803 -khtml-border-radius: 4px 4px 4px 4px;
3805 -khtml-border-radius: 4px 4px 4px 4px;
3804 -moz-border-radius: 4px 4px 4px 4px;
3806 -moz-border-radius: 4px 4px 4px 4px;
3805 border-radius: 4px 4px 4px 4px;
3807 border-radius: 4px 4px 4px 4px;
3806 box-shadow: 0 1px 0 #ececec;
3808 box-shadow: 0 1px 0 #ececec;
3807 cursor: pointer;
3809 cursor: pointer;
3808 }
3810 }
3809
3811
3810 input.ui-button:hover {
3812 input.ui-button:hover {
3811 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3813 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3812 border-top: 1px solid #ccc;
3814 border-top: 1px solid #ccc;
3813 border-left: 1px solid #bebebe;
3815 border-left: 1px solid #bebebe;
3814 border-right: 1px solid #b1b1b1;
3816 border-right: 1px solid #b1b1b1;
3815 border-bottom: 1px solid #afafaf;
3817 border-bottom: 1px solid #afafaf;
3816 }
3818 }
3817
3819
3818 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight
3820 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight
3819 {
3821 {
3820 display: inline;
3822 display: inline;
3821 }
3823 }
3822
3824
3823 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons
3825 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons
3824 {
3826 {
3825 margin: 10px 0 0 200px;
3827 margin: 10px 0 0 200px;
3826 padding: 0;
3828 padding: 0;
3827 }
3829 }
3828
3830
3829 #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
3831 #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
3830 {
3832 {
3831 margin: 10px 0 0;
3833 margin: 10px 0 0;
3832 }
3834 }
3833
3835
3834 #content div.box table td.user,#content div.box table td.address {
3836 #content div.box table td.user,#content div.box table td.address {
3835 width: 10%;
3837 width: 10%;
3836 text-align: center;
3838 text-align: center;
3837 }
3839 }
3838
3840
3839 #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
3841 #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
3840 {
3842 {
3841 text-align: right;
3843 text-align: right;
3842 margin: 6px 0 0;
3844 margin: 6px 0 0;
3843 padding: 0;
3845 padding: 0;
3844 }
3846 }
3845
3847
3846 #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
3848 #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
3847 {
3849 {
3848 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3850 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3849 border-top: 1px solid #ccc;
3851 border-top: 1px solid #ccc;
3850 border-left: 1px solid #bebebe;
3852 border-left: 1px solid #bebebe;
3851 border-right: 1px solid #b1b1b1;
3853 border-right: 1px solid #b1b1b1;
3852 border-bottom: 1px solid #afafaf;
3854 border-bottom: 1px solid #afafaf;
3853 color: #515151;
3855 color: #515151;
3854 margin: 0;
3856 margin: 0;
3855 padding: 6px 12px;
3857 padding: 6px 12px;
3856 }
3858 }
3857
3859
3858 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results
3860 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results
3859 {
3861 {
3860 text-align: left;
3862 text-align: left;
3861 float: left;
3863 float: left;
3862 margin: 0;
3864 margin: 0;
3863 padding: 0;
3865 padding: 0;
3864 }
3866 }
3865
3867
3866 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span
3868 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span
3867 {
3869 {
3868 height: 1%;
3870 height: 1%;
3869 display: block;
3871 display: block;
3870 float: left;
3872 float: left;
3871 background: #ebebeb url("../images/pager.png") repeat-x;
3873 background: #ebebeb url("../images/pager.png") repeat-x;
3872 border-top: 1px solid #dedede;
3874 border-top: 1px solid #dedede;
3873 border-left: 1px solid #cfcfcf;
3875 border-left: 1px solid #cfcfcf;
3874 border-right: 1px solid #c4c4c4;
3876 border-right: 1px solid #c4c4c4;
3875 border-bottom: 1px solid #c4c4c4;
3877 border-bottom: 1px solid #c4c4c4;
3876 color: #4A4A4A;
3878 color: #4A4A4A;
3877 font-weight: 700;
3879 font-weight: 700;
3878 margin: 0;
3880 margin: 0;
3879 padding: 6px 8px;
3881 padding: 6px 8px;
3880 }
3882 }
3881
3883
3882 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled
3884 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled
3883 {
3885 {
3884 color: #B4B4B4;
3886 color: #B4B4B4;
3885 padding: 6px;
3887 padding: 6px;
3886 }
3888 }
3887
3889
3888 #login,#register {
3890 #login,#register {
3889 width: 520px;
3891 width: 520px;
3890 margin: 10% auto 0;
3892 margin: 10% auto 0;
3891 padding: 0;
3893 padding: 0;
3892 }
3894 }
3893
3895
3894 #login div.color,#register div.color {
3896 #login div.color,#register div.color {
3895 clear: both;
3897 clear: both;
3896 overflow: hidden;
3898 overflow: hidden;
3897 background: #FFF;
3899 background: #FFF;
3898 margin: 10px auto 0;
3900 margin: 10px auto 0;
3899 padding: 3px 3px 3px 0;
3901 padding: 3px 3px 3px 0;
3900 }
3902 }
3901
3903
3902 #login div.color a,#register div.color a {
3904 #login div.color a,#register div.color a {
3903 width: 20px;
3905 width: 20px;
3904 height: 20px;
3906 height: 20px;
3905 display: block;
3907 display: block;
3906 float: left;
3908 float: left;
3907 margin: 0 0 0 3px;
3909 margin: 0 0 0 3px;
3908 padding: 0;
3910 padding: 0;
3909 }
3911 }
3910
3912
3911 #login div.title h5,#register div.title h5 {
3913 #login div.title h5,#register div.title h5 {
3912 color: #fff;
3914 color: #fff;
3913 margin: 10px;
3915 margin: 10px;
3914 padding: 0;
3916 padding: 0;
3915 }
3917 }
3916
3918
3917 #login div.form div.fields div.field,#register div.form div.fields div.field
3919 #login div.form div.fields div.field,#register div.form div.fields div.field
3918 {
3920 {
3919 clear: both;
3921 clear: both;
3920 overflow: hidden;
3922 overflow: hidden;
3921 margin: 0;
3923 margin: 0;
3922 padding: 0 0 10px;
3924 padding: 0 0 10px;
3923 }
3925 }
3924
3926
3925 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message
3927 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message
3926 {
3928 {
3927 height: 1%;
3929 height: 1%;
3928 display: block;
3930 display: block;
3929 color: red;
3931 color: red;
3930 margin: 8px 0 0;
3932 margin: 8px 0 0;
3931 padding: 0;
3933 padding: 0;
3932 max-width: 320px;
3934 max-width: 320px;
3933 }
3935 }
3934
3936
3935 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label
3937 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label
3936 {
3938 {
3937 color: #000;
3939 color: #000;
3938 font-weight: 700;
3940 font-weight: 700;
3939 }
3941 }
3940
3942
3941 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input
3943 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input
3942 {
3944 {
3943 float: left;
3945 float: left;
3944 margin: 0;
3946 margin: 0;
3945 padding: 0;
3947 padding: 0;
3946 }
3948 }
3947
3949
3948 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox
3950 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox
3949 {
3951 {
3950 margin: 0 0 0 184px;
3952 margin: 0 0 0 184px;
3951 padding: 0;
3953 padding: 0;
3952 }
3954 }
3953
3955
3954 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label
3956 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label
3955 {
3957 {
3956 color: #565656;
3958 color: #565656;
3957 font-weight: 700;
3959 font-weight: 700;
3958 }
3960 }
3959
3961
3960 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input
3962 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input
3961 {
3963 {
3962 color: #000;
3964 color: #000;
3963 font-size: 1em;
3965 font-size: 1em;
3964 font-weight: 700;
3966 font-weight: 700;
3965 margin: 0;
3967 margin: 0;
3966 }
3968 }
3967
3969
3968 #changeset_content .container .wrapper,#graph_content .container .wrapper
3970 #changeset_content .container .wrapper,#graph_content .container .wrapper
3969 {
3971 {
3970 width: 600px;
3972 width: 600px;
3971 }
3973 }
3972
3974
3973 #changeset_content .container .left {
3975 #changeset_content .container .left {
3974 float: left;
3976 float: left;
3975 width: 75%;
3977 width: 75%;
3976 padding-left: 5px;
3978 padding-left: 5px;
3977 }
3979 }
3978
3980
3979 #changeset_content .container .left .date,.ac .match {
3981 #changeset_content .container .left .date,.ac .match {
3980 font-weight: 700;
3982 font-weight: 700;
3981 padding-top: 5px;
3983 padding-top: 5px;
3982 padding-bottom: 5px;
3984 padding-bottom: 5px;
3983 }
3985 }
3984
3986
3985 div#legend_container table td,div#legend_choices table td {
3987 div#legend_container table td,div#legend_choices table td {
3986 border: none !important;
3988 border: none !important;
3987 height: 20px !important;
3989 height: 20px !important;
3988 padding: 0 !important;
3990 padding: 0 !important;
3989 }
3991 }
3990
3992
3991 .q_filter_box {
3993 .q_filter_box {
3992 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3994 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3993 -webkit-border-radius: 4px;
3995 -webkit-border-radius: 4px;
3994 -moz-border-radius: 4px;
3996 -moz-border-radius: 4px;
3995 border-radius: 4px;
3997 border-radius: 4px;
3996 border: 0 none;
3998 border: 0 none;
3997 color: #AAAAAA;
3999 color: #AAAAAA;
3998 margin-bottom: -4px;
4000 margin-bottom: -4px;
3999 margin-top: -4px;
4001 margin-top: -4px;
4000 padding-left: 3px;
4002 padding-left: 3px;
4001 }
4003 }
4002
4004
4003 #node_filter {
4005 #node_filter {
4004 border: 0px solid #545454;
4006 border: 0px solid #545454;
4005 color: #AAAAAA;
4007 color: #AAAAAA;
4006 padding-left: 3px;
4008 padding-left: 3px;
4007 }
4009 }
4008
4010
4009
4011
4010 .group_members_wrap{
4012 .group_members_wrap{
4011 min-height: 85px;
4013 min-height: 85px;
4012 padding-left: 20px;
4014 padding-left: 20px;
4013 }
4015 }
4014
4016
4015 .group_members .group_member{
4017 .group_members .group_member{
4016 height: 30px;
4018 height: 30px;
4017 padding:0px 0px 0px 0px;
4019 padding:0px 0px 0px 0px;
4018 }
4020 }
4019
4021
4020 .reviewers_member{
4022 .reviewers_member{
4021 height: 15px;
4023 height: 15px;
4022 padding:0px 0px 0px 10px;
4024 padding:0px 0px 0px 10px;
4023 }
4025 }
4024
4026
4025 .emails_wrap{
4027 .emails_wrap{
4026 padding: 0px 20px;
4028 padding: 0px 20px;
4027 }
4029 }
4028
4030
4029 .emails_wrap .email_entry{
4031 .emails_wrap .email_entry{
4030 height: 30px;
4032 height: 30px;
4031 padding:0px 0px 0px 10px;
4033 padding:0px 0px 0px 10px;
4032 }
4034 }
4033 .emails_wrap .email_entry .email{
4035 .emails_wrap .email_entry .email{
4034 float: left
4036 float: left
4035 }
4037 }
4036 .emails_wrap .email_entry .email_action{
4038 .emails_wrap .email_entry .email_action{
4037 float: left
4039 float: left
4038 }
4040 }
4039
4041
4040 .ips_wrap{
4042 .ips_wrap{
4041 padding: 0px 20px;
4043 padding: 0px 20px;
4042 }
4044 }
4043
4045
4044 .ips_wrap .ip_entry{
4046 .ips_wrap .ip_entry{
4045 height: 30px;
4047 height: 30px;
4046 padding:0px 0px 0px 10px;
4048 padding:0px 0px 0px 10px;
4047 }
4049 }
4048 .ips_wrap .ip_entry .ip{
4050 .ips_wrap .ip_entry .ip{
4049 float: left
4051 float: left
4050 }
4052 }
4051 .ips_wrap .ip_entry .ip_action{
4053 .ips_wrap .ip_entry .ip_action{
4052 float: left
4054 float: left
4053 }
4055 }
4054
4056
4055
4057
4056 /*README STYLE*/
4058 /*README STYLE*/
4057
4059
4058 div.readme {
4060 div.readme {
4059 padding:0px;
4061 padding:0px;
4060 }
4062 }
4061
4063
4062 div.readme h2 {
4064 div.readme h2 {
4063 font-weight: normal;
4065 font-weight: normal;
4064 }
4066 }
4065
4067
4066 div.readme .readme_box {
4068 div.readme .readme_box {
4067 background-color: #fafafa;
4069 background-color: #fafafa;
4068 }
4070 }
4069
4071
4070 div.readme .readme_box {
4072 div.readme .readme_box {
4071 clear:both;
4073 clear:both;
4072 overflow:hidden;
4074 overflow:hidden;
4073 margin:0;
4075 margin:0;
4074 padding:0 20px 10px;
4076 padding:0 20px 10px;
4075 }
4077 }
4076
4078
4077 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 {
4079 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 {
4078 border-bottom: 0 !important;
4080 border-bottom: 0 !important;
4079 margin: 0 !important;
4081 margin: 0 !important;
4080 padding: 0 !important;
4082 padding: 0 !important;
4081 line-height: 1.5em !important;
4083 line-height: 1.5em !important;
4082 }
4084 }
4083
4085
4084
4086
4085 div.readme .readme_box h1:first-child {
4087 div.readme .readme_box h1:first-child {
4086 padding-top: .25em !important;
4088 padding-top: .25em !important;
4087 }
4089 }
4088
4090
4089 div.readme .readme_box h2, div.readme .readme_box h3 {
4091 div.readme .readme_box h2, div.readme .readme_box h3 {
4090 margin: 1em 0 !important;
4092 margin: 1em 0 !important;
4091 }
4093 }
4092
4094
4093 div.readme .readme_box h2 {
4095 div.readme .readme_box h2 {
4094 margin-top: 1.5em !important;
4096 margin-top: 1.5em !important;
4095 border-top: 4px solid #e0e0e0 !important;
4097 border-top: 4px solid #e0e0e0 !important;
4096 padding-top: .5em !important;
4098 padding-top: .5em !important;
4097 }
4099 }
4098
4100
4099 div.readme .readme_box p {
4101 div.readme .readme_box p {
4100 color: black !important;
4102 color: black !important;
4101 margin: 1em 0 !important;
4103 margin: 1em 0 !important;
4102 line-height: 1.5em !important;
4104 line-height: 1.5em !important;
4103 }
4105 }
4104
4106
4105 div.readme .readme_box ul {
4107 div.readme .readme_box ul {
4106 list-style: disc !important;
4108 list-style: disc !important;
4107 margin: 1em 0 1em 2em !important;
4109 margin: 1em 0 1em 2em !important;
4108 }
4110 }
4109
4111
4110 div.readme .readme_box ol {
4112 div.readme .readme_box ol {
4111 list-style: decimal;
4113 list-style: decimal;
4112 margin: 1em 0 1em 2em !important;
4114 margin: 1em 0 1em 2em !important;
4113 }
4115 }
4114
4116
4115 div.readme .readme_box pre, code {
4117 div.readme .readme_box pre, code {
4116 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4118 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4117 }
4119 }
4118
4120
4119 div.readme .readme_box code {
4121 div.readme .readme_box code {
4120 font-size: 12px !important;
4122 font-size: 12px !important;
4121 background-color: ghostWhite !important;
4123 background-color: ghostWhite !important;
4122 color: #444 !important;
4124 color: #444 !important;
4123 padding: 0 .2em !important;
4125 padding: 0 .2em !important;
4124 border: 1px solid #dedede !important;
4126 border: 1px solid #dedede !important;
4125 }
4127 }
4126
4128
4127 div.readme .readme_box pre code {
4129 div.readme .readme_box pre code {
4128 padding: 0 !important;
4130 padding: 0 !important;
4129 font-size: 12px !important;
4131 font-size: 12px !important;
4130 background-color: #eee !important;
4132 background-color: #eee !important;
4131 border: none !important;
4133 border: none !important;
4132 }
4134 }
4133
4135
4134 div.readme .readme_box pre {
4136 div.readme .readme_box pre {
4135 margin: 1em 0;
4137 margin: 1em 0;
4136 font-size: 12px;
4138 font-size: 12px;
4137 background-color: #eee;
4139 background-color: #eee;
4138 border: 1px solid #ddd;
4140 border: 1px solid #ddd;
4139 padding: 5px;
4141 padding: 5px;
4140 color: #444;
4142 color: #444;
4141 overflow: auto;
4143 overflow: auto;
4142 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4144 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4143 -webkit-border-radius: 3px;
4145 -webkit-border-radius: 3px;
4144 -moz-border-radius: 3px;
4146 -moz-border-radius: 3px;
4145 border-radius: 3px;
4147 border-radius: 3px;
4146 }
4148 }
4147
4149
4148 div.readme .readme_box table {
4150 div.readme .readme_box table {
4149 display: table;
4151 display: table;
4150 border-collapse: separate;
4152 border-collapse: separate;
4151 border-spacing: 2px;
4153 border-spacing: 2px;
4152 border-color: gray;
4154 border-color: gray;
4153 width: auto !important;
4155 width: auto !important;
4154 }
4156 }
4155
4157
4156
4158
4157 /** RST STYLE **/
4159 /** RST STYLE **/
4158
4160
4159
4161
4160 div.rst-block {
4162 div.rst-block {
4161 padding:0px;
4163 padding:0px;
4162 }
4164 }
4163
4165
4164 div.rst-block h2 {
4166 div.rst-block h2 {
4165 font-weight: normal;
4167 font-weight: normal;
4166 }
4168 }
4167
4169
4168 div.rst-block {
4170 div.rst-block {
4169 background-color: #fafafa;
4171 background-color: #fafafa;
4170 }
4172 }
4171
4173
4172 div.rst-block {
4174 div.rst-block {
4173 clear:both;
4175 clear:both;
4174 overflow:hidden;
4176 overflow:hidden;
4175 margin:0;
4177 margin:0;
4176 padding:0 20px 10px;
4178 padding:0 20px 10px;
4177 }
4179 }
4178
4180
4179 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4181 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4180 border-bottom: 0 !important;
4182 border-bottom: 0 !important;
4181 margin: 0 !important;
4183 margin: 0 !important;
4182 padding: 0 !important;
4184 padding: 0 !important;
4183 line-height: 1.5em !important;
4185 line-height: 1.5em !important;
4184 }
4186 }
4185
4187
4186
4188
4187 div.rst-block h1:first-child {
4189 div.rst-block h1:first-child {
4188 padding-top: .25em !important;
4190 padding-top: .25em !important;
4189 }
4191 }
4190
4192
4191 div.rst-block h2, div.rst-block h3 {
4193 div.rst-block h2, div.rst-block h3 {
4192 margin: 1em 0 !important;
4194 margin: 1em 0 !important;
4193 }
4195 }
4194
4196
4195 div.rst-block h2 {
4197 div.rst-block h2 {
4196 margin-top: 1.5em !important;
4198 margin-top: 1.5em !important;
4197 border-top: 4px solid #e0e0e0 !important;
4199 border-top: 4px solid #e0e0e0 !important;
4198 padding-top: .5em !important;
4200 padding-top: .5em !important;
4199 }
4201 }
4200
4202
4201 div.rst-block p {
4203 div.rst-block p {
4202 color: black !important;
4204 color: black !important;
4203 margin: 1em 0 !important;
4205 margin: 1em 0 !important;
4204 line-height: 1.5em !important;
4206 line-height: 1.5em !important;
4205 }
4207 }
4206
4208
4207 div.rst-block ul {
4209 div.rst-block ul {
4208 list-style: disc !important;
4210 list-style: disc !important;
4209 margin: 1em 0 1em 2em !important;
4211 margin: 1em 0 1em 2em !important;
4210 }
4212 }
4211
4213
4212 div.rst-block ol {
4214 div.rst-block ol {
4213 list-style: decimal;
4215 list-style: decimal;
4214 margin: 1em 0 1em 2em !important;
4216 margin: 1em 0 1em 2em !important;
4215 }
4217 }
4216
4218
4217 div.rst-block pre, code {
4219 div.rst-block pre, code {
4218 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4220 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4219 }
4221 }
4220
4222
4221 div.rst-block code {
4223 div.rst-block code {
4222 font-size: 12px !important;
4224 font-size: 12px !important;
4223 background-color: ghostWhite !important;
4225 background-color: ghostWhite !important;
4224 color: #444 !important;
4226 color: #444 !important;
4225 padding: 0 .2em !important;
4227 padding: 0 .2em !important;
4226 border: 1px solid #dedede !important;
4228 border: 1px solid #dedede !important;
4227 }
4229 }
4228
4230
4229 div.rst-block pre code {
4231 div.rst-block pre code {
4230 padding: 0 !important;
4232 padding: 0 !important;
4231 font-size: 12px !important;
4233 font-size: 12px !important;
4232 background-color: #eee !important;
4234 background-color: #eee !important;
4233 border: none !important;
4235 border: none !important;
4234 }
4236 }
4235
4237
4236 div.rst-block pre {
4238 div.rst-block pre {
4237 margin: 1em 0;
4239 margin: 1em 0;
4238 font-size: 12px;
4240 font-size: 12px;
4239 background-color: #eee;
4241 background-color: #eee;
4240 border: 1px solid #ddd;
4242 border: 1px solid #ddd;
4241 padding: 5px;
4243 padding: 5px;
4242 color: #444;
4244 color: #444;
4243 overflow: auto;
4245 overflow: auto;
4244 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4246 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4245 -webkit-border-radius: 3px;
4247 -webkit-border-radius: 3px;
4246 -moz-border-radius: 3px;
4248 -moz-border-radius: 3px;
4247 border-radius: 3px;
4249 border-radius: 3px;
4248 }
4250 }
4249
4251
4250
4252
4251 /** comment main **/
4253 /** comment main **/
4252 .comments {
4254 .comments {
4253 padding:10px 20px;
4255 padding:10px 20px;
4254 }
4256 }
4255
4257
4256 .comments .comment {
4258 .comments .comment {
4257 border: 1px solid #ddd;
4259 border: 1px solid #ddd;
4258 margin-top: 10px;
4260 margin-top: 10px;
4259 -webkit-border-radius: 4px;
4261 -webkit-border-radius: 4px;
4260 -moz-border-radius: 4px;
4262 -moz-border-radius: 4px;
4261 border-radius: 4px;
4263 border-radius: 4px;
4262 }
4264 }
4263
4265
4264 .comments .comment .meta {
4266 .comments .comment .meta {
4265 background: #f8f8f8;
4267 background: #f8f8f8;
4266 padding: 4px;
4268 padding: 4px;
4267 border-bottom: 1px solid #ddd;
4269 border-bottom: 1px solid #ddd;
4268 height: 18px;
4270 height: 18px;
4269 }
4271 }
4270
4272
4271 .comments .comment .meta img {
4273 .comments .comment .meta img {
4272 vertical-align: middle;
4274 vertical-align: middle;
4273 }
4275 }
4274
4276
4275 .comments .comment .meta .user {
4277 .comments .comment .meta .user {
4276 font-weight: bold;
4278 font-weight: bold;
4277 float: left;
4279 float: left;
4278 padding: 4px 2px 2px 2px;
4280 padding: 4px 2px 2px 2px;
4279 }
4281 }
4280
4282
4281 .comments .comment .meta .date {
4283 .comments .comment .meta .date {
4282 float: left;
4284 float: left;
4283 padding:4px 4px 0px 4px;
4285 padding:4px 4px 0px 4px;
4284 }
4286 }
4285
4287
4286 .comments .comment .text {
4288 .comments .comment .text {
4287 background-color: #FAFAFA;
4289 background-color: #FAFAFA;
4288 }
4290 }
4289 .comment .text div.rst-block p {
4291 .comment .text div.rst-block p {
4290 margin: 0.5em 0px !important;
4292 margin: 0.5em 0px !important;
4291 }
4293 }
4292
4294
4293 .comments .comments-number{
4295 .comments .comments-number{
4294 padding:0px 0px 10px 0px;
4296 padding:0px 0px 10px 0px;
4295 font-weight: bold;
4297 font-weight: bold;
4296 color: #666;
4298 color: #666;
4297 font-size: 16px;
4299 font-size: 16px;
4298 }
4300 }
4299
4301
4300 /** comment form **/
4302 /** comment form **/
4301
4303
4302 .status-block{
4304 .status-block{
4303 height:80px;
4305 height:80px;
4304 clear:both
4306 clear:both
4305 }
4307 }
4306
4308
4307 .comment-form .clearfix{
4309 .comment-form .clearfix{
4308 background: #EEE;
4310 background: #EEE;
4309 -webkit-border-radius: 4px;
4311 -webkit-border-radius: 4px;
4310 -moz-border-radius: 4px;
4312 -moz-border-radius: 4px;
4311 border-radius: 4px;
4313 border-radius: 4px;
4312 padding: 10px;
4314 padding: 10px;
4313 }
4315 }
4314
4316
4315 div.comment-form {
4317 div.comment-form {
4316 margin-top: 20px;
4318 margin-top: 20px;
4317 }
4319 }
4318
4320
4319 .comment-form strong {
4321 .comment-form strong {
4320 display: block;
4322 display: block;
4321 margin-bottom: 15px;
4323 margin-bottom: 15px;
4322 }
4324 }
4323
4325
4324 .comment-form textarea {
4326 .comment-form textarea {
4325 width: 100%;
4327 width: 100%;
4326 height: 100px;
4328 height: 100px;
4327 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4329 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4328 }
4330 }
4329
4331
4330 form.comment-form {
4332 form.comment-form {
4331 margin-top: 10px;
4333 margin-top: 10px;
4332 margin-left: 10px;
4334 margin-left: 10px;
4333 }
4335 }
4334
4336
4335 .comment-form-submit {
4337 .comment-form-submit {
4336 margin-top: 5px;
4338 margin-top: 5px;
4337 margin-left: 525px;
4339 margin-left: 525px;
4338 }
4340 }
4339
4341
4340 .file-comments {
4342 .file-comments {
4341 display: none;
4343 display: none;
4342 }
4344 }
4343
4345
4344 .comment-form .comment {
4346 .comment-form .comment {
4345 margin-left: 10px;
4347 margin-left: 10px;
4346 }
4348 }
4347
4349
4348 .comment-form .comment-help{
4350 .comment-form .comment-help{
4349 padding: 0px 0px 5px 0px;
4351 padding: 0px 0px 5px 0px;
4350 color: #666;
4352 color: #666;
4351 }
4353 }
4352
4354
4353 .comment-form .comment-button{
4355 .comment-form .comment-button{
4354 padding-top:5px;
4356 padding-top:5px;
4355 }
4357 }
4356
4358
4357 .add-another-button {
4359 .add-another-button {
4358 margin-left: 10px;
4360 margin-left: 10px;
4359 margin-top: 10px;
4361 margin-top: 10px;
4360 margin-bottom: 10px;
4362 margin-bottom: 10px;
4361 }
4363 }
4362
4364
4363 .comment .buttons {
4365 .comment .buttons {
4364 float: right;
4366 float: right;
4365 padding:2px 2px 0px 0px;
4367 padding:2px 2px 0px 0px;
4366 }
4368 }
4367
4369
4368
4370
4369 .show-inline-comments{
4371 .show-inline-comments{
4370 position: relative;
4372 position: relative;
4371 top:1px
4373 top:1px
4372 }
4374 }
4373
4375
4374 /** comment inline form **/
4376 /** comment inline form **/
4375 .comment-inline-form .overlay{
4377 .comment-inline-form .overlay{
4376 display: none;
4378 display: none;
4377 }
4379 }
4378 .comment-inline-form .overlay.submitting{
4380 .comment-inline-form .overlay.submitting{
4379 display:block;
4381 display:block;
4380 background: none repeat scroll 0 0 white;
4382 background: none repeat scroll 0 0 white;
4381 font-size: 16px;
4383 font-size: 16px;
4382 opacity: 0.5;
4384 opacity: 0.5;
4383 position: absolute;
4385 position: absolute;
4384 text-align: center;
4386 text-align: center;
4385 vertical-align: top;
4387 vertical-align: top;
4386
4388
4387 }
4389 }
4388 .comment-inline-form .overlay.submitting .overlay-text{
4390 .comment-inline-form .overlay.submitting .overlay-text{
4389 width:100%;
4391 width:100%;
4390 margin-top:5%;
4392 margin-top:5%;
4391 }
4393 }
4392
4394
4393 .comment-inline-form .clearfix{
4395 .comment-inline-form .clearfix{
4394 background: #EEE;
4396 background: #EEE;
4395 -webkit-border-radius: 4px;
4397 -webkit-border-radius: 4px;
4396 -moz-border-radius: 4px;
4398 -moz-border-radius: 4px;
4397 border-radius: 4px;
4399 border-radius: 4px;
4398 padding: 5px;
4400 padding: 5px;
4399 }
4401 }
4400
4402
4401 div.comment-inline-form {
4403 div.comment-inline-form {
4402 padding:4px 0px 6px 0px;
4404 padding:4px 0px 6px 0px;
4403 }
4405 }
4404
4406
4405
4407
4406 tr.hl-comment{
4408 tr.hl-comment{
4407 /*
4409 /*
4408 background-color: #FFFFCC !important;
4410 background-color: #FFFFCC !important;
4409 */
4411 */
4410 }
4412 }
4411
4413
4412 /*
4414 /*
4413 tr.hl-comment pre {
4415 tr.hl-comment pre {
4414 border-top: 2px solid #FFEE33;
4416 border-top: 2px solid #FFEE33;
4415 border-left: 2px solid #FFEE33;
4417 border-left: 2px solid #FFEE33;
4416 border-right: 2px solid #FFEE33;
4418 border-right: 2px solid #FFEE33;
4417 }
4419 }
4418 */
4420 */
4419
4421
4420 .comment-inline-form strong {
4422 .comment-inline-form strong {
4421 display: block;
4423 display: block;
4422 margin-bottom: 15px;
4424 margin-bottom: 15px;
4423 }
4425 }
4424
4426
4425 .comment-inline-form textarea {
4427 .comment-inline-form textarea {
4426 width: 100%;
4428 width: 100%;
4427 height: 100px;
4429 height: 100px;
4428 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4430 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4429 }
4431 }
4430
4432
4431 form.comment-inline-form {
4433 form.comment-inline-form {
4432 margin-top: 10px;
4434 margin-top: 10px;
4433 margin-left: 10px;
4435 margin-left: 10px;
4434 }
4436 }
4435
4437
4436 .comment-inline-form-submit {
4438 .comment-inline-form-submit {
4437 margin-top: 5px;
4439 margin-top: 5px;
4438 margin-left: 525px;
4440 margin-left: 525px;
4439 }
4441 }
4440
4442
4441 .file-comments {
4443 .file-comments {
4442 display: none;
4444 display: none;
4443 }
4445 }
4444
4446
4445 .comment-inline-form .comment {
4447 .comment-inline-form .comment {
4446 margin-left: 10px;
4448 margin-left: 10px;
4447 }
4449 }
4448
4450
4449 .comment-inline-form .comment-help{
4451 .comment-inline-form .comment-help{
4450 padding: 0px 0px 2px 0px;
4452 padding: 0px 0px 2px 0px;
4451 color: #666666;
4453 color: #666666;
4452 font-size: 10px;
4454 font-size: 10px;
4453 }
4455 }
4454
4456
4455 .comment-inline-form .comment-button{
4457 .comment-inline-form .comment-button{
4456 padding-top:5px;
4458 padding-top:5px;
4457 }
4459 }
4458
4460
4459 /** comment inline **/
4461 /** comment inline **/
4460 .inline-comments {
4462 .inline-comments {
4461 padding:10px 20px;
4463 padding:10px 20px;
4462 }
4464 }
4463
4465
4464 .inline-comments div.rst-block {
4466 .inline-comments div.rst-block {
4465 clear:both;
4467 clear:both;
4466 overflow:hidden;
4468 overflow:hidden;
4467 margin:0;
4469 margin:0;
4468 padding:0 20px 0px;
4470 padding:0 20px 0px;
4469 }
4471 }
4470 .inline-comments .comment {
4472 .inline-comments .comment {
4471 border: 1px solid #ddd;
4473 border: 1px solid #ddd;
4472 -webkit-border-radius: 4px;
4474 -webkit-border-radius: 4px;
4473 -moz-border-radius: 4px;
4475 -moz-border-radius: 4px;
4474 border-radius: 4px;
4476 border-radius: 4px;
4475 margin: 3px 3px 5px 5px;
4477 margin: 3px 3px 5px 5px;
4476 background-color: #FAFAFA;
4478 background-color: #FAFAFA;
4477 }
4479 }
4478 .inline-comments .add-comment {
4480 .inline-comments .add-comment {
4479 padding: 2px 4px 8px 5px;
4481 padding: 2px 4px 8px 5px;
4480 }
4482 }
4481
4483
4482 .inline-comments .comment-wrapp{
4484 .inline-comments .comment-wrapp{
4483 padding:1px;
4485 padding:1px;
4484 }
4486 }
4485 .inline-comments .comment .meta {
4487 .inline-comments .comment .meta {
4486 background: #f8f8f8;
4488 background: #f8f8f8;
4487 padding: 4px;
4489 padding: 4px;
4488 border-bottom: 1px solid #ddd;
4490 border-bottom: 1px solid #ddd;
4489 height: 20px;
4491 height: 20px;
4490 }
4492 }
4491
4493
4492 .inline-comments .comment .meta img {
4494 .inline-comments .comment .meta img {
4493 vertical-align: middle;
4495 vertical-align: middle;
4494 }
4496 }
4495
4497
4496 .inline-comments .comment .meta .user {
4498 .inline-comments .comment .meta .user {
4497 font-weight: bold;
4499 font-weight: bold;
4498 float:left;
4500 float:left;
4499 padding: 3px;
4501 padding: 3px;
4500 }
4502 }
4501
4503
4502 .inline-comments .comment .meta .date {
4504 .inline-comments .comment .meta .date {
4503 float:left;
4505 float:left;
4504 padding: 3px;
4506 padding: 3px;
4505 }
4507 }
4506
4508
4507 .inline-comments .comment .text {
4509 .inline-comments .comment .text {
4508 background-color: #FAFAFA;
4510 background-color: #FAFAFA;
4509 }
4511 }
4510
4512
4511 .inline-comments .comments-number{
4513 .inline-comments .comments-number{
4512 padding:0px 0px 10px 0px;
4514 padding:0px 0px 10px 0px;
4513 font-weight: bold;
4515 font-weight: bold;
4514 color: #666;
4516 color: #666;
4515 font-size: 16px;
4517 font-size: 16px;
4516 }
4518 }
4517 .inline-comments-button .add-comment{
4519 .inline-comments-button .add-comment{
4518 margin:2px 0px 8px 5px !important
4520 margin:2px 0px 8px 5px !important
4519 }
4521 }
4520
4522
4521
4523
4522 .notification-paginator{
4524 .notification-paginator{
4523 padding: 0px 0px 4px 16px;
4525 padding: 0px 0px 4px 16px;
4524 float: left;
4526 float: left;
4525 }
4527 }
4526
4528
4527 .notifications{
4529 .notifications{
4528 border-radius: 4px 4px 4px 4px;
4530 border-radius: 4px 4px 4px 4px;
4529 -webkit-border-radius: 4px;
4531 -webkit-border-radius: 4px;
4530 -moz-border-radius: 4px;
4532 -moz-border-radius: 4px;
4531 float: right;
4533 float: right;
4532 margin: 20px 0px 0px 0px;
4534 margin: 20px 0px 0px 0px;
4533 position: absolute;
4535 position: absolute;
4534 text-align: center;
4536 text-align: center;
4535 width: 26px;
4537 width: 26px;
4536 z-index: 1000;
4538 z-index: 1000;
4537 }
4539 }
4538 .notifications a{
4540 .notifications a{
4539 color:#888 !important;
4541 color:#888 !important;
4540 display: block;
4542 display: block;
4541 font-size: 10px;
4543 font-size: 10px;
4542 background-color: #DEDEDE !important;
4544 background-color: #DEDEDE !important;
4543 border-radius: 2px !important;
4545 border-radius: 2px !important;
4544 -webkit-border-radius: 2px !important;
4546 -webkit-border-radius: 2px !important;
4545 -moz-border-radius: 2px !important;
4547 -moz-border-radius: 2px !important;
4546 }
4548 }
4547 .notifications a:hover{
4549 .notifications a:hover{
4548 text-decoration: none !important;
4550 text-decoration: none !important;
4549 background-color: #EEEFFF !important;
4551 background-color: #EEEFFF !important;
4550 }
4552 }
4551 .notification-header{
4553 .notification-header{
4552 padding-top:6px;
4554 padding-top:6px;
4553 }
4555 }
4554 .notification-header .desc{
4556 .notification-header .desc{
4555 font-size: 16px;
4557 font-size: 16px;
4556 height: 24px;
4558 height: 24px;
4557 float: left
4559 float: left
4558 }
4560 }
4559 .notification-list .container.unread{
4561 .notification-list .container.unread{
4560 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4562 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4561 }
4563 }
4562 .notification-header .gravatar{
4564 .notification-header .gravatar{
4563 background: none repeat scroll 0 0 transparent;
4565 background: none repeat scroll 0 0 transparent;
4564 padding: 0px 0px 0px 8px;
4566 padding: 0px 0px 0px 8px;
4565 }
4567 }
4566 .notification-list .container .notification-header .desc{
4568 .notification-list .container .notification-header .desc{
4567 font-weight: bold;
4569 font-weight: bold;
4568 font-size: 17px;
4570 font-size: 17px;
4569 }
4571 }
4570 .notification-table{
4572 .notification-table{
4571 border: 1px solid #ccc;
4573 border: 1px solid #ccc;
4572 -webkit-border-radius: 6px 6px 6px 6px;
4574 -webkit-border-radius: 6px 6px 6px 6px;
4573 -moz-border-radius: 6px 6px 6px 6px;
4575 -moz-border-radius: 6px 6px 6px 6px;
4574 border-radius: 6px 6px 6px 6px;
4576 border-radius: 6px 6px 6px 6px;
4575 clear: both;
4577 clear: both;
4576 margin: 0px 20px 0px 20px;
4578 margin: 0px 20px 0px 20px;
4577 }
4579 }
4578 .notification-header .delete-notifications{
4580 .notification-header .delete-notifications{
4579 float: right;
4581 float: right;
4580 padding-top: 8px;
4582 padding-top: 8px;
4581 cursor: pointer;
4583 cursor: pointer;
4582 }
4584 }
4583 .notification-header .read-notifications{
4585 .notification-header .read-notifications{
4584 float: right;
4586 float: right;
4585 padding-top: 8px;
4587 padding-top: 8px;
4586 cursor: pointer;
4588 cursor: pointer;
4587 }
4589 }
4588 .notification-subject{
4590 .notification-subject{
4589 clear:both;
4591 clear:both;
4590 border-bottom: 1px solid #eee;
4592 border-bottom: 1px solid #eee;
4591 padding:5px 0px 5px 38px;
4593 padding:5px 0px 5px 38px;
4592 }
4594 }
4593
4595
4594 .notification-body{
4596 .notification-body{
4595 clear:both;
4597 clear:both;
4596 margin: 34px 2px 2px 8px
4598 margin: 34px 2px 2px 8px
4597 }
4599 }
4598
4600
4599 /****
4601 /****
4600 PULL REQUESTS
4602 PULL REQUESTS
4601 *****/
4603 *****/
4602 .pullrequests_section_head {
4604 .pullrequests_section_head {
4603 padding:10px 10px 10px 0px;
4605 padding:10px 10px 10px 0px;
4604 font-size:16px;
4606 font-size:16px;
4605 font-weight: bold;
4607 font-weight: bold;
4606 }
4608 }
4607
4609
4608 /****
4610 /****
4609 PERMS
4611 PERMS
4610 *****/
4612 *****/
4611 #perms .perms_section_head {
4613 #perms .perms_section_head {
4612 padding:10px 10px 10px 0px;
4614 padding:10px 10px 10px 0px;
4613 font-size:16px;
4615 font-size:16px;
4614 font-weight: bold;
4616 font-weight: bold;
4615 }
4617 }
4616
4618
4617 #perms .perm_tag{
4619 #perms .perm_tag{
4618 padding: 1px 3px 1px 3px;
4620 padding: 1px 3px 1px 3px;
4619 font-size: 10px;
4621 font-size: 10px;
4620 font-weight: bold;
4622 font-weight: bold;
4621 text-transform: uppercase;
4623 text-transform: uppercase;
4622 white-space: nowrap;
4624 white-space: nowrap;
4623 -webkit-border-radius: 3px;
4625 -webkit-border-radius: 3px;
4624 -moz-border-radius: 3px;
4626 -moz-border-radius: 3px;
4625 border-radius: 3px;
4627 border-radius: 3px;
4626 }
4628 }
4627
4629
4628 #perms .perm_tag.admin{
4630 #perms .perm_tag.admin{
4629 background-color: #B94A48;
4631 background-color: #B94A48;
4630 color: #ffffff;
4632 color: #ffffff;
4631 }
4633 }
4632
4634
4633 #perms .perm_tag.write{
4635 #perms .perm_tag.write{
4634 background-color: #B94A48;
4636 background-color: #B94A48;
4635 color: #ffffff;
4637 color: #ffffff;
4636 }
4638 }
4637
4639
4638 #perms .perm_tag.read{
4640 #perms .perm_tag.read{
4639 background-color: #468847;
4641 background-color: #468847;
4640 color: #ffffff;
4642 color: #ffffff;
4641 }
4643 }
4642
4644
4643 #perms .perm_tag.none{
4645 #perms .perm_tag.none{
4644 background-color: #bfbfbf;
4646 background-color: #bfbfbf;
4645 color: #ffffff;
4647 color: #ffffff;
4646 }
4648 }
4647
4649
4648 .perm-gravatar{
4650 .perm-gravatar{
4649 vertical-align:middle;
4651 vertical-align:middle;
4650 padding:2px;
4652 padding:2px;
4651 }
4653 }
4652 .perm-gravatar-ac{
4654 .perm-gravatar-ac{
4653 vertical-align:middle;
4655 vertical-align:middle;
4654 padding:2px;
4656 padding:2px;
4655 width: 14px;
4657 width: 14px;
4656 height: 14px;
4658 height: 14px;
4657 }
4659 }
4658
4660
4659 /*****************************************************************************
4661 /*****************************************************************************
4660 DIFFS CSS
4662 DIFFS CSS
4661 ******************************************************************************/
4663 ******************************************************************************/
4662
4664
4663 div.diffblock {
4665 div.diffblock {
4664 overflow: auto;
4666 overflow: auto;
4665 padding: 0px;
4667 padding: 0px;
4666 border: 1px solid #ccc;
4668 border: 1px solid #ccc;
4667 background: #f8f8f8;
4669 background: #f8f8f8;
4668 font-size: 100%;
4670 font-size: 100%;
4669 line-height: 100%;
4671 line-height: 100%;
4670 /* new */
4672 /* new */
4671 line-height: 125%;
4673 line-height: 125%;
4672 -webkit-border-radius: 6px 6px 0px 0px;
4674 -webkit-border-radius: 6px 6px 0px 0px;
4673 -moz-border-radius: 6px 6px 0px 0px;
4675 -moz-border-radius: 6px 6px 0px 0px;
4674 border-radius: 6px 6px 0px 0px;
4676 border-radius: 6px 6px 0px 0px;
4675 }
4677 }
4676 div.diffblock.margined{
4678 div.diffblock.margined{
4677 margin: 0px 20px 0px 20px;
4679 margin: 0px 20px 0px 20px;
4678 }
4680 }
4679 div.diffblock .code-header{
4681 div.diffblock .code-header{
4680 border-bottom: 1px solid #CCCCCC;
4682 border-bottom: 1px solid #CCCCCC;
4681 background: #EEEEEE;
4683 background: #EEEEEE;
4682 padding:10px 0 10px 0;
4684 padding:10px 0 10px 0;
4683 height: 14px;
4685 height: 14px;
4684 }
4686 }
4685
4687
4686 div.diffblock .code-header.banner{
4688 div.diffblock .code-header.banner{
4687 border-bottom: 1px solid #CCCCCC;
4689 border-bottom: 1px solid #CCCCCC;
4688 background: #EEEEEE;
4690 background: #EEEEEE;
4689 height: 14px;
4691 height: 14px;
4690 margin: 0px 95px 0px 95px;
4692 margin: 0px 95px 0px 95px;
4691 padding: 3px 3px 11px 3px;
4693 padding: 3px 3px 11px 3px;
4692 }
4694 }
4693
4695
4694 div.diffblock .code-header.cv{
4696 div.diffblock .code-header.cv{
4695 height: 34px;
4697 height: 34px;
4696 }
4698 }
4697 div.diffblock .code-header-title{
4699 div.diffblock .code-header-title{
4698 padding: 0px 0px 10px 5px !important;
4700 padding: 0px 0px 10px 5px !important;
4699 margin: 0 !important;
4701 margin: 0 !important;
4700 }
4702 }
4701 div.diffblock .code-header .hash{
4703 div.diffblock .code-header .hash{
4702 float: left;
4704 float: left;
4703 padding: 2px 0 0 2px;
4705 padding: 2px 0 0 2px;
4704 }
4706 }
4705 div.diffblock .code-header .date{
4707 div.diffblock .code-header .date{
4706 float:left;
4708 float:left;
4707 text-transform: uppercase;
4709 text-transform: uppercase;
4708 padding: 2px 0px 0px 2px;
4710 padding: 2px 0px 0px 2px;
4709 }
4711 }
4710 div.diffblock .code-header div{
4712 div.diffblock .code-header div{
4711 margin-left:4px;
4713 margin-left:4px;
4712 font-weight: bold;
4714 font-weight: bold;
4713 font-size: 14px;
4715 font-size: 14px;
4714 }
4716 }
4715
4717
4716 div.diffblock .parents {
4718 div.diffblock .parents {
4717 float: left;
4719 float: left;
4718 height: 26px;
4720 height: 26px;
4719 width:100px;
4721 width:100px;
4720 font-size: 10px;
4722 font-size: 10px;
4721 font-weight: 400;
4723 font-weight: 400;
4722 vertical-align: middle;
4724 vertical-align: middle;
4723 padding: 0px 2px 2px 2px;
4725 padding: 0px 2px 2px 2px;
4724 background-color:#eeeeee;
4726 background-color:#eeeeee;
4725 border-bottom: 1px solid #CCCCCC;
4727 border-bottom: 1px solid #CCCCCC;
4726 }
4728 }
4727
4729
4728 div.diffblock .children {
4730 div.diffblock .children {
4729 float: right;
4731 float: right;
4730 height: 26px;
4732 height: 26px;
4731 width:100px;
4733 width:100px;
4732 font-size: 10px;
4734 font-size: 10px;
4733 font-weight: 400;
4735 font-weight: 400;
4734 vertical-align: middle;
4736 vertical-align: middle;
4735 text-align: right;
4737 text-align: right;
4736 padding: 0px 2px 2px 2px;
4738 padding: 0px 2px 2px 2px;
4737 background-color:#eeeeee;
4739 background-color:#eeeeee;
4738 border-bottom: 1px solid #CCCCCC;
4740 border-bottom: 1px solid #CCCCCC;
4739 }
4741 }
4740
4742
4741 div.diffblock .code-body{
4743 div.diffblock .code-body{
4742 background: #FFFFFF;
4744 background: #FFFFFF;
4743 }
4745 }
4744 div.diffblock pre.raw{
4746 div.diffblock pre.raw{
4745 background: #FFFFFF;
4747 background: #FFFFFF;
4746 color:#000000;
4748 color:#000000;
4747 }
4749 }
4748 table.code-difftable{
4750 table.code-difftable{
4749 border-collapse: collapse;
4751 border-collapse: collapse;
4750 width: 99%;
4752 width: 99%;
4751 }
4753 }
4752 table.code-difftable td {
4754 table.code-difftable td {
4753 padding: 0 !important;
4755 padding: 0 !important;
4754 background: none !important;
4756 background: none !important;
4755 border:0 !important;
4757 border:0 !important;
4756 vertical-align: none !important;
4758 vertical-align: none !important;
4757 }
4759 }
4758 table.code-difftable .context{
4760 table.code-difftable .context{
4759 background:none repeat scroll 0 0 #DDE7EF;
4761 background:none repeat scroll 0 0 #DDE7EF;
4760 }
4762 }
4761 table.code-difftable .add{
4763 table.code-difftable .add{
4762 background:none repeat scroll 0 0 #DDFFDD;
4764 background:none repeat scroll 0 0 #DDFFDD;
4763 }
4765 }
4764 table.code-difftable .add ins{
4766 table.code-difftable .add ins{
4765 background:none repeat scroll 0 0 #AAFFAA;
4767 background:none repeat scroll 0 0 #AAFFAA;
4766 text-decoration:none;
4768 text-decoration:none;
4767 }
4769 }
4768 table.code-difftable .del{
4770 table.code-difftable .del{
4769 background:none repeat scroll 0 0 #FFDDDD;
4771 background:none repeat scroll 0 0 #FFDDDD;
4770 }
4772 }
4771 table.code-difftable .del del{
4773 table.code-difftable .del del{
4772 background:none repeat scroll 0 0 #FFAAAA;
4774 background:none repeat scroll 0 0 #FFAAAA;
4773 text-decoration:none;
4775 text-decoration:none;
4774 }
4776 }
4775
4777
4776 /** LINE NUMBERS **/
4778 /** LINE NUMBERS **/
4777 table.code-difftable .lineno{
4779 table.code-difftable .lineno{
4778
4780
4779 padding-left:2px;
4781 padding-left:2px;
4780 padding-right:2px;
4782 padding-right:2px;
4781 text-align:right;
4783 text-align:right;
4782 width:32px;
4784 width:32px;
4783 -moz-user-select:none;
4785 -moz-user-select:none;
4784 -webkit-user-select: none;
4786 -webkit-user-select: none;
4785 border-right: 1px solid #CCC !important;
4787 border-right: 1px solid #CCC !important;
4786 border-left: 0px solid #CCC !important;
4788 border-left: 0px solid #CCC !important;
4787 border-top: 0px solid #CCC !important;
4789 border-top: 0px solid #CCC !important;
4788 border-bottom: none !important;
4790 border-bottom: none !important;
4789 vertical-align: middle !important;
4791 vertical-align: middle !important;
4790
4792
4791 }
4793 }
4792 table.code-difftable .lineno.new {
4794 table.code-difftable .lineno.new {
4793 }
4795 }
4794 table.code-difftable .lineno.old {
4796 table.code-difftable .lineno.old {
4795 }
4797 }
4796 table.code-difftable .lineno a{
4798 table.code-difftable .lineno a{
4797 color:#747474 !important;
4799 color:#747474 !important;
4798 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4800 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4799 letter-spacing:-1px;
4801 letter-spacing:-1px;
4800 text-align:right;
4802 text-align:right;
4801 padding-right: 2px;
4803 padding-right: 2px;
4802 cursor: pointer;
4804 cursor: pointer;
4803 display: block;
4805 display: block;
4804 width: 32px;
4806 width: 32px;
4805 }
4807 }
4806
4808
4807 table.code-difftable .lineno-inline{
4809 table.code-difftable .lineno-inline{
4808 background:none repeat scroll 0 0 #FFF !important;
4810 background:none repeat scroll 0 0 #FFF !important;
4809 padding-left:2px;
4811 padding-left:2px;
4810 padding-right:2px;
4812 padding-right:2px;
4811 text-align:right;
4813 text-align:right;
4812 width:30px;
4814 width:30px;
4813 -moz-user-select:none;
4815 -moz-user-select:none;
4814 -webkit-user-select: none;
4816 -webkit-user-select: none;
4815 }
4817 }
4816
4818
4817 /** CODE **/
4819 /** CODE **/
4818 table.code-difftable .code {
4820 table.code-difftable .code {
4819 display: block;
4821 display: block;
4820 width: 100%;
4822 width: 100%;
4821 }
4823 }
4822 table.code-difftable .code td{
4824 table.code-difftable .code td{
4823 margin:0;
4825 margin:0;
4824 padding:0;
4826 padding:0;
4825 }
4827 }
4826 table.code-difftable .code pre{
4828 table.code-difftable .code pre{
4827 margin:0;
4829 margin:0;
4828 padding:0;
4830 padding:0;
4829 height: 17px;
4831 height: 17px;
4830 line-height: 17px;
4832 line-height: 17px;
4831 }
4833 }
4832
4834
4833
4835
4834 .diffblock.margined.comm .line .code:hover{
4836 .diffblock.margined.comm .line .code:hover{
4835 background-color:#FFFFCC !important;
4837 background-color:#FFFFCC !important;
4836 cursor: pointer !important;
4838 cursor: pointer !important;
4837 background-image:url("../images/icons/comment_add.png") !important;
4839 background-image:url("../images/icons/comment_add.png") !important;
4838 background-repeat:no-repeat !important;
4840 background-repeat:no-repeat !important;
4839 background-position: right !important;
4841 background-position: right !important;
4840 background-position: 0% 50% !important;
4842 background-position: 0% 50% !important;
4841 }
4843 }
4842 .diffblock.margined.comm .line .code.no-comment:hover{
4844 .diffblock.margined.comm .line .code.no-comment:hover{
4843 background-image: none !important;
4845 background-image: none !important;
4844 cursor: auto !important;
4846 cursor: auto !important;
4845 background-color: inherit !important;
4847 background-color: inherit !important;
4846
4848
4847 }
4849 }
@@ -1,210 +1,228 b''
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2
2
3 <%def name="title()">
3 <%def name="title()">
4 ${c.repo_name} ${_('Pull request #%s') % c.pull_request.pull_request_id}
4 ${c.repo_name} ${_('Pull request #%s') % c.pull_request.pull_request_id}
5 </%def>
5 </%def>
6
6
7 <%def name="breadcrumbs_links()">
7 <%def name="breadcrumbs_links()">
8 ${h.link_to(_(u'Home'),h.url('/'))}
8 ${h.link_to(_(u'Home'),h.url('/'))}
9 &raquo;
9 &raquo;
10 ${h.link_to(c.repo_name,h.url('changelog_home',repo_name=c.repo_name))}
10 ${h.link_to(c.repo_name,h.url('changelog_home',repo_name=c.repo_name))}
11 &raquo;
11 &raquo;
12 ${_('Pull request #%s') % c.pull_request.pull_request_id}
12 ${_('Pull request #%s') % c.pull_request.pull_request_id}
13 </%def>
13 </%def>
14
14
15 <%def name="main()">
15 <%def name="main()">
16
16
17 <div class="box">
17 <div class="box">
18 <!-- box / title -->
18 <!-- box / title -->
19 <div class="title">
19 <div class="title">
20 ${self.breadcrumbs()}
20 ${self.breadcrumbs()}
21 </div>
21 </div>
22 %if c.pull_request.is_closed():
22 %if c.pull_request.is_closed():
23 <div style="padding:10px; font-size:22px;width:100%;text-align: center; color:#88D882">${_('Closed %s') % (h.age(c.pull_request.updated_on))} ${_('with status %s') % h.changeset_status_lbl(c.current_changeset_status)}</div>
23 <div style="padding:10px; font-size:22px;width:100%;text-align: center; color:#88D882">${_('Closed %s') % (h.age(c.pull_request.updated_on))} ${_('with status %s') % h.changeset_status_lbl(c.current_changeset_status)}</div>
24 %endif
24 %endif
25 <h3>${_('Title')}: ${c.pull_request.title}</h3>
25 <h3>${_('Title')}: ${c.pull_request.title}</h3>
26
26
27 <div class="form">
27 <div class="form">
28 <div id="summary" class="fields">
28 <div id="summary" class="fields">
29 <div class="field">
29 <div class="field">
30 <div class="label-summary">
30 <div class="label-summary">
31 <label>${_('Status')}:</label>
31 <label>${_('Status')}:</label>
32 </div>
32 </div>
33 <div class="input">
33 <div class="input">
34 <div class="changeset-status-container" style="float:none;clear:both">
34 <div class="changeset-status-container" style="float:none;clear:both">
35 %if c.current_changeset_status:
35 %if c.current_changeset_status:
36 <div title="${_('Pull request status')}" class="changeset-status-lbl">[${h.changeset_status_lbl(c.current_changeset_status)}]</div>
36 <div title="${_('Pull request status')}" class="changeset-status-lbl">[${h.changeset_status_lbl(c.current_changeset_status)}]</div>
37 <div class="changeset-status-ico" style="padding:1px 4px"><img src="${h.url('/images/icons/flag_status_%s.png' % c.current_changeset_status)}" /></div>
37 <div class="changeset-status-ico" style="padding:1px 4px"><img src="${h.url('/images/icons/flag_status_%s.png' % c.current_changeset_status)}" /></div>
38 %endif
38 %endif
39 </div>
39 </div>
40 </div>
40 </div>
41 </div>
41 </div>
42 <div class="field">
42 <div class="field">
43 <div class="label-summary">
43 <div class="label-summary">
44 <label>${_('Still not reviewed by')}:</label>
44 <label>${_('Still not reviewed by')}:</label>
45 </div>
45 </div>
46 <div class="input">
46 <div class="input">
47 % if len(c.pull_request_pending_reviewers) > 0:
47 % if len(c.pull_request_pending_reviewers) > 0:
48 <div class="tooltip" title="${h.tooltip(','.join([x.username for x in c.pull_request_pending_reviewers]))}">${ungettext('%d reviewer', '%d reviewers',len(c.pull_request_pending_reviewers)) % len(c.pull_request_pending_reviewers)}</div>
48 <div class="tooltip" title="${h.tooltip(','.join([x.username for x in c.pull_request_pending_reviewers]))}">${ungettext('%d reviewer', '%d reviewers',len(c.pull_request_pending_reviewers)) % len(c.pull_request_pending_reviewers)}</div>
49 %else:
49 %else:
50 <div>${_('pull request was reviewed by all reviewers')}</div>
50 <div>${_('pull request was reviewed by all reviewers')}</div>
51 %endif
51 %endif
52 </div>
52 </div>
53 </div>
53 </div>
54 <div class="field">
55 <div class="label-summary">
56 <label>${_('Origin repository')}:</label>
57 </div>
58 <div class="input">
59 <div>
60 ##%if h.is_hg(c.pull_request.org_repo):
61 ## <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
62 ##%elif h.is_git(c.pull_request.org_repo):
63 ## <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
64 ##%endif
65 <span class="spantag">${c.pull_request.org_ref_parts[0]}</span>
66 :
67 <span class="spantag">${c.pull_request.org_ref_parts[1]}</span>
68 <span>${c.pull_request.org_repo.clone_url()}</span>
69 </div>
70 </div>
71 </div>
54 </div>
72 </div>
55 </div>
73 </div>
56 <div style="white-space:pre-wrap;padding:3px 3px 5px 20px">${h.literal(c.pull_request.description)}</div>
74 <div style="white-space:pre-wrap;padding:3px 3px 5px 20px">${h.literal(c.pull_request.description)}</div>
57 <div style="padding:4px 4px 10px 20px">
75 <div style="padding:4px 4px 10px 20px">
58 <div>${_('Created on')}: ${h.fmt_date(c.pull_request.created_on)}</div>
76 <div>${_('Created on')}: ${h.fmt_date(c.pull_request.created_on)}</div>
59 </div>
77 </div>
60
78
61 <div style="overflow: auto;">
79 <div style="overflow: auto;">
62 ##DIFF
80 ##DIFF
63 <div class="table" style="float:left;clear:none">
81 <div class="table" style="float:left;clear:none">
64 <div id="body" class="diffblock">
82 <div id="body" class="diffblock">
65 <div style="white-space:pre-wrap;padding:5px">${_('Compare view')}</div>
83 <div style="white-space:pre-wrap;padding:5px">${_('Compare view')}</div>
66 </div>
84 </div>
67 <div id="changeset_compare_view_content">
85 <div id="changeset_compare_view_content">
68 ##CS
86 ##CS
69 <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">${ungettext('Showing %s commit','Showing %s commits', len(c.cs_ranges)) % len(c.cs_ranges)}</div>
87 <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">${ungettext('Showing %s commit','Showing %s commits', len(c.cs_ranges)) % len(c.cs_ranges)}</div>
70 <%include file="/compare/compare_cs.html" />
88 <%include file="/compare/compare_cs.html" />
71
89
72 ## FILES
90 ## FILES
73 <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">
91 <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">
74
92
75 % if c.limited_diff:
93 % if c.limited_diff:
76 ${ungettext('%s file changed', '%s files changed', len(c.files)) % len(c.files)}
94 ${ungettext('%s file changed', '%s files changed', len(c.files)) % len(c.files)}
77 % else:
95 % else:
78 ${ungettext('%s file changed with %s insertions and %s deletions','%s files changed with %s insertions and %s deletions', len(c.files)) % (len(c.files),c.lines_added,c.lines_deleted)}:
96 ${ungettext('%s file changed with %s insertions and %s deletions','%s files changed with %s insertions and %s deletions', len(c.files)) % (len(c.files),c.lines_added,c.lines_deleted)}:
79 %endif
97 %endif
80
98
81 </div>
99 </div>
82 <div class="cs_files">
100 <div class="cs_files">
83 %if not c.files:
101 %if not c.files:
84 <span class="empty_data">${_('No files')}</span>
102 <span class="empty_data">${_('No files')}</span>
85 %endif
103 %endif
86 %for fid, change, f, stat in c.files:
104 %for fid, change, f, stat in c.files:
87 <div class="cs_${change}">
105 <div class="cs_${change}">
88 <div class="node">${h.link_to(h.safe_unicode(f),h.url.current(anchor=fid))}</div>
106 <div class="node">${h.link_to(h.safe_unicode(f),h.url.current(anchor=fid))}</div>
89 <div class="changes">${h.fancy_file_stats(stat)}</div>
107 <div class="changes">${h.fancy_file_stats(stat)}</div>
90 </div>
108 </div>
91 %endfor
109 %endfor
92 </div>
110 </div>
93 % if c.limited_diff:
111 % if c.limited_diff:
94 <h5>${_('Changeset was too big and was cut off...')}</h5>
112 <h5>${_('Changeset was too big and was cut off...')}</h5>
95 % endif
113 % endif
96 </div>
114 </div>
97 </div>
115 </div>
98 ## REVIEWERS
116 ## REVIEWERS
99 <div style="float:left; border-left:1px dashed #eee">
117 <div style="float:left; border-left:1px dashed #eee">
100 <h4>${_('Pull request reviewers')}</h4>
118 <h4>${_('Pull request reviewers')}</h4>
101 <div id="reviewers" style="padding:0px 0px 5px 10px">
119 <div id="reviewers" style="padding:0px 0px 5px 10px">
102 ## members goes here !
120 ## members goes here !
103 <div class="group_members_wrap" style="min-height:45px">
121 <div class="group_members_wrap" style="min-height:45px">
104 <ul id="review_members" class="group_members">
122 <ul id="review_members" class="group_members">
105 %for member,status in c.pull_request_reviewers:
123 %for member,status in c.pull_request_reviewers:
106 <li id="reviewer_${member.user_id}">
124 <li id="reviewer_${member.user_id}">
107 <div class="reviewers_member">
125 <div class="reviewers_member">
108 <div style="float:left;padding:0px 3px 0px 0px" class="tooltip" title="${h.tooltip(h.changeset_status_lbl(status[0][1].status if status else 'not_reviewed'))}">
126 <div style="float:left;padding:0px 3px 0px 0px" class="tooltip" title="${h.tooltip(h.changeset_status_lbl(status[0][1].status if status else 'not_reviewed'))}">
109 <img src="${h.url(str('/images/icons/flag_status_%s.png' % (status[0][1].status if status else 'not_reviewed')))}"/>
127 <img src="${h.url(str('/images/icons/flag_status_%s.png' % (status[0][1].status if status else 'not_reviewed')))}"/>
110 </div>
128 </div>
111 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(member.email,14)}"/> </div>
129 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(member.email,14)}"/> </div>
112 <div style="float:left">${member.full_name} (${_('owner') if c.pull_request.user_id == member.user_id else _('reviewer')})</div>
130 <div style="float:left">${member.full_name} (${_('owner') if c.pull_request.user_id == member.user_id else _('reviewer')})</div>
113 <input type="hidden" value="${member.user_id}" name="review_members" />
131 <input type="hidden" value="${member.user_id}" name="review_members" />
114 %if not c.pull_request.is_closed() and (h.HasPermissionAny('hg.admin', 'repository.admin')() or c.pull_request.user_id == c.rhodecode_user.user_id):
132 %if not c.pull_request.is_closed() and (h.HasPermissionAny('hg.admin', 'repository.admin')() or c.pull_request.user_id == c.rhodecode_user.user_id):
115 <span class="delete_icon action_button" onclick="removeReviewer(${member.user_id})"></span>
133 <span class="delete_icon action_button" onclick="removeReviewer(${member.user_id})"></span>
116 %endif
134 %endif
117 </div>
135 </div>
118 </li>
136 </li>
119 %endfor
137 %endfor
120 </ul>
138 </ul>
121 </div>
139 </div>
122 %if not c.pull_request.is_closed():
140 %if not c.pull_request.is_closed():
123 <div class='ac'>
141 <div class='ac'>
124 %if h.HasPermissionAny('hg.admin', 'repository.admin')() or c.pull_request.author.user_id == c.rhodecode_user.user_id:
142 %if h.HasPermissionAny('hg.admin', 'repository.admin')() or c.pull_request.author.user_id == c.rhodecode_user.user_id:
125 <div class="reviewer_ac">
143 <div class="reviewer_ac">
126 ${h.text('user', class_='yui-ac-input')}
144 ${h.text('user', class_='yui-ac-input')}
127 <span class="help-block">${_('Add reviewer to this pull request.')}</span>
145 <span class="help-block">${_('Add reviewer to this pull request.')}</span>
128 <div id="reviewers_container"></div>
146 <div id="reviewers_container"></div>
129 </div>
147 </div>
130 <div style="padding:0px 10px">
148 <div style="padding:0px 10px">
131 <span id="update_pull_request" class="ui-btn xsmall">${_('save')}</span>
149 <span id="update_pull_request" class="ui-btn xsmall">${_('save')}</span>
132 </div>
150 </div>
133 %endif
151 %endif
134 </div>
152 </div>
135 %endif
153 %endif
136 </div>
154 </div>
137 </div>
155 </div>
138 </div>
156 </div>
139 <script>
157 <script>
140 var _USERS_AC_DATA = ${c.users_array|n};
158 var _USERS_AC_DATA = ${c.users_array|n};
141 var _GROUPS_AC_DATA = ${c.users_groups_array|n};
159 var _GROUPS_AC_DATA = ${c.users_groups_array|n};
142 AJAX_COMMENT_URL = "${url('pullrequest_comment',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}";
160 AJAX_COMMENT_URL = "${url('pullrequest_comment',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}";
143 AJAX_COMMENT_DELETE_URL = "${url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}";
161 AJAX_COMMENT_DELETE_URL = "${url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}";
144 AJAX_UPDATE_PULLREQUEST = "${url('pullrequest_update',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}"
162 AJAX_UPDATE_PULLREQUEST = "${url('pullrequest_update',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}"
145 </script>
163 </script>
146
164
147 ## diff block
165 ## diff block
148 <%namespace name="diff_block" file="/changeset/diff_block.html"/>
166 <%namespace name="diff_block" file="/changeset/diff_block.html"/>
149 %for fid, change, f, stat in c.files:
167 %for fid, change, f, stat in c.files:
150 ${diff_block.diff_block_simple([c.changes[fid]])}
168 ${diff_block.diff_block_simple([c.changes[fid]])}
151 %endfor
169 %endfor
152 % if c.limited_diff:
170 % if c.limited_diff:
153 <h4>${_('Changeset was too big and was cut off...')}</h4>
171 <h4>${_('Changeset was too big and was cut off...')}</h4>
154 % endif
172 % endif
155
173
156
174
157 ## template for inline comment form
175 ## template for inline comment form
158 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
176 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
159 ${comment.comment_inline_form()}
177 ${comment.comment_inline_form()}
160
178
161 ## render comments and inlines
179 ## render comments and inlines
162 ${comment.generate_comments()}
180 ${comment.generate_comments()}
163
181
164 % if not c.pull_request.is_closed():
182 % if not c.pull_request.is_closed():
165 ## main comment form and it status
183 ## main comment form and it status
166 ${comment.comments(h.url('pullrequest_comment', repo_name=c.repo_name,
184 ${comment.comments(h.url('pullrequest_comment', repo_name=c.repo_name,
167 pull_request_id=c.pull_request.pull_request_id),
185 pull_request_id=c.pull_request.pull_request_id),
168 c.current_changeset_status,
186 c.current_changeset_status,
169 close_btn=True, change_status=c.allowed_to_change_status)}
187 close_btn=True, change_status=c.allowed_to_change_status)}
170 %endif
188 %endif
171
189
172 <script type="text/javascript">
190 <script type="text/javascript">
173 YUE.onDOMReady(function(){
191 YUE.onDOMReady(function(){
174 PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
192 PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
175
193
176 YUE.on(YUQ('.show-inline-comments'),'change',function(e){
194 YUE.on(YUQ('.show-inline-comments'),'change',function(e){
177 var show = 'none';
195 var show = 'none';
178 var target = e.currentTarget;
196 var target = e.currentTarget;
179 if(target.checked){
197 if(target.checked){
180 var show = ''
198 var show = ''
181 }
199 }
182 var boxid = YUD.getAttribute(target,'id_for');
200 var boxid = YUD.getAttribute(target,'id_for');
183 var comments = YUQ('#{0} .inline-comments'.format(boxid));
201 var comments = YUQ('#{0} .inline-comments'.format(boxid));
184 for(c in comments){
202 for(c in comments){
185 YUD.setStyle(comments[c],'display',show);
203 YUD.setStyle(comments[c],'display',show);
186 }
204 }
187 var btns = YUQ('#{0} .inline-comments-button'.format(boxid));
205 var btns = YUQ('#{0} .inline-comments-button'.format(boxid));
188 for(c in btns){
206 for(c in btns){
189 YUD.setStyle(btns[c],'display',show);
207 YUD.setStyle(btns[c],'display',show);
190 }
208 }
191 })
209 })
192
210
193 YUE.on(YUQ('.line'),'click',function(e){
211 YUE.on(YUQ('.line'),'click',function(e){
194 var tr = e.currentTarget;
212 var tr = e.currentTarget;
195 injectInlineForm(tr);
213 injectInlineForm(tr);
196 });
214 });
197
215
198 // inject comments into they proper positions
216 // inject comments into they proper positions
199 var file_comments = YUQ('.inline-comment-placeholder');
217 var file_comments = YUQ('.inline-comment-placeholder');
200 renderInlineComments(file_comments);
218 renderInlineComments(file_comments);
201
219
202 YUE.on(YUD.get('update_pull_request'),'click',function(e){
220 YUE.on(YUD.get('update_pull_request'),'click',function(e){
203 updateReviewers();
221 updateReviewers();
204 })
222 })
205 })
223 })
206 </script>
224 </script>
207
225
208 </div>
226 </div>
209
227
210 </%def>
228 </%def>
General Comments 0
You need to be logged in to leave comments. Login now