##// END OF EJS Templates
Implemented fancier top menu for logged and anonymous users...
marcink -
r784:30d3161c beta
parent child Browse files
Show More
@@ -1,51 +1,52 b''
1 1 """The base Controller API
2 2
3 3 Provides the BaseController class for subclassing.
4 4 """
5 5 from pylons import config, tmpl_context as c, request, session
6 6 from pylons.controllers import WSGIController
7 7 from pylons.templating import render_mako as render
8 8 from rhodecode import __version__
9 9 from rhodecode.lib import auth
10 10 from rhodecode.lib.utils import get_repo_slug
11 11 from rhodecode.model import meta
12 12 from rhodecode.model.scm import ScmModel
13 13 from rhodecode import BACKENDS
14 14
15 15 class BaseController(WSGIController):
16 16
17 17 def __before__(self):
18 18 c.rhodecode_version = __version__
19 19 c.rhodecode_name = config['rhodecode_title']
20 20 c.repo_name = get_repo_slug(request)
21 21 c.cached_repo_list = ScmModel().get_repos()
22 22 c.backends = BACKENDS.keys()
23 23
24 self.sa = meta.Session()
25 scm_model = ScmModel(self.sa)
26 #c.unread_journal = scm_model.get_unread_journal()
27
24 28 if c.repo_name:
25 scm_model = ScmModel()
26 29 cached_repo = scm_model.get(c.repo_name)
27
28 30 if cached_repo:
29 31 c.repository_tags = cached_repo.tags
30 32 c.repository_branches = cached_repo.branches
31 33 c.repository_followers = scm_model.get_followers(cached_repo.dbrepo.repo_id)
32 34 c.repository_forks = scm_model.get_forks(cached_repo.dbrepo.repo_id)
33 35 else:
34 36 c.repository_tags = {}
35 37 c.repository_branches = {}
36 38 c.repository_followers = 0
37 39 c.repository_forks = 0
38 40
39 self.sa = meta.Session()
40 41
41 42 def __call__(self, environ, start_response):
42 43 """Invoke the Controller"""
43 44 # WSGIController.__call__ dispatches to the Controller method
44 45 # the request is routed to. This routing information is
45 46 # available in environ['pylons.routes_dict']
46 47 try:
47 48 #putting this here makes sure that we update permissions every time
48 49 self.rhodecode_user = c.rhodecode_user = auth.get_user(session)
49 50 return WSGIController.__call__(self, environ, start_response)
50 51 finally:
51 52 meta.Session.remove()
@@ -1,276 +1,276 b''
1 1 """caching_query.py
2 2
3 3 Represent persistence structures which allow the usage of
4 4 Beaker caching with SQLAlchemy.
5 5
6 6 The three new concepts introduced here are:
7 7
8 8 * CachingQuery - a Query subclass that caches and
9 9 retrieves results in/from Beaker.
10 10 * FromCache - a query option that establishes caching
11 11 parameters on a Query
12 12 * RelationshipCache - a variant of FromCache which is specific
13 13 to a query invoked during a lazy load.
14 14 * _params_from_query - extracts value parameters from
15 15 a Query.
16 16
17 17 The rest of what's here are standard SQLAlchemy and
18 18 Beaker constructs.
19 19
20 20 """
21 21 from beaker.exceptions import BeakerException
22 22 from sqlalchemy.orm.interfaces import MapperOption
23 23 from sqlalchemy.orm.query import Query
24 24 from sqlalchemy.sql import visitors
25 25 import beaker
26 26
27 27 class CachingQuery(Query):
28 28 """A Query subclass which optionally loads full results from a Beaker
29 29 cache region.
30 30
31 31 The CachingQuery stores additional state that allows it to consult
32 32 a Beaker cache before accessing the database:
33 33
34 34 * A "region", which is a cache region argument passed to a
35 35 Beaker CacheManager, specifies a particular cache configuration
36 36 (including backend implementation, expiration times, etc.)
37 37 * A "namespace", which is a qualifying name that identifies a
38 38 group of keys within the cache. A query that filters on a name
39 39 might use the name "by_name", a query that filters on a date range
40 40 to a joined table might use the name "related_date_range".
41 41
42 42 When the above state is present, a Beaker cache is retrieved.
43 43
44 44 The "namespace" name is first concatenated with
45 45 a string composed of the individual entities and columns the Query
46 46 requests, i.e. such as ``Query(User.id, User.name)``.
47 47
48 48 The Beaker cache is then loaded from the cache manager based
49 49 on the region and composed namespace. The key within the cache
50 50 itself is then constructed against the bind parameters specified
51 51 by this query, which are usually literals defined in the
52 52 WHERE clause.
53 53
54 54 The FromCache and RelationshipCache mapper options below represent
55 55 the "public" method of configuring this state upon the CachingQuery.
56 56
57 57 """
58
58
59 59 def __init__(self, manager, *args, **kw):
60 60 self.cache_manager = manager
61 61 Query.__init__(self, *args, **kw)
62
62
63 63 def __iter__(self):
64 64 """override __iter__ to pull results from Beaker
65 65 if particular attributes have been configured.
66 66
67 67 Note that this approach does *not* detach the loaded objects from
68 68 the current session. If the cache backend is an in-process cache
69 69 (like "memory") and lives beyond the scope of the current session's
70 70 transaction, those objects may be expired. The method here can be
71 71 modified to first expunge() each loaded item from the current
72 72 session before returning the list of items, so that the items
73 73 in the cache are not the same ones in the current Session.
74 74
75 75 """
76 76 if hasattr(self, '_cache_parameters'):
77 77 return self.get_value(createfunc=lambda: list(Query.__iter__(self)))
78 78 else:
79 79 return Query.__iter__(self)
80 80
81 81 def invalidate(self):
82 82 """Invalidate the value represented by this Query."""
83 83
84 84 cache, cache_key = _get_cache_parameters(self)
85 85 cache.remove(cache_key)
86 86
87 87 def get_value(self, merge=True, createfunc=None):
88 88 """Return the value from the cache for this query.
89 89
90 90 Raise KeyError if no value present and no
91 91 createfunc specified.
92 92
93 93 """
94 94 cache, cache_key = _get_cache_parameters(self)
95 95 ret = cache.get_value(cache_key, createfunc=createfunc)
96 96 if merge:
97 97 ret = self.merge_result(ret, load=False)
98 98 return ret
99 99
100 100 def set_value(self, value):
101 101 """Set the value in the cache for this query."""
102 102
103 103 cache, cache_key = _get_cache_parameters(self)
104 cache.put(cache_key, value)
104 cache.put(cache_key, value)
105 105
106 106 def query_callable(manager):
107 107 def query(*arg, **kw):
108 108 return CachingQuery(manager, *arg, **kw)
109 109 return query
110 110
111 111 def get_cache_region(name, region):
112 112 if region not in beaker.cache.cache_regions:
113 raise BeakerException('Cache region not configured: %s'
113 raise BeakerException('Cache region `%s` not configured '
114 114 'Check if proper cache settings are in the .ini files' % region)
115 115 kw = beaker.cache.cache_regions[region]
116 116 return beaker.cache.Cache._get_cache(name, kw)
117
117
118 118 def _get_cache_parameters(query):
119 119 """For a query with cache_region and cache_namespace configured,
120 120 return the correspoinding Cache instance and cache key, based
121 121 on this query's current criterion and parameter values.
122 122
123 123 """
124 124 if not hasattr(query, '_cache_parameters'):
125 125 raise ValueError("This Query does not have caching parameters configured.")
126 126
127 127 region, namespace, cache_key = query._cache_parameters
128
128
129 129 namespace = _namespace_from_query(namespace, query)
130 130
131 131 if cache_key is None:
132 132 # cache key - the value arguments from this query's parameters.
133 133 args = _params_from_query(query)
134 134 cache_key = " ".join([str(x) for x in args])
135 135
136 136 # get cache
137 137 #cache = query.cache_manager.get_cache_region(namespace, region)
138 138 cache = get_cache_region(namespace, region)
139 139 # optional - hash the cache_key too for consistent length
140 140 # import uuid
141 141 # cache_key= str(uuid.uuid5(uuid.NAMESPACE_DNS, cache_key))
142 142
143 143 return cache, cache_key
144 144
145 145 def _namespace_from_query(namespace, query):
146 146 # cache namespace - the token handed in by the
147 147 # option + class we're querying against
148 148 namespace = " ".join([namespace] + [str(x) for x in query._entities])
149 149
150 150 # memcached wants this
151 151 namespace = namespace.replace(' ', '_')
152 152
153 153 return namespace
154 154
155 155 def _set_cache_parameters(query, region, namespace, cache_key):
156
156
157 157 if hasattr(query, '_cache_parameters'):
158 158 region, namespace, cache_key = query._cache_parameters
159 159 raise ValueError("This query is already configured "
160 "for region %r namespace %r" %
160 "for region %r namespace %r" %
161 161 (region, namespace)
162 162 )
163 163 query._cache_parameters = region, namespace, cache_key
164
164
165 165 class FromCache(MapperOption):
166 166 """Specifies that a Query should load results from a cache."""
167 167
168 168 propagate_to_loaders = False
169 169
170 170 def __init__(self, region, namespace, cache_key=None):
171 171 """Construct a new FromCache.
172 172
173 173 :param region: the cache region. Should be a
174 174 region configured in the Beaker CacheManager.
175 175
176 176 :param namespace: the cache namespace. Should
177 177 be a name uniquely describing the target Query's
178 178 lexical structure.
179 179
180 180 :param cache_key: optional. A string cache key
181 181 that will serve as the key to the query. Use this
182 182 if your query has a huge amount of parameters (such
183 183 as when using in_()) which correspond more simply to
184 184 some other identifier.
185 185
186 186 """
187 187 self.region = region
188 188 self.namespace = namespace
189 189 self.cache_key = cache_key
190
190
191 191 def process_query(self, query):
192 192 """Process a Query during normal loading operation."""
193
193
194 194 _set_cache_parameters(query, self.region, self.namespace, self.cache_key)
195 195
196 196 class RelationshipCache(MapperOption):
197 197 """Specifies that a Query as called within a "lazy load"
198 198 should load results from a cache."""
199 199
200 200 propagate_to_loaders = True
201 201
202 202 def __init__(self, region, namespace, attribute):
203 203 """Construct a new RelationshipCache.
204 204
205 205 :param region: the cache region. Should be a
206 206 region configured in the Beaker CacheManager.
207 207
208 208 :param namespace: the cache namespace. Should
209 209 be a name uniquely describing the target Query's
210 210 lexical structure.
211 211
212 212 :param attribute: A Class.attribute which
213 213 indicates a particular class relationship() whose
214 214 lazy loader should be pulled from the cache.
215 215
216 216 """
217 217 self.region = region
218 218 self.namespace = namespace
219 219 self._relationship_options = {
220 220 (attribute.property.parent.class_, attribute.property.key) : self
221 221 }
222 222
223 223 def process_query_conditionally(self, query):
224 224 """Process a Query that is used within a lazy loader.
225 225
226 226 (the process_query_conditionally() method is a SQLAlchemy
227 227 hook invoked only within lazyload.)
228 228
229 229 """
230 230 if query._current_path:
231 231 mapper, key = query._current_path[-2:]
232 232
233 233 for cls in mapper.class_.__mro__:
234 234 if (cls, key) in self._relationship_options:
235 235 relationship_option = self._relationship_options[(cls, key)]
236 236 _set_cache_parameters(
237 237 query,
238 238 relationship_option.region,
239 239 relationship_option.namespace,
240 240 None)
241 241
242 242 def and_(self, option):
243 243 """Chain another RelationshipCache option to this one.
244 244
245 245 While many RelationshipCache objects can be specified on a single
246 246 Query separately, chaining them together allows for a more efficient
247 247 lookup during load.
248 248
249 249 """
250 250 self._relationship_options.update(option._relationship_options)
251 251 return self
252 252
253 253
254 254 def _params_from_query(query):
255 255 """Pull the bind parameter values from a query.
256 256
257 257 This takes into account any scalar attribute bindparam set up.
258 258
259 259 E.g. params_from_query(query.filter(Cls.foo==5).filter(Cls.bar==7)))
260 260 would return [5, 7].
261 261
262 262 """
263 263 v = []
264 264 def visit_bindparam(bind):
265 265 value = query._params.get(bind.key, bind.value)
266
266
267 267 # lazyloader may dig a callable in here, intended
268 268 # to late-evaluate params after autoflush is called.
269 269 # convert to a scalar value.
270 270 if callable(value):
271 271 value = value()
272
272
273 273 v.append(value)
274 274 if query._criterion is not None:
275 275 visitors.traverse(query._criterion, {}, {'bindparam':visit_bindparam})
276 276 return v
@@ -1,365 +1,370 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 package.rhodecode.model.scm
4 4 ~~~~~~~~~~~~~~
5 5
6 6 scm model for RhodeCode
7 7 :created_on: Apr 9, 2010
8 8 :author: marcink
9 9 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
10 10 :license: GPLv3, see COPYING for more details.
11 11 """
12 12 # This program is free software; you can redistribute it and/or
13 13 # modify it under the terms of the GNU General Public License
14 14 # as published by the Free Software Foundation; version 2
15 15 # of the License or (at your opinion) any later version of the license.
16 16 #
17 17 # This program is distributed in the hope that it will be useful,
18 18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 20 # GNU General Public License for more details.
21 21 #
22 22 # You should have received a copy of the GNU General Public License
23 23 # along with this program; if not, write to the Free Software
24 24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 25 # MA 02110-1301, USA.
26 26
27 27 import os
28 28 import time
29 29 import traceback
30 30 import logging
31 31
32 32 from vcs import get_backend
33 33 from vcs.utils.helpers import get_scm
34 34 from vcs.exceptions import RepositoryError, VCSError
35 35 from vcs.utils.lazy import LazyProperty
36 36
37 37 from mercurial import ui
38 38
39 39 from beaker.cache import cache_region, region_invalidate
40 40
41 41 from rhodecode import BACKENDS
42 42 from rhodecode.lib import helpers as h
43 43 from rhodecode.lib.auth import HasRepoPermissionAny
44 44 from rhodecode.lib.utils import get_repos, make_ui, action_logger
45 45 from rhodecode.model import BaseModel
46 46 from rhodecode.model.user import UserModel
47 47
48 48 from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \
49 UserFollowing
49 UserFollowing, UserLog
50 50 from rhodecode.model.caching_query import FromCache
51 51
52 52 from sqlalchemy.orm import joinedload
53 53 from sqlalchemy.orm.session import make_transient
54 54 from sqlalchemy.exc import DatabaseError
55 55
56 56 log = logging.getLogger(__name__)
57 57
58 58
59 59 class UserTemp(object):
60 60 def __init__(self, user_id):
61 61 self.user_id = user_id
62 62 class RepoTemp(object):
63 63 def __init__(self, repo_id):
64 64 self.repo_id = repo_id
65 65
66 66 class ScmModel(BaseModel):
67 67 """
68 68 Mercurial Model
69 69 """
70 70
71 71 @LazyProperty
72 72 def repos_path(self):
73 73 """
74 74 Get's the repositories root path from database
75 75 """
76 76 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
77 77
78 78 return q.ui_value
79 79
80 80 def repo_scan(self, repos_path, baseui):
81 81 """
82 82 Listing of repositories in given path. This path should not be a
83 83 repository itself. Return a dictionary of repository objects
84 84
85 85 :param repos_path: path to directory containing repositories
86 86 :param baseui
87 87 """
88 88 log.info('scanning for repositories in %s', repos_path)
89 89
90 90 if not isinstance(baseui, ui.ui):
91 91 baseui = make_ui('db')
92 92 repos_list = {}
93 93
94 94 for name, path in get_repos(repos_path):
95 95 try:
96 96 if repos_list.has_key(name):
97 97 raise RepositoryError('Duplicate repository name %s '
98 98 'found in %s' % (name, path))
99 99 else:
100 100
101 101 klass = get_backend(path[0])
102 102
103 103 if path[0] == 'hg' and path[0] in BACKENDS.keys():
104 104 repos_list[name] = klass(path[1], baseui=baseui)
105 105
106 106 if path[0] == 'git' and path[0] in BACKENDS.keys():
107 107 repos_list[name] = klass(path[1])
108 108 except OSError:
109 109 continue
110 110
111 111 return repos_list
112 112
113 113 def get_repos(self, all_repos=None):
114 114 """
115 115 Get all repos from db and for each repo create it's backend instance.
116 116 and fill that backed with information from database
117 117
118 118 :param all_repos: give specific repositories list, good for filtering
119 119 """
120 120 if all_repos is None:
121 121 all_repos = self.sa.query(Repository)\
122 122 .order_by(Repository.repo_name).all()
123 123
124 124 invalidation_list = [str(x.cache_key) for x in \
125 125 self.sa.query(CacheInvalidation.cache_key)\
126 126 .filter(CacheInvalidation.cache_active == False)\
127 127 .all()]
128 128
129 129 for r in all_repos:
130 130
131 131 repo = self.get(r.repo_name, invalidation_list)
132 132
133 133 if repo is not None:
134 134 last_change = repo.last_change
135 135 tip = h.get_changeset_safe(repo, 'tip')
136 136
137 137 tmp_d = {}
138 138 tmp_d['name'] = repo.name
139 139 tmp_d['name_sort'] = tmp_d['name'].lower()
140 140 tmp_d['description'] = repo.dbrepo.description
141 141 tmp_d['description_sort'] = tmp_d['description']
142 142 tmp_d['last_change'] = last_change
143 143 tmp_d['last_change_sort'] = time.mktime(last_change.timetuple())
144 144 tmp_d['tip'] = tip.raw_id
145 145 tmp_d['tip_sort'] = tip.revision
146 146 tmp_d['rev'] = tip.revision
147 147 tmp_d['contact'] = repo.dbrepo.user.full_contact
148 148 tmp_d['contact_sort'] = tmp_d['contact']
149 149 tmp_d['repo_archives'] = list(repo._get_archives())
150 150 tmp_d['last_msg'] = tip.message
151 151 tmp_d['repo'] = repo
152 152 yield tmp_d
153 153
154 154 def get_repo(self, repo_name):
155 155 return self.get(repo_name)
156 156
157 157 def get(self, repo_name, invalidation_list=None):
158 158 """
159 159 Get's repository from given name, creates BackendInstance and
160 160 propagates it's data from database with all additional information
161 161 :param repo_name:
162 162 """
163 163 if not HasRepoPermissionAny('repository.read', 'repository.write',
164 164 'repository.admin')(repo_name, 'get repo check'):
165 165 return
166 166
167 167
168 168 @cache_region('long_term')
169 169 def _get_repo(repo_name):
170 170
171 171 repo_path = os.path.join(self.repos_path, repo_name)
172 172
173 173 try:
174 174 alias = get_scm(repo_path)[0]
175 175
176 176 log.debug('Creating instance of %s repository', alias)
177 177 backend = get_backend(alias)
178 178 except VCSError:
179 179 log.error(traceback.format_exc())
180 180 return
181 181
182 182 if alias == 'hg':
183 183 from pylons import app_globals as g
184 184 repo = backend(repo_path, create=False, baseui=g.baseui)
185 185 #skip hidden web repository
186 186 if repo._get_hidden():
187 187 return
188 188 else:
189 189 repo = backend(repo_path, create=False)
190 190
191 191 dbrepo = self.sa.query(Repository)\
192 192 .options(joinedload(Repository.fork))\
193 193 .options(joinedload(Repository.user))\
194 194 .filter(Repository.repo_name == repo_name)\
195 195 .scalar()
196 196
197 197 make_transient(dbrepo)
198 198 if dbrepo.user:
199 199 make_transient(dbrepo.user)
200 200 if dbrepo.fork:
201 201 make_transient(dbrepo.fork)
202 202
203 203 repo.dbrepo = dbrepo
204 204 return repo
205 205
206 206 pre_invalidate = True
207 207 if invalidation_list:
208 208 pre_invalidate = repo_name in invalidation_list
209 209
210 210 if pre_invalidate:
211 211 invalidate = self._should_invalidate(repo_name)
212 212
213 213 if invalidate:
214 214 log.info('invalidating cache for repository %s', repo_name)
215 215 region_invalidate(_get_repo, None, repo_name)
216 216 self._mark_invalidated(invalidate)
217 217
218 218 return _get_repo(repo_name)
219 219
220 220
221 221
222 222 def mark_for_invalidation(self, repo_name):
223 223 """
224 224 Puts cache invalidation task into db for
225 225 further global cache invalidation
226 226
227 227 :param repo_name: this repo that should invalidation take place
228 228 """
229 229 log.debug('marking %s for invalidation', repo_name)
230 230 cache = self.sa.query(CacheInvalidation)\
231 231 .filter(CacheInvalidation.cache_key == repo_name).scalar()
232 232
233 233 if cache:
234 234 #mark this cache as inactive
235 235 cache.cache_active = False
236 236 else:
237 237 log.debug('cache key not found in invalidation db -> creating one')
238 238 cache = CacheInvalidation(repo_name)
239 239
240 240 try:
241 241 self.sa.add(cache)
242 242 self.sa.commit()
243 243 except (DatabaseError,):
244 244 log.error(traceback.format_exc())
245 245 self.sa.rollback()
246 246
247 247
248 248 def toggle_following_repo(self, follow_repo_id, user_id):
249 249
250 250 f = self.sa.query(UserFollowing)\
251 251 .filter(UserFollowing.follows_repo_id == follow_repo_id)\
252 252 .filter(UserFollowing.user_id == user_id).scalar()
253 253
254 254 if f is not None:
255 255
256 256 try:
257 257 self.sa.delete(f)
258 258 self.sa.commit()
259 259 action_logger(UserTemp(user_id),
260 260 'stopped_following_repo',
261 261 RepoTemp(follow_repo_id))
262 262 return
263 263 except:
264 264 log.error(traceback.format_exc())
265 265 self.sa.rollback()
266 266 raise
267 267
268 268
269 269 try:
270 270 f = UserFollowing()
271 271 f.user_id = user_id
272 272 f.follows_repo_id = follow_repo_id
273 273 self.sa.add(f)
274 274 self.sa.commit()
275 275 action_logger(UserTemp(user_id),
276 276 'started_following_repo',
277 277 RepoTemp(follow_repo_id))
278 278 except:
279 279 log.error(traceback.format_exc())
280 280 self.sa.rollback()
281 281 raise
282 282
283 283 def toggle_following_user(self, follow_user_id , user_id):
284 284 f = self.sa.query(UserFollowing)\
285 285 .filter(UserFollowing.follows_user_id == follow_user_id)\
286 286 .filter(UserFollowing.user_id == user_id).scalar()
287 287
288 288 if f is not None:
289 289 try:
290 290 self.sa.delete(f)
291 291 self.sa.commit()
292 292 return
293 293 except:
294 294 log.error(traceback.format_exc())
295 295 self.sa.rollback()
296 296 raise
297 297
298 298 try:
299 299 f = UserFollowing()
300 300 f.user_id = user_id
301 301 f.follows_user_id = follow_user_id
302 302 self.sa.add(f)
303 303 self.sa.commit()
304 304 except:
305 305 log.error(traceback.format_exc())
306 306 self.sa.rollback()
307 307 raise
308 308
309 309 def is_following_repo(self, repo_name, user_id):
310 310 r = self.sa.query(Repository)\
311 311 .filter(Repository.repo_name == repo_name).scalar()
312 312
313 313 f = self.sa.query(UserFollowing)\
314 314 .filter(UserFollowing.follows_repository == r)\
315 315 .filter(UserFollowing.user_id == user_id).scalar()
316 316
317 317 return f is not None
318 318
319 319 def is_following_user(self, username, user_id):
320 320 u = UserModel(self.sa).get_by_username(username)
321 321
322 322 f = self.sa.query(UserFollowing)\
323 323 .filter(UserFollowing.follows_user == u)\
324 324 .filter(UserFollowing.user_id == user_id).scalar()
325 325
326 326 return f is not None
327 327
328 328 def get_followers(self, repo_id):
329 329 return self.sa.query(UserFollowing)\
330 330 .filter(UserFollowing.follows_repo_id == repo_id).count()
331 331
332 332 def get_forks(self, repo_id):
333 333 return self.sa.query(Repository)\
334 334 .filter(Repository.fork_id == repo_id).count()
335 335
336
337 def get_unread_journal(self):
338 return self.sa.query(UserLog).count()
339
340
336 341 def _should_invalidate(self, repo_name):
337 342 """
338 343 Looks up database for invalidation signals for this repo_name
339 344 :param repo_name:
340 345 """
341 346
342 347 ret = self.sa.query(CacheInvalidation)\
343 348 .options(FromCache('sql_cache_short',
344 349 'get_invalidation_%s' % repo_name))\
345 350 .filter(CacheInvalidation.cache_key == repo_name)\
346 351 .filter(CacheInvalidation.cache_active == False)\
347 352 .scalar()
348 353
349 354 return ret
350 355
351 356 def _mark_invalidated(self, cache_key):
352 357 """
353 358 Marks all occurences of cache to invaldation as already invalidated
354 359 :param repo_name:
355 360 """
356 361 if cache_key:
357 362 log.debug('marking %s as already invalidated', cache_key)
358 363 try:
359 364 cache_key.cache_active = True
360 365 self.sa.add(cache_key)
361 366 self.sa.commit()
362 367 except (DatabaseError,):
363 368 log.error(traceback.format_exc())
364 369 self.sa.rollback()
365 370
@@ -1,2388 +1,2401 b''
1 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 border:0;
3 3 outline:0;
4 4 font-size:100%;
5 5 vertical-align:baseline;
6 6 background:transparent;
7 7 margin:0;
8 8 padding:0;
9 9 }
10 10
11 11 body {
12 12 line-height:1;
13 13 height:100%;
14 14 background:url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 15 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
16 16 font-size:12px;
17 17 color:#000;
18 18 margin:0;
19 19 padding:0;
20 20 }
21 21
22 22 ol,ul {
23 23 list-style:none;
24 24 }
25 25
26 26 blockquote,q {
27 27 quotes:none;
28 28 }
29 29
30 30 blockquote:before,blockquote:after,q:before,q:after {
31 31 content:none;
32 32 }
33 33
34 34 :focus {
35 35 outline:0;
36 36 }
37 37
38 38 del {
39 39 text-decoration:line-through;
40 40 }
41 41
42 42 table {
43 43 border-collapse:collapse;
44 44 border-spacing:0;
45 45 }
46 46
47 47 html {
48 48 height:100%;
49 49 }
50 50
51 51 a {
52 52 color:#003367;
53 53 text-decoration:none;
54 54 cursor:pointer;
55 55 font-weight:700;
56 56 }
57 57
58 58 a:hover {
59 59 color:#316293;
60 60 text-decoration:underline;
61 61 }
62 62
63 63 h1,h2,h3,h4,h5,h6 {
64 64 color:#292929;
65 65 font-weight:700;
66 66 }
67 67
68 68 h1 {
69 69 font-size:22px;
70 70 }
71 71
72 72 h2 {
73 73 font-size:20px;
74 74 }
75 75
76 76 h3 {
77 77 font-size:18px;
78 78 }
79 79
80 80 h4 {
81 81 font-size:16px;
82 82 }
83 83
84 84 h5 {
85 85 font-size:14px;
86 86 }
87 87
88 88 h6 {
89 89 font-size:11px;
90 90 }
91 91
92 92 ul.circle {
93 93 list-style-type:circle;
94 94 }
95 95
96 96 ul.disc {
97 97 list-style-type:disc;
98 98 }
99 99
100 100 ul.square {
101 101 list-style-type:square;
102 102 }
103 103
104 104 ol.lower-roman {
105 105 list-style-type:lower-roman;
106 106 }
107 107
108 108 ol.upper-roman {
109 109 list-style-type:upper-roman;
110 110 }
111 111
112 112 ol.lower-alpha {
113 113 list-style-type:lower-alpha;
114 114 }
115 115
116 116 ol.upper-alpha {
117 117 list-style-type:upper-alpha;
118 118 }
119 119
120 120 ol.decimal {
121 121 list-style-type:decimal;
122 122 }
123 123
124 124 div.color {
125 125 clear:both;
126 126 overflow:hidden;
127 127 position:absolute;
128 128 background:#FFF;
129 129 margin:7px 0 0 60px;
130 130 padding:1px 1px 1px 0;
131 131 }
132 132
133 133 div.color a {
134 134 width:15px;
135 135 height:15px;
136 136 display:block;
137 137 float:left;
138 138 margin:0 0 0 1px;
139 139 padding:0;
140 140 }
141 141
142 142 div.options {
143 143 clear:both;
144 144 overflow:hidden;
145 145 position:absolute;
146 146 background:#FFF;
147 147 margin:7px 0 0 162px;
148 148 padding:0;
149 149 }
150 150
151 151 div.options a {
152 152 height:1%;
153 153 display:block;
154 154 text-decoration:none;
155 155 margin:0;
156 156 padding:3px 8px;
157 157 }
158 158
159 159 .top-left-rounded-corner {
160 160 -webkit-border-top-left-radius: 8px;
161 161 -khtml-border-radius-topleft: 8px;
162 162 -moz-border-radius-topleft: 8px;
163 163 border-top-left-radius: 8px;
164 164 }
165 165
166 166 .top-right-rounded-corner {
167 167 -webkit-border-top-right-radius: 8px;
168 168 -khtml-border-radius-topright: 8px;
169 169 -moz-border-radius-topright: 8px;
170 170 border-top-right-radius: 8px;
171 171 }
172 172
173 173 .bottom-left-rounded-corner {
174 174 -webkit-border-bottom-left-radius: 8px;
175 175 -khtml-border-radius-bottomleft: 8px;
176 176 -moz-border-radius-bottomleft: 8px;
177 177 border-bottom-left-radius: 8px;
178 178 }
179 179
180 180 .bottom-right-rounded-corner {
181 181 -webkit-border-bottom-right-radius: 8px;
182 182 -khtml-border-radius-bottomright: 8px;
183 183 -moz-border-radius-bottomright: 8px;
184 184 border-bottom-right-radius: 8px;
185 185 }
186 186
187 187
188 188 #header {
189 189 margin:0;
190 190 padding:0 30px;
191 191 }
192 192
193
194 #header ul#logged-user{
195 margin-bottom:5px !important;
196 -webkit-border-radius: 0px 0px 8px 8px;
197 -khtml-border-radius: 0px 0px 8px 8px;
198 -moz-border-radius: 0px 0px 8px 8px;
199 border-radius: 0px 0px 8px 8px;
200 height:37px;
201 background:url("../images/header_inner.png") repeat-x scroll 0 0 #003367
202 }
203
193 204 #header ul#logged-user li {
194 205 list-style:none;
195 206 float:left;
196 border-left:1px solid #bbb;
197 border-right:1px solid #a5a5a5;
198 margin:-2px 0 0;
199 padding:10px 12px;
207 margin:8px 0 0;
208 padding:4px 12px;
209 border-left: 1px solid #316293;
200 210 }
201 211
202 212 #header ul#logged-user li.first {
203 213 border-left:none;
204 margin:-6px;
214 margin:4px;
215 }
216
217 #header ul#logged-user li.first div.gravatar {
218 margin-top:-2px;
205 219 }
206 220
207 221 #header ul#logged-user li.first div.account {
208 222 padding-top:4px;
209 223 float:left;
210 224 }
211 225
212 226 #header ul#logged-user li.last {
213 227 border-right:none;
214 228 }
215 229
216 230 #header ul#logged-user li a {
217 color:#4e4e4e;
231 color:#fff;
218 232 font-weight:700;
219 233 text-decoration:none;
220 234 }
221 235
222 236 #header ul#logged-user li a:hover {
223 color:#376ea6;
224 237 text-decoration:underline;
225 238 }
226 239
227 240 #header ul#logged-user li.highlight a {
228 241 color:#fff;
229 242 }
230 243
231 244 #header ul#logged-user li.highlight a:hover {
232 color:#376ea6;
245 color:#FFF;
233 246 }
234 247
235 248 #header #header-inner {
236 249 height:40px;
237 250 clear:both;
238 251 position:relative;
239 252 background:#003367 url("../images/header_inner.png") repeat-x;
240 253 border-bottom:2px solid #fff;
241 254 margin:0;
242 255 padding:0;
243 256 }
244 257
245 258 #header #header-inner #home a {
246 259 height:40px;
247 260 width:46px;
248 261 display:block;
249 262 background:url("../images/button_home.png");
250 263 background-position:0 0;
251 264 margin:0;
252 265 padding:0;
253 266 }
254 267
255 268 #header #header-inner #home a:hover {
256 269 background-position:0 -40px;
257 270 }
258 271
259 272 #header #header-inner #logo h1 {
260 273 color:#FFF;
261 274 font-size:18px;
262 275 margin:10px 0 0 13px;
263 276 padding:0;
264 277 }
265 278
266 279 #header #header-inner #logo a {
267 280 color:#fff;
268 281 text-decoration:none;
269 282 }
270 283
271 284 #header #header-inner #logo a:hover {
272 285 color:#bfe3ff;
273 286 }
274 287
275 288 #header #header-inner #quick,#header #header-inner #quick ul {
276 289 position:relative;
277 290 float:right;
278 291 list-style-type:none;
279 292 list-style-position:outside;
280 293 margin:10px 5px 0 0;
281 294 padding:0;
282 295 }
283 296
284 297 #header #header-inner #quick li {
285 298 position:relative;
286 299 float:left;
287 300 margin:0 5px 0 0;
288 301 padding:0;
289 302 }
290 303
291 304 #header #header-inner #quick li a {
292 305 top:0;
293 306 left:0;
294 307 height:1%;
295 308 display:block;
296 309 clear:both;
297 310 overflow:hidden;
298 311 color:#FFF;
299 312 font-weight:700;
300 313 text-decoration:none;
301 314 background:#369 url("../../images/quick_l.png") no-repeat top left;
302 315 padding:0;
303 316 }
304 317
305 318 #header #header-inner #quick li span.short {
306 319 padding:9px 6px 8px 6px;
307 320 }
308 321
309 322 #header #header-inner #quick li span {
310 323 top:0;
311 324 right:0;
312 325 height:1%;
313 326 display:block;
314 327 float:left;
315 328 background:url("../../images/quick_r.png") no-repeat top right;
316 329 border-left:1px solid #3f6f9f;
317 330 margin:0;
318 331 padding:10px 12px 8px 10px;
319 332 }
320 333
321 334 #header #header-inner #quick li span.normal {
322 335 border:none;
323 336 padding:10px 12px 8px;
324 337 }
325 338
326 339 #header #header-inner #quick li span.icon {
327 340 top:0;
328 341 left:0;
329 342 border-left:none;
330 343 background:url("../../images/quick_l.png") no-repeat top left;
331 344 border-right:1px solid #2e5c89;
332 345 padding:8px 8px 4px;
333 346 }
334 347
335 348 #header #header-inner #quick li span.icon_short {
336 349 top:0;
337 350 left:0;
338 351 border-left:none;
339 352 background:url("../../images/quick_l.png") no-repeat top left;
340 353 border-right:1px solid #2e5c89;
341 354 padding:9px 4px 4px;
342 355 }
343 356
344 357 #header #header-inner #quick li a:hover {
345 358 background:#4e4e4e url("../../images/quick_l_selected.png") no-repeat top left;
346 359 }
347 360
348 361 #header #header-inner #quick li a:hover span {
349 362 border-left:1px solid #545454;
350 363 background:url("../../images/quick_r_selected.png") no-repeat top right;
351 364 }
352 365
353 366 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short {
354 367 border-left:none;
355 368 border-right:1px solid #464646;
356 369 background:url("../../images/quick_l_selected.png") no-repeat top left;
357 370 }
358 371
359 372
360 373 #header #header-inner #quick ul {
361 374 top:29px;
362 375 right:0;
363 376 min-width:200px;
364 377 display:none;
365 378 position:absolute;
366 379 background:#FFF;
367 380 border:1px solid #666;
368 381 border-top:1px solid #003367;
369 382 z-index:100;
370 383 margin:0;
371 384 padding:0;
372 385 }
373 386
374 387 #header #header-inner #quick ul.repo_switcher {
375 388 max-height:275px;
376 389 overflow-x:hidden;
377 390 overflow-y:auto;
378 391 }
379 392
380 393 #header #header-inner #quick .repo_switcher_type{
381 394 position:absolute;
382 395 left:0;
383 396 top:9px;
384 397
385 398 }
386 399 #header #header-inner #quick li ul li {
387 400 border-bottom:1px solid #ddd;
388 401 }
389 402
390 403 #header #header-inner #quick li ul li a {
391 404 width:182px;
392 405 height:auto;
393 406 display:block;
394 407 float:left;
395 408 background:#FFF;
396 409 color:#003367;
397 410 font-weight:400;
398 411 margin:0;
399 412 padding:7px 9px;
400 413 }
401 414
402 415 #header #header-inner #quick li ul li a:hover {
403 416 color:#000;
404 417 background:#FFF;
405 418 }
406 419
407 420 #header #header-inner #quick ul ul {
408 421 top:auto;
409 422 }
410 423
411 424 #header #header-inner #quick li ul ul {
412 425 right:200px;
413 426 max-height:275px;
414 427 overflow:auto;
415 428 overflow-x:hidden;
416 429 white-space:normal;
417 430 }
418 431
419 432 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover {
420 433 background:url("../images/icons/book.png") no-repeat scroll 4px 9px #FFF;
421 434 width:167px;
422 435 margin:0;
423 436 padding:12px 9px 7px 24px;
424 437 }
425 438
426 439 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover {
427 440 background:url("../images/icons/lock.png") no-repeat scroll 4px 9px #FFF;
428 441 min-width:167px;
429 442 margin:0;
430 443 padding:12px 9px 7px 24px;
431 444 }
432 445
433 446 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover {
434 447 background:url("../images/icons/lock_open.png") no-repeat scroll 4px 9px #FFF;
435 448 min-width:167px;
436 449 margin:0;
437 450 padding:12px 9px 7px 24px;
438 451 }
439 452
440 453 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover {
441 454 background:url("../images/icons/hgicon.png") no-repeat scroll 4px 9px #FFF;
442 455 min-width:167px;
443 456 margin:0 0 0 14px;
444 457 padding:12px 9px 7px 24px;
445 458 }
446 459
447 460 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover {
448 461 background:url("../images/icons/giticon.png") no-repeat scroll 4px 9px #FFF;
449 462 min-width:167px;
450 463 margin:0 0 0 14px;
451 464 padding:12px 9px 7px 24px;
452 465 }
453 466
454 467 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover {
455 468 background:url("../images/icons/database_edit.png") no-repeat scroll 4px 9px #FFF;
456 469 width:167px;
457 470 margin:0;
458 471 padding:12px 9px 7px 24px;
459 472 }
460 473
461 474 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover {
462 475 background:#FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
463 476 width:167px;
464 477 margin:0;
465 478 padding:12px 9px 7px 24px;
466 479 }
467 480
468 481 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover {
469 482 background:#FFF url("../images/icons/cog.png") no-repeat 4px 9px;
470 483 width:167px;
471 484 margin:0;
472 485 padding:12px 9px 7px 24px;
473 486 }
474 487
475 488 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover {
476 489 background:#FFF url("../images/icons/key.png") no-repeat 4px 9px;
477 490 width:167px;
478 491 margin:0;
479 492 padding:12px 9px 7px 24px;
480 493 }
481 494
482 495 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover {
483 496 background:#FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
484 497 width:167px;
485 498 margin:0;
486 499 padding:12px 9px 7px 24px;
487 500 }
488 501
489 502 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover {
490 503 background:#FFF url("../images/icons/arrow_divide.png") no-repeat 4px 9px;
491 504 width:167px;
492 505 margin:0;
493 506 padding:12px 9px 7px 24px;
494 507 }
495 508
496 509 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover {
497 510 background:#FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
498 511 width:167px;
499 512 margin:0;
500 513 padding:12px 9px 7px 24px;
501 514 }
502 515
503 516 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover {
504 517 background:#FFF url("../images/icons/delete.png") no-repeat 4px 9px;
505 518 width:167px;
506 519 margin:0;
507 520 padding:12px 9px 7px 24px;
508 521 }
509 522
510 523 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover {
511 524 background:#FFF url("../images/icons/arrow_branch.png") no-repeat 4px 9px;
512 525 width:167px;
513 526 margin:0;
514 527 padding:12px 9px 7px 24px;
515 528 }
516 529
517 530 #header #header-inner #quick li ul li a.tags,#header #header-inner #quick li ul li a.tags:hover {
518 531 background:#FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
519 532 width:167px;
520 533 margin:0;
521 534 padding:12px 9px 7px 24px;
522 535 }
523 536
524 537 #header #header-inner #quick li ul li a.admin,#header #header-inner #quick li ul li a.admin:hover {
525 538 background:#FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
526 539 width:167px;
527 540 margin:0;
528 541 padding:12px 9px 7px 24px;
529 542 }
530 543
531 544 #content #left {
532 545 left:0;
533 546 width:280px;
534 547 position:absolute;
535 548 }
536 549
537 550 #content #right {
538 551 margin:0 60px 10px 290px;
539 552 }
540 553
541 554 #content div.box {
542 555 clear:both;
543 556 overflow:hidden;
544 557 background:#fff;
545 558 margin:0 0 10px;
546 559 padding:0 0 10px;
547 560 }
548 561
549 562 #content div.box-left {
550 563 width:49%;
551 564 clear:none;
552 565 float:left;
553 566 margin:0 0 10px;
554 567 }
555 568
556 569 #content div.box-right {
557 570 width:49%;
558 571 clear:none;
559 572 float:right;
560 573 margin:0 0 10px;
561 574 }
562 575
563 576 #content div.box div.title {
564 577 clear:both;
565 578 overflow:hidden;
566 579 background:#369 url("../images/header_inner.png") repeat-x;
567 580 margin:0 0 20px;
568 581 padding:0;
569 582 }
570 583
571 584 #content div.box div.title h5 {
572 585 float:left;
573 586 border:none;
574 587 color:#fff;
575 588 text-transform:uppercase;
576 589 margin:0;
577 590 padding:11px 0 11px 10px;
578 591 }
579 592
580 593 #content div.box div.title ul.links li {
581 594 list-style:none;
582 595 float:left;
583 596 margin:0;
584 597 padding:0;
585 598 }
586 599
587 600 #content div.box div.title ul.links li a {
588 601 height:1%;
589 602 display:block;
590 603 float:left;
591 604 border-left:1px solid #316293;
592 605 color:#fff;
593 606 font-size:11px;
594 607 font-weight:700;
595 608 text-decoration:none;
596 609 margin:0;
597 610 padding:13px 16px 12px;
598 611 }
599 612
600 613 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6 {
601 614 clear:both;
602 615 overflow:hidden;
603 616 border-bottom:1px solid #DDD;
604 617 margin:10px 20px;
605 618 padding:0 0 15px;
606 619 }
607 620
608 621 #content div.box p {
609 622 color:#5f5f5f;
610 623 font-size:12px;
611 624 line-height:150%;
612 625 margin:0 24px 10px;
613 626 padding:0;
614 627 }
615 628
616 629 #content div.box blockquote {
617 630 border-left:4px solid #DDD;
618 631 color:#5f5f5f;
619 632 font-size:11px;
620 633 line-height:150%;
621 634 margin:0 34px;
622 635 padding:0 0 0 14px;
623 636 }
624 637
625 638 #content div.box blockquote p {
626 639 margin:10px 0;
627 640 padding:0;
628 641 }
629 642
630 643 #content div.box dl {
631 644 margin:10px 24px;
632 645 }
633 646
634 647 #content div.box dt {
635 648 font-size:12px;
636 649 margin:0;
637 650 }
638 651
639 652 #content div.box dd {
640 653 font-size:12px;
641 654 margin:0;
642 655 padding:8px 0 8px 15px;
643 656 }
644 657
645 658 #content div.box li {
646 659 font-size:12px;
647 660 padding:4px 0;
648 661 }
649 662
650 663 #content div.box ul.disc,#content div.box ul.circle {
651 664 margin:10px 24px 10px 38px;
652 665 }
653 666
654 667 #content div.box ul.square {
655 668 margin:10px 24px 10px 40px;
656 669 }
657 670
658 671 #content div.box img.left {
659 672 border:none;
660 673 float:left;
661 674 margin:10px 10px 10px 0;
662 675 }
663 676
664 677 #content div.box img.right {
665 678 border:none;
666 679 float:right;
667 680 margin:10px 0 10px 10px;
668 681 }
669 682
670 683 #content div.box div.messages {
671 684 clear:both;
672 685 overflow:hidden;
673 686 margin:0 20px;
674 687 padding:0;
675 688 }
676 689
677 690 #content div.box div.message {
678 691 clear:both;
679 692 overflow:hidden;
680 693 margin:0;
681 694 padding:10px 0;
682 695 }
683 696
684 697 #content div.box div.message a {
685 698 font-weight:400 !important;
686 699 }
687 700
688 701 #content div.box div.message div.image {
689 702 float:left;
690 703 margin:9px 0 0 5px;
691 704 padding:6px;
692 705 }
693 706
694 707 #content div.box div.message div.image img {
695 708 vertical-align:middle;
696 709 margin:0;
697 710 }
698 711
699 712 #content div.box div.message div.text {
700 713 float:left;
701 714 margin:0;
702 715 padding:9px 6px;
703 716 }
704 717
705 718 #content div.box div.message div.dismiss a {
706 719 height:16px;
707 720 width:16px;
708 721 display:block;
709 722 background:url("../images/icons/cross.png") no-repeat;
710 723 margin:15px 14px 0 0;
711 724 padding:0;
712 725 }
713 726
714 727 #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 {
715 728 border:none;
716 729 margin:0;
717 730 padding:0;
718 731 }
719 732
720 733 #content div.box div.message div.text span {
721 734 height:1%;
722 735 display:block;
723 736 margin:0;
724 737 padding:5px 0 0;
725 738 }
726 739
727 740 #content div.box div.message-error {
728 741 height:1%;
729 742 clear:both;
730 743 overflow:hidden;
731 744 background:#FBE3E4;
732 745 border:1px solid #FBC2C4;
733 746 color:#860006;
734 747 }
735 748
736 749 #content div.box div.message-error h6 {
737 750 color:#860006;
738 751 }
739 752
740 753 #content div.box div.message-warning {
741 754 height:1%;
742 755 clear:both;
743 756 overflow:hidden;
744 757 background:#FFF6BF;
745 758 border:1px solid #FFD324;
746 759 color:#5f5200;
747 760 }
748 761
749 762 #content div.box div.message-warning h6 {
750 763 color:#5f5200;
751 764 }
752 765
753 766 #content div.box div.message-notice {
754 767 height:1%;
755 768 clear:both;
756 769 overflow:hidden;
757 770 background:#8FBDE0;
758 771 border:1px solid #6BACDE;
759 772 color:#003863;
760 773 }
761 774
762 775 #content div.box div.message-notice h6 {
763 776 color:#003863;
764 777 }
765 778
766 779 #content div.box div.message-success {
767 780 height:1%;
768 781 clear:both;
769 782 overflow:hidden;
770 783 background:#E6EFC2;
771 784 border:1px solid #C6D880;
772 785 color:#4e6100;
773 786 }
774 787
775 788 #content div.box div.message-success h6 {
776 789 color:#4e6100;
777 790 }
778 791
779 792 #content div.box div.form div.fields div.field {
780 793 height:1%;
781 794 border-bottom:1px solid #DDD;
782 795 clear:both;
783 796 margin:0;
784 797 padding:10px 0;
785 798 }
786 799
787 800 #content div.box div.form div.fields div.field-first {
788 801 padding:0 0 10px;
789 802 }
790 803
791 804 #content div.box div.form div.fields div.field-noborder {
792 805 border-bottom:0 !important;
793 806 }
794 807
795 808 #content div.box div.form div.fields div.field span.error-message {
796 809 height:1%;
797 810 display:inline-block;
798 811 color:red;
799 812 margin:8px 0 0 4px;
800 813 padding:0;
801 814 }
802 815
803 816 #content div.box div.form div.fields div.field span.success {
804 817 height:1%;
805 818 display:block;
806 819 color:#316309;
807 820 margin:8px 0 0;
808 821 padding:0;
809 822 }
810 823
811 824 #content div.box div.form div.fields div.field div.label {
812 825 left:80px;
813 826 width:auto;
814 827 position:absolute;
815 828 margin:0;
816 829 padding:8px 0 0 5px;
817 830 }
818 831
819 832 #content div.box-left div.form div.fields div.field div.label,#content div.box-right div.form div.fields div.field div.label {
820 833 clear:both;
821 834 overflow:hidden;
822 835 left:0;
823 836 width:auto;
824 837 position:relative;
825 838 margin:0;
826 839 padding:0 0 8px;
827 840 }
828 841
829 842 #content div.box div.form div.fields div.field div.label-select {
830 843 padding:5px 0 0 5px;
831 844 }
832 845
833 846 #content div.box-left div.form div.fields div.field div.label-select,#content div.box-right div.form div.fields div.field div.label-select {
834 847 padding:0 0 8px;
835 848 }
836 849
837 850 #content div.box-left div.form div.fields div.field div.label-textarea,#content div.box-right div.form div.fields div.field div.label-textarea {
838 851 padding:0 0 8px !important;
839 852 }
840 853
841 854 #content div.box div.form div.fields div.field div.label label {
842 855 color:#393939;
843 856 font-weight:700;
844 857 }
845 858
846 859 #content div.box div.form div.fields div.field div.input {
847 860 margin:0 0 0 200px;
848 861 }
849 862 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input {
850 863 margin:0 0 0 0px;
851 864 }
852 865
853 866 #content div.box div.form div.fields div.field div.input input {
854 867 background:#FFF;
855 868 border-top:1px solid #b3b3b3;
856 869 border-left:1px solid #b3b3b3;
857 870 border-right:1px solid #eaeaea;
858 871 border-bottom:1px solid #eaeaea;
859 872 color:#000;
860 873 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
861 874 font-size:11px;
862 875 margin:0;
863 876 padding:7px 7px 6px;
864 877 }
865 878
866 879
867 880
868 881 #content div.box div.form div.fields div.field div.input input.small {
869 882 width:30%;
870 883 }
871 884
872 885 #content div.box div.form div.fields div.field div.input input.medium {
873 886 width:55%;
874 887 }
875 888
876 889 #content div.box div.form div.fields div.field div.input input.large {
877 890 width:85%;
878 891 }
879 892
880 893 #content div.box div.form div.fields div.field div.input input.date {
881 894 width:177px;
882 895 }
883 896
884 897 #content div.box div.form div.fields div.field div.input input.button {
885 898 background:#D4D0C8;
886 899 border-top:1px solid #FFF;
887 900 border-left:1px solid #FFF;
888 901 border-right:1px solid #404040;
889 902 border-bottom:1px solid #404040;
890 903 color:#000;
891 904 margin:0;
892 905 padding:4px 8px;
893 906 }
894 907
895 908 #content div.box div.form div.fields div.field div.input a.ui-input-file {
896 909 width:28px;
897 910 height:28px;
898 911 display:inline;
899 912 position:absolute;
900 913 overflow:hidden;
901 914 cursor:pointer;
902 915 background:#e5e3e3 url("../images/button_browse.png") no-repeat;
903 916 border:none;
904 917 text-decoration:none;
905 918 margin:0 0 0 6px;
906 919 padding:0;
907 920 }
908 921
909 922 #content div.box div.form div.fields div.field div.textarea {
910 923 border-top:1px solid #b3b3b3;
911 924 border-left:1px solid #b3b3b3;
912 925 border-right:1px solid #eaeaea;
913 926 border-bottom:1px solid #eaeaea;
914 927 margin:0 0 0 200px;
915 928 padding:10px;
916 929 }
917 930
918 931 #content div.box div.form div.fields div.field div.textarea-editor {
919 932 border:1px solid #ddd;
920 933 padding:0;
921 934 }
922 935
923 936 #content div.box div.form div.fields div.field div.textarea textarea {
924 937 width:100%;
925 938 height:220px;
926 939 overflow:hidden;
927 940 background:#FFF;
928 941 color:#000;
929 942 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
930 943 font-size:11px;
931 944 outline:none;
932 945 border-width:0;
933 946 margin:0;
934 947 padding:0;
935 948 }
936 949
937 950 #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 {
938 951 width:100%;
939 952 height:100px;
940 953 }
941 954
942 955 #content div.box div.form div.fields div.field div.textarea table {
943 956 width:100%;
944 957 border:none;
945 958 margin:0;
946 959 padding:0;
947 960 }
948 961
949 962 #content div.box div.form div.fields div.field div.textarea table td {
950 963 background:#DDD;
951 964 border:none;
952 965 padding:0;
953 966 }
954 967
955 968 #content div.box div.form div.fields div.field div.textarea table td table {
956 969 width:auto;
957 970 border:none;
958 971 margin:0;
959 972 padding:0;
960 973 }
961 974
962 975 #content div.box div.form div.fields div.field div.textarea table td table td {
963 976 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
964 977 font-size:11px;
965 978 padding:5px 5px 5px 0;
966 979 }
967 980
968 981 #content div.box div.form div.fields div.field div.textarea table td table td a.mceButtonActive {
969 982 background:#b1b1b1;
970 983 }
971 984
972 985 #content div.box div.form div.fields div.field div.select a.ui-selectmenu {
973 986 color:#565656;
974 987 text-decoration:none;
975 988 }
976 989
977 990 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus {
978 991 background:#f6f6f6;
979 992 border-color:#666;
980 993 }
981 994
982 995 div.form div.fields div.field div.button {
983 996 margin:0;
984 997 padding:0 0 0 8px;
985 998 }
986 999
987 1000 div.form div.fields div.field div.highlight .ui-state-default {
988 1001 background:#4e85bb url("../images/button_highlight.png") repeat-x;
989 1002 border-top:1px solid #5c91a4;
990 1003 border-left:1px solid #2a6f89;
991 1004 border-right:1px solid #2b7089;
992 1005 border-bottom:1px solid #1a6480;
993 1006 color:#FFF;
994 1007 margin:0;
995 1008 padding:6px 12px;
996 1009 }
997 1010
998 1011 div.form div.fields div.field div.highlight .ui-state-hover {
999 1012 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
1000 1013 border-top:1px solid #78acbf;
1001 1014 border-left:1px solid #34819e;
1002 1015 border-right:1px solid #35829f;
1003 1016 border-bottom:1px solid #257897;
1004 1017 color:#FFF;
1005 1018 margin:0;
1006 1019 padding:6px 12px;
1007 1020 }
1008 1021
1009 1022 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-default {
1010 1023 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1011 1024 border-top:1px solid #5c91a4;
1012 1025 border-left:1px solid #2a6f89;
1013 1026 border-right:1px solid #2b7089;
1014 1027 border-bottom:1px solid #1a6480;
1015 1028 color:#fff;
1016 1029 margin:0;
1017 1030 padding:6px 12px;
1018 1031 }
1019 1032
1020 1033 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-hover {
1021 1034 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
1022 1035 border-top:1px solid #78acbf;
1023 1036 border-left:1px solid #34819e;
1024 1037 border-right:1px solid #35829f;
1025 1038 border-bottom:1px solid #257897;
1026 1039 color:#fff;
1027 1040 margin:0;
1028 1041 padding:6px 12px;
1029 1042 }
1030 1043
1031 1044 #content div.box table {
1032 1045 width:100%;
1033 1046 border-collapse:collapse;
1034 1047 margin:0;
1035 1048 padding:0;
1036 1049 }
1037 1050
1038 1051 #content div.box table th {
1039 1052 background:#eee;
1040 1053 border-bottom:1px solid #ddd;
1041 1054 padding:5px 0px 5px 5px;
1042 1055 }
1043 1056
1044 1057 #content div.box table th.left {
1045 1058 text-align:left;
1046 1059 }
1047 1060
1048 1061 #content div.box table th.right {
1049 1062 text-align:right;
1050 1063 }
1051 1064
1052 1065 #content div.box table th.center {
1053 1066 text-align:center;
1054 1067 }
1055 1068
1056 1069 #content div.box table th.selected {
1057 1070 vertical-align:middle;
1058 1071 padding:0;
1059 1072 }
1060 1073
1061 1074 #content div.box table td {
1062 1075 background:#fff;
1063 1076 border-bottom:1px solid #cdcdcd;
1064 1077 vertical-align:middle;
1065 1078 padding:5px;
1066 1079 }
1067 1080
1068 1081 #content div.box table tr.selected td {
1069 1082 background:#FFC;
1070 1083 }
1071 1084
1072 1085 #content div.box table td.selected {
1073 1086 width:3%;
1074 1087 text-align:center;
1075 1088 vertical-align:middle;
1076 1089 padding:0;
1077 1090 }
1078 1091
1079 1092 #content div.box table td.action {
1080 1093 width:45%;
1081 1094 text-align:left;
1082 1095 }
1083 1096
1084 1097 #content div.box table td.date {
1085 1098 width:33%;
1086 1099 text-align:center;
1087 1100 }
1088 1101
1089 1102 #content div.box div.action {
1090 1103 float:right;
1091 1104 background:#FFF;
1092 1105 text-align:right;
1093 1106 margin:10px 0 0;
1094 1107 padding:0;
1095 1108 }
1096 1109
1097 1110 #content div.box div.action select {
1098 1111 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1099 1112 font-size:11px;
1100 1113 margin:0;
1101 1114 }
1102 1115
1103 1116 #content div.box div.action .ui-selectmenu {
1104 1117 margin:0;
1105 1118 padding:0;
1106 1119 }
1107 1120
1108 1121 #content div.box div.pagination {
1109 1122 height:1%;
1110 1123 clear:both;
1111 1124 overflow:hidden;
1112 1125 margin:10px 0 0;
1113 1126 padding:0;
1114 1127 }
1115 1128
1116 1129 #content div.box div.pagination ul.pager {
1117 1130 float:right;
1118 1131 text-align:right;
1119 1132 margin:0;
1120 1133 padding:0;
1121 1134 }
1122 1135
1123 1136 #content div.box div.pagination ul.pager li {
1124 1137 height:1%;
1125 1138 float:left;
1126 1139 list-style:none;
1127 1140 background:#ebebeb url("../images/pager.png") repeat-x;
1128 1141 border-top:1px solid #dedede;
1129 1142 border-left:1px solid #cfcfcf;
1130 1143 border-right:1px solid #c4c4c4;
1131 1144 border-bottom:1px solid #c4c4c4;
1132 1145 color:#4A4A4A;
1133 1146 font-weight:700;
1134 1147 margin:0 0 0 4px;
1135 1148 padding:0;
1136 1149 }
1137 1150
1138 1151 #content div.box div.pagination ul.pager li.separator {
1139 1152 padding:6px;
1140 1153 }
1141 1154
1142 1155 #content div.box div.pagination ul.pager li.current {
1143 1156 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1144 1157 border-top:1px solid #ccc;
1145 1158 border-left:1px solid #bebebe;
1146 1159 border-right:1px solid #b1b1b1;
1147 1160 border-bottom:1px solid #afafaf;
1148 1161 color:#515151;
1149 1162 padding:6px;
1150 1163 }
1151 1164
1152 1165 #content div.box div.pagination ul.pager li a {
1153 1166 height:1%;
1154 1167 display:block;
1155 1168 float:left;
1156 1169 color:#515151;
1157 1170 text-decoration:none;
1158 1171 margin:0;
1159 1172 padding:6px;
1160 1173 }
1161 1174
1162 1175 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active {
1163 1176 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1164 1177 border-top:1px solid #ccc;
1165 1178 border-left:1px solid #bebebe;
1166 1179 border-right:1px solid #b1b1b1;
1167 1180 border-bottom:1px solid #afafaf;
1168 1181 margin:-1px;
1169 1182 }
1170 1183
1171 1184 #content div.box div.pagination-wh {
1172 1185 height:1%;
1173 1186 clear:both;
1174 1187 overflow:hidden;
1175 1188 text-align:right;
1176 1189 margin:10px 0 0;
1177 1190 padding:0;
1178 1191 }
1179 1192
1180 1193 #content div.box div.pagination-right {
1181 1194 float:right;
1182 1195 }
1183 1196
1184 1197 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot {
1185 1198 height:1%;
1186 1199 float:left;
1187 1200 background:#ebebeb url("../images/pager.png") repeat-x;
1188 1201 border-top:1px solid #dedede;
1189 1202 border-left:1px solid #cfcfcf;
1190 1203 border-right:1px solid #c4c4c4;
1191 1204 border-bottom:1px solid #c4c4c4;
1192 1205 color:#4A4A4A;
1193 1206 font-weight:700;
1194 1207 margin:0 0 0 4px;
1195 1208 padding:6px;
1196 1209 }
1197 1210
1198 1211 #content div.box div.pagination-wh span.pager_curpage {
1199 1212 height:1%;
1200 1213 float:left;
1201 1214 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1202 1215 border-top:1px solid #ccc;
1203 1216 border-left:1px solid #bebebe;
1204 1217 border-right:1px solid #b1b1b1;
1205 1218 border-bottom:1px solid #afafaf;
1206 1219 color:#515151;
1207 1220 font-weight:700;
1208 1221 margin:0 0 0 4px;
1209 1222 padding:6px;
1210 1223 }
1211 1224
1212 1225 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active {
1213 1226 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1214 1227 border-top:1px solid #ccc;
1215 1228 border-left:1px solid #bebebe;
1216 1229 border-right:1px solid #b1b1b1;
1217 1230 border-bottom:1px solid #afafaf;
1218 1231 text-decoration:none;
1219 1232 }
1220 1233
1221 1234 #content div.box div.traffic div.legend {
1222 1235 clear:both;
1223 1236 overflow:hidden;
1224 1237 border-bottom:1px solid #ddd;
1225 1238 margin:0 0 10px;
1226 1239 padding:0 0 10px;
1227 1240 }
1228 1241
1229 1242 #content div.box div.traffic div.legend h6 {
1230 1243 float:left;
1231 1244 border:none;
1232 1245 margin:0;
1233 1246 padding:0;
1234 1247 }
1235 1248
1236 1249 #content div.box div.traffic div.legend li {
1237 1250 list-style:none;
1238 1251 float:left;
1239 1252 font-size:11px;
1240 1253 margin:0;
1241 1254 padding:0 8px 0 4px;
1242 1255 }
1243 1256
1244 1257 #content div.box div.traffic div.legend li.visits {
1245 1258 border-left:12px solid #edc240;
1246 1259 }
1247 1260
1248 1261 #content div.box div.traffic div.legend li.pageviews {
1249 1262 border-left:12px solid #afd8f8;
1250 1263 }
1251 1264
1252 1265 #content div.box div.traffic table {
1253 1266 width:auto;
1254 1267 }
1255 1268
1256 1269 #content div.box div.traffic table td {
1257 1270 background:transparent;
1258 1271 border:none;
1259 1272 padding:2px 3px 3px;
1260 1273 }
1261 1274
1262 1275 #content div.box div.traffic table td.legendLabel {
1263 1276 padding:0 3px 2px;
1264 1277 }
1265 1278
1266 1279 #footer {
1267 1280 clear:both;
1268 1281 overflow:hidden;
1269 1282 text-align:right;
1270 1283 margin:0;
1271 1284 padding:0 30px 4px;
1272 1285 margin:-10px 0 0;
1273 1286 }
1274 1287
1275 1288 #footer div#footer-inner {
1276 1289 background:url("../images/header_inner.png") repeat-x scroll 0 0 #003367;
1277 1290 border-top:2px solid #FFFFFF;
1278 1291 }
1279 1292
1280 1293 #footer div#footer-inner p {
1281 1294 padding:15px 25px 15px 0;
1282 1295 color:#FFF;
1283 1296 font-weight:700;
1284 1297 }
1285 1298 #footer div#footer-inner .footer-link {
1286 1299 float:left;
1287 1300 padding-left:10px;
1288 1301 }
1289 1302 #footer div#footer-inner .footer-link a {
1290 1303 color:#FFF;
1291 1304 }
1292 1305
1293 1306 #login div.title {
1294 1307 width:420px;
1295 1308 clear:both;
1296 1309 overflow:hidden;
1297 1310 position:relative;
1298 1311 background:#003367 url("../../images/header_inner.png") repeat-x;
1299 1312 margin:0 auto;
1300 1313 padding:0;
1301 1314 }
1302 1315
1303 1316 #login div.inner {
1304 1317 width:380px;
1305 1318 background:#FFF url("../images/login.png") no-repeat top left;
1306 1319 border-top:none;
1307 1320 border-bottom:none;
1308 1321 margin:0 auto;
1309 1322 padding:20px;
1310 1323 }
1311 1324
1312 1325 #login div.form div.fields div.field div.label {
1313 1326 width:173px;
1314 1327 float:left;
1315 1328 text-align:right;
1316 1329 margin:2px 10px 0 0;
1317 1330 padding:5px 0 0 5px;
1318 1331 }
1319 1332
1320 1333 #login div.form div.fields div.field div.input input {
1321 1334 width:176px;
1322 1335 background:#FFF;
1323 1336 border-top:1px solid #b3b3b3;
1324 1337 border-left:1px solid #b3b3b3;
1325 1338 border-right:1px solid #eaeaea;
1326 1339 border-bottom:1px solid #eaeaea;
1327 1340 color:#000;
1328 1341 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1329 1342 font-size:11px;
1330 1343 margin:0;
1331 1344 padding:7px 7px 6px;
1332 1345 }
1333 1346
1334 1347 #login div.form div.fields div.buttons {
1335 1348 clear:both;
1336 1349 overflow:hidden;
1337 1350 border-top:1px solid #DDD;
1338 1351 text-align:right;
1339 1352 margin:0;
1340 1353 padding:10px 0 0;
1341 1354 }
1342 1355
1343 1356 #login div.form div.links {
1344 1357 clear:both;
1345 1358 overflow:hidden;
1346 1359 margin:10px 0 0;
1347 1360 padding:0 0 2px;
1348 1361 }
1349 1362
1350 1363 #register div.title {
1351 1364 clear:both;
1352 1365 overflow:hidden;
1353 1366 position:relative;
1354 1367 background:#003367 url("../images/header_inner.png") repeat-x;
1355 1368 margin:0 auto;
1356 1369 padding:0;
1357 1370 }
1358 1371
1359 1372 #register div.inner {
1360 1373 background:#FFF;
1361 1374 border-top:none;
1362 1375 border-bottom:none;
1363 1376 margin:0 auto;
1364 1377 padding:20px;
1365 1378 }
1366 1379
1367 1380 #register div.form div.fields div.field div.label {
1368 1381 width:135px;
1369 1382 float:left;
1370 1383 text-align:right;
1371 1384 margin:2px 10px 0 0;
1372 1385 padding:5px 0 0 5px;
1373 1386 }
1374 1387
1375 1388 #register div.form div.fields div.field div.input input {
1376 1389 width:300px;
1377 1390 background:#FFF;
1378 1391 border-top:1px solid #b3b3b3;
1379 1392 border-left:1px solid #b3b3b3;
1380 1393 border-right:1px solid #eaeaea;
1381 1394 border-bottom:1px solid #eaeaea;
1382 1395 color:#000;
1383 1396 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1384 1397 font-size:11px;
1385 1398 margin:0;
1386 1399 padding:7px 7px 6px;
1387 1400 }
1388 1401
1389 1402 #register div.form div.fields div.buttons {
1390 1403 clear:both;
1391 1404 overflow:hidden;
1392 1405 border-top:1px solid #DDD;
1393 1406 text-align:left;
1394 1407 margin:0;
1395 1408 padding:10px 0 0 114px;
1396 1409 }
1397 1410
1398 1411 #register div.form div.fields div.buttons div.highlight input.ui-state-default {
1399 1412 background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB;
1400 1413 color:#FFF;
1401 1414 border-color:#5C91A4 #2B7089 #1A6480 #2A6F89;
1402 1415 border-style:solid;
1403 1416 border-width:1px;
1404 1417 }
1405 1418
1406 1419 #register div.form div.activation_msg {
1407 1420 padding-top:4px;
1408 1421 padding-bottom:4px;
1409 1422 }
1410 1423
1411 1424 .trending_language_tbl,.trending_language_tbl td {
1412 1425 border:0 !important;
1413 1426 margin:0 !important;
1414 1427 padding:0 !important;
1415 1428 }
1416 1429
1417 1430 .trending_language {
1418 1431 background-color:#003367;
1419 1432 color:#FFF;
1420 1433 display:block;
1421 1434 min-width:20px;
1422 1435 text-decoration:none;
1423 1436 height:12px;
1424 1437 margin-bottom:4px;
1425 1438 margin-left:5px;
1426 1439 white-space:pre;
1427 1440 padding:3px;
1428 1441 }
1429 1442
1430 1443 h3.files_location {
1431 1444 font-size:1.8em;
1432 1445 font-weight:700;
1433 1446 border-bottom:none !important;
1434 1447 margin:10px 0 !important;
1435 1448 }
1436 1449
1437 1450 #files_data dl dt {
1438 1451 float:left;
1439 1452 width:115px;
1440 1453 margin:0 !important;
1441 1454 padding:5px;
1442 1455 }
1443 1456
1444 1457 #files_data dl dd {
1445 1458 margin:0 !important;
1446 1459 padding:5px !important;
1447 1460 }
1448 1461
1449 1462 #changeset_content {
1450 1463 border:1px solid #CCC;
1451 1464 padding:5px;
1452 1465 }
1453 1466
1454 1467 #changeset_content .container {
1455 1468 min-height:120px;
1456 1469 font-size:1.2em;
1457 1470 overflow:hidden;
1458 1471 }
1459 1472
1460 1473 #changeset_content .container .right {
1461 1474 float:right;
1462 1475 width:25%;
1463 1476 text-align:right;
1464 1477 }
1465 1478
1466 1479 #changeset_content .container .left .message {
1467 1480 font-style:italic;
1468 1481 color:#556CB5;
1469 1482 white-space:pre-wrap;
1470 1483 }
1471 1484
1472 1485 .cs_files .cs_added {
1473 1486 background:url("../images/icons/page_white_add.png") no-repeat scroll 3px;
1474 1487 height:16px;
1475 1488 padding-left:20px;
1476 1489 margin-top:7px;
1477 1490 text-align:left;
1478 1491 }
1479 1492
1480 1493 .cs_files .cs_changed {
1481 1494 background:url("../images/icons/page_white_edit.png") no-repeat scroll 3px;
1482 1495 height:16px;
1483 1496 padding-left:20px;
1484 1497 margin-top:7px;
1485 1498 text-align:left;
1486 1499 }
1487 1500
1488 1501 .cs_files .cs_removed {
1489 1502 background:url("../images/icons/page_white_delete.png") no-repeat scroll 3px;
1490 1503 height:16px;
1491 1504 padding-left:20px;
1492 1505 margin-top:7px;
1493 1506 text-align:left;
1494 1507 }
1495 1508
1496 1509 #graph {
1497 1510 overflow:hidden;
1498 1511 }
1499 1512
1500 1513 #graph_nodes {
1501 1514 width:160px;
1502 1515 float:left;
1503 1516 margin-left:-50px;
1504 1517 margin-top:5px;
1505 1518 }
1506 1519
1507 1520 #graph_content {
1508 1521 width:800px;
1509 1522 float:left;
1510 1523 }
1511 1524
1512 1525 #graph_content .container_header {
1513 1526 border:1px solid #CCC;
1514 1527 padding:10px;
1515 1528 }
1516 1529
1517 1530 #graph_content .container {
1518 1531 border-bottom:1px solid #CCC;
1519 1532 border-left:1px solid #CCC;
1520 1533 border-right:1px solid #CCC;
1521 1534 min-height:80px;
1522 1535 overflow:hidden;
1523 1536 font-size:1.2em;
1524 1537 }
1525 1538
1526 1539 #graph_content .container .right {
1527 1540 float:right;
1528 1541 width:28%;
1529 1542 text-align:right;
1530 1543 padding-bottom:5px;
1531 1544 }
1532 1545
1533 1546 #graph_content .container .left .date {
1534 1547 font-weight:700;
1535 1548 padding-bottom:5px;
1536 1549 }
1537 1550
1538 1551 #graph_content .container .left .message {
1539 1552 font-size:100%;
1540 1553 padding-top:3px;
1541 1554 white-space:pre-wrap;
1542 1555 }
1543 1556
1544 1557 .right div {
1545 1558 clear:both;
1546 1559 }
1547 1560
1548 1561 .right .changes .added,.changed,.removed {
1549 1562 border:1px solid #DDD;
1550 1563 display:block;
1551 1564 float:right;
1552 1565 text-align:center;
1553 1566 min-width:15px;
1554 1567 }
1555 1568
1556 1569 .right .changes .added {
1557 1570 background:#BFB;
1558 1571 }
1559 1572
1560 1573 .right .changes .changed {
1561 1574 background:#FD8;
1562 1575 }
1563 1576
1564 1577 .right .changes .removed {
1565 1578 background:#F88;
1566 1579 }
1567 1580
1568 1581 .right .merge {
1569 1582 vertical-align:top;
1570 1583 font-size:0.75em;
1571 1584 font-weight:700;
1572 1585 }
1573 1586
1574 1587 .right .parent {
1575 1588 font-size:90%;
1576 1589 font-family:monospace;
1577 1590 }
1578 1591
1579 1592 .right .logtags .branchtag {
1580 1593 background:#FFF url("../images/icons/arrow_branch.png") no-repeat right 6px;
1581 1594 display:block;
1582 1595 font-size:0.8em;
1583 1596 padding:11px 16px 0 0;
1584 1597 }
1585 1598
1586 1599 .right .logtags .tagtag {
1587 1600 background:#FFF url("../images/icons/tag_blue.png") no-repeat right 6px;
1588 1601 display:block;
1589 1602 font-size:0.8em;
1590 1603 padding:11px 16px 0 0;
1591 1604 }
1592 1605
1593 1606 div.browserblock {
1594 1607 overflow:hidden;
1595 1608 border:1px solid #ccc;
1596 1609 background:#f8f8f8;
1597 1610 font-size:100%;
1598 1611 line-height:125%;
1599 1612 padding:0;
1600 1613 }
1601 1614
1602 1615 div.browserblock .browser-header {
1603 1616 border-bottom:1px solid #CCC;
1604 1617 background:#FFF;
1605 1618 color:blue;
1606 1619 padding:10px 0;
1607 1620 }
1608 1621
1609 1622 div.browserblock .browser-header span {
1610 1623 margin-left:25px;
1611 1624 font-weight:700;
1612 1625 }
1613 1626
1614 1627 div.browserblock .browser-body {
1615 1628 background:#EEE;
1616 1629 }
1617 1630
1618 1631 table.code-browser {
1619 1632 border-collapse:collapse;
1620 1633 width:100%;
1621 1634 }
1622 1635
1623 1636 table.code-browser tr {
1624 1637 margin:3px;
1625 1638 }
1626 1639
1627 1640 table.code-browser thead th {
1628 1641 background-color:#EEE;
1629 1642 height:20px;
1630 1643 font-size:1.1em;
1631 1644 font-weight:700;
1632 1645 text-align:left;
1633 1646 padding-left:10px;
1634 1647 }
1635 1648
1636 1649 table.code-browser tbody td {
1637 1650 padding-left:10px;
1638 1651 height:20px;
1639 1652 }
1640 1653
1641 1654 table.code-browser .browser-file {
1642 1655 background:url("../images/icons/document_16.png") no-repeat scroll 3px;
1643 1656 height:16px;
1644 1657 padding-left:20px;
1645 1658 text-align:left;
1646 1659 }
1647 1660
1648 1661 table.code-browser .browser-dir {
1649 1662 background:url("../images/icons/folder_16.png") no-repeat scroll 3px;
1650 1663 height:16px;
1651 1664 padding-left:20px;
1652 1665 text-align:left;
1653 1666 }
1654 1667
1655 1668 .box .search {
1656 1669 clear:both;
1657 1670 overflow:hidden;
1658 1671 margin:0;
1659 1672 padding:0 20px 10px;
1660 1673 }
1661 1674
1662 1675 .box .search div.search_path {
1663 1676 background:none repeat scroll 0 0 #EEE;
1664 1677 border:1px solid #CCC;
1665 1678 color:blue;
1666 1679 margin-bottom:10px;
1667 1680 padding:10px 0;
1668 1681 }
1669 1682
1670 1683 .box .search div.search_path div.link {
1671 1684 font-weight:700;
1672 1685 margin-left:25px;
1673 1686 }
1674 1687
1675 1688 .box .search div.search_path div.link a {
1676 1689 color:#003367;
1677 1690 cursor:pointer;
1678 1691 text-decoration:none;
1679 1692 }
1680 1693
1681 1694 #path_unlock {
1682 1695 color:red;
1683 1696 font-size:1.2em;
1684 1697 padding-left:4px;
1685 1698 }
1686 1699
1687 1700 .info_box * {
1688 1701 background:url("../../images/pager.png") repeat-x scroll 0 0 #EBEBEB;
1689 1702 color:#4A4A4A;
1690 1703 font-weight:700;
1691 1704 height:1%;
1692 1705 display:inline;
1693 1706 border-color:#DEDEDE #C4C4C4 #C4C4C4 #CFCFCF;
1694 1707 border-style:solid;
1695 1708 border-width:1px;
1696 1709 padding:4px 6px;
1697 1710 }
1698 1711
1699 1712 .info_box span {
1700 1713 margin-left:3px;
1701 1714 margin-right:3px;
1702 1715 }
1703 1716
1704 1717 .info_box input#at_rev {
1705 1718 text-align:center;
1706 1719 padding:5px 3px 3px 2px;
1707 1720 }
1708 1721
1709 1722 .info_box input#view {
1710 1723 text-align:center;
1711 1724 padding:4px 3px 2px 2px;
1712 1725 }
1713 1726
1714 1727 .yui-overlay,.yui-panel-container {
1715 1728 visibility:hidden;
1716 1729 position:absolute;
1717 1730 z-index:2;
1718 1731 }
1719 1732
1720 1733 .yui-tt {
1721 1734 visibility:hidden;
1722 1735 position:absolute;
1723 1736 color:#666;
1724 1737 background-color:#FFF;
1725 1738 font-family:arial, helvetica, verdana, sans-serif;
1726 1739 border:2px solid #003367;
1727 1740 font:100% sans-serif;
1728 1741 width:auto;
1729 1742 opacity:1px;
1730 1743 padding:8px;
1731 1744 white-space: pre;
1732 1745 }
1733 1746
1734 1747 .ac {
1735 1748 vertical-align:top;
1736 1749 }
1737 1750
1738 1751 .ac .yui-ac {
1739 1752 position:relative;
1740 1753 font-family:arial;
1741 1754 font-size:100%;
1742 1755 }
1743 1756
1744 1757 .ac .perm_ac {
1745 1758 width:15em;
1746 1759 }
1747 1760
1748 1761 .ac .yui-ac-input {
1749 1762 width:100%;
1750 1763 }
1751 1764
1752 1765 .ac .yui-ac-container {
1753 1766 position:absolute;
1754 1767 top:1.6em;
1755 1768 width:100%;
1756 1769 }
1757 1770
1758 1771 .ac .yui-ac-content {
1759 1772 position:absolute;
1760 1773 width:100%;
1761 1774 border:1px solid gray;
1762 1775 background:#fff;
1763 1776 overflow:hidden;
1764 1777 z-index:9050;
1765 1778 }
1766 1779
1767 1780 .ac .yui-ac-shadow {
1768 1781 position:absolute;
1769 1782 width:100%;
1770 1783 background:#000;
1771 1784 -moz-opacity:0.1px;
1772 1785 opacity:.10;
1773 1786 filter:alpha(opacity = 10);
1774 1787 z-index:9049;
1775 1788 margin:.3em;
1776 1789 }
1777 1790
1778 1791 .ac .yui-ac-content ul {
1779 1792 width:100%;
1780 1793 margin:0;
1781 1794 padding:0;
1782 1795 }
1783 1796
1784 1797 .ac .yui-ac-content li {
1785 1798 cursor:default;
1786 1799 white-space:nowrap;
1787 1800 margin:0;
1788 1801 padding:2px 5px;
1789 1802 }
1790 1803
1791 1804 .ac .yui-ac-content li.yui-ac-prehighlight {
1792 1805 background:#B3D4FF;
1793 1806 }
1794 1807
1795 1808 .ac .yui-ac-content li.yui-ac-highlight {
1796 1809 background:#556CB5;
1797 1810 color:#FFF;
1798 1811 }
1799 1812
1800 1813 .follow{
1801 1814 background:url("../images/icons/heart_add.png") no-repeat scroll 3px;
1802 1815 height: 16px;
1803 1816 width: 20px;
1804 1817 cursor: pointer;
1805 1818 display: block;
1806 1819 float: right;
1807 1820 margin-top: 2px;
1808 1821 }
1809 1822
1810 1823 .following{
1811 1824 background:url("../images/icons/heart_delete.png") no-repeat scroll 3px;
1812 1825 height: 16px;
1813 1826 width: 20px;
1814 1827 cursor: pointer;
1815 1828 display: block;
1816 1829 float: right;
1817 1830 margin-top: 2px;
1818 1831 }
1819 1832
1820 1833 .currently_following{
1821 1834
1822 1835 padding-left: 10px;
1823 1836 padding-bottom:5px;
1824 1837
1825 1838 }
1826 1839
1827 1840
1828 1841
1829 1842 .add_icon {
1830 1843 background:url("../images/icons/add.png") no-repeat scroll 3px;
1831 1844 height:16px;
1832 1845 padding-left:20px;
1833 1846 padding-top:1px;
1834 1847 text-align:left;
1835 1848 }
1836 1849
1837 1850 .edit_icon {
1838 1851 background:url("../images/icons/folder_edit.png") no-repeat scroll 3px;
1839 1852 height:16px;
1840 1853 padding-left:20px;
1841 1854 padding-top:1px;
1842 1855 text-align:left;
1843 1856 }
1844 1857
1845 1858 .delete_icon {
1846 1859 background:url("../images/icons/delete.png") no-repeat scroll 3px;
1847 1860 height:16px;
1848 1861 padding-left:20px;
1849 1862 padding-top:1px;
1850 1863 text-align:left;
1851 1864 }
1852 1865
1853 1866 .refresh_icon {
1854 1867 background:url("../images/icons/arrow_refresh.png") no-repeat scroll 3px;
1855 1868 height:16px;
1856 1869 padding-left:20px;
1857 1870 padding-top:1px;
1858 1871 text-align:left;
1859 1872 }
1860 1873
1861 1874 .rss_icon {
1862 1875 background:url("../images/icons/rss_16.png") no-repeat scroll 3px;
1863 1876 height:16px;
1864 1877 padding-left:20px;
1865 1878 padding-top:1px;
1866 1879 text-align:left;
1867 1880 }
1868 1881
1869 1882 .atom_icon {
1870 1883 background:url("../images/icons/atom.png") no-repeat scroll 3px;
1871 1884 height:16px;
1872 1885 padding-left:20px;
1873 1886 padding-top:1px;
1874 1887 text-align:left;
1875 1888 }
1876 1889
1877 1890 .archive_icon {
1878 1891 background:url("../images/icons/compress.png") no-repeat scroll 3px;
1879 1892 height:16px;
1880 1893 padding-left:20px;
1881 1894 text-align:left;
1882 1895 padding-top:1px;
1883 1896 }
1884 1897
1885 1898 .action_button {
1886 1899 border:0;
1887 1900 display:block;
1888 1901 }
1889 1902
1890 1903 .action_button:hover {
1891 1904 border:0;
1892 1905 text-decoration:underline;
1893 1906 cursor:pointer;
1894 1907 }
1895 1908
1896 1909 #switch_repos {
1897 1910 position:absolute;
1898 1911 height:25px;
1899 1912 z-index:1;
1900 1913 }
1901 1914
1902 1915 #switch_repos select {
1903 1916 min-width:150px;
1904 1917 max-height:250px;
1905 1918 z-index:1;
1906 1919 }
1907 1920
1908 1921 .breadcrumbs {
1909 1922 border:medium none;
1910 1923 color:#FFF;
1911 1924 float:left;
1912 1925 text-transform:uppercase;
1913 1926 font-weight:700;
1914 1927 font-size:14px;
1915 1928 margin:0;
1916 1929 padding:11px 0 11px 10px;
1917 1930 }
1918 1931
1919 1932 .breadcrumbs a {
1920 1933 color:#FFF;
1921 1934 }
1922 1935
1923 1936 .flash_msg ul {
1924 1937 margin:0;
1925 1938 padding:0 0 10px;
1926 1939 }
1927 1940
1928 1941 .error_msg {
1929 1942 background-color:#FFCFCF;
1930 1943 background-image:url("../../images/icons/error_msg.png");
1931 1944 border:1px solid #FF9595;
1932 1945 color:#C30;
1933 1946 }
1934 1947
1935 1948 .warning_msg {
1936 1949 background-color:#FFFBCC;
1937 1950 background-image:url("../../images/icons/warning_msg.png");
1938 1951 border:1px solid #FFF35E;
1939 1952 color:#C69E00;
1940 1953 }
1941 1954
1942 1955 .success_msg {
1943 1956 background-color:#D5FFCF;
1944 1957 background-image:url("../../images/icons/success_msg.png");
1945 1958 border:1px solid #97FF88;
1946 1959 color:#090;
1947 1960 }
1948 1961
1949 1962 .notice_msg {
1950 1963 background-color:#DCE3FF;
1951 1964 background-image:url("../../images/icons/notice_msg.png");
1952 1965 border:1px solid #93A8FF;
1953 1966 color:#556CB5;
1954 1967 }
1955 1968
1956 1969 .success_msg,.error_msg,.notice_msg,.warning_msg {
1957 1970 background-position:10px center;
1958 1971 background-repeat:no-repeat;
1959 1972 font-size:12px;
1960 1973 font-weight:700;
1961 1974 min-height:14px;
1962 1975 line-height:14px;
1963 1976 margin-bottom:0;
1964 1977 margin-top:0;
1965 1978 display:block;
1966 1979 overflow:auto;
1967 1980 padding:6px 10px 6px 40px;
1968 1981 }
1969 1982
1970 1983 #msg_close {
1971 1984 background:transparent url("../../icons/cross_grey_small.png") no-repeat scroll 0 0;
1972 1985 cursor:pointer;
1973 1986 height:16px;
1974 1987 position:absolute;
1975 1988 right:5px;
1976 1989 top:5px;
1977 1990 width:16px;
1978 1991 }
1979 1992
1980 1993 div#legend_container table,div#legend_choices table {
1981 1994 width:auto !important;
1982 1995 }
1983 1996
1984 1997 table#permissions_manage {
1985 1998 width:0 !important;
1986 1999 }
1987 2000
1988 2001 table#permissions_manage span.private_repo_msg {
1989 2002 font-size:0.8em;
1990 2003 opacity:0.6px;
1991 2004 }
1992 2005
1993 2006 table#permissions_manage td.private_repo_msg {
1994 2007 font-size:0.8em;
1995 2008 }
1996 2009
1997 2010 table#permissions_manage tr#add_perm_input td {
1998 2011 vertical-align:middle;
1999 2012 }
2000 2013
2001 2014 div.gravatar {
2002 2015 background-color:#FFF;
2003 2016 border:1px solid #D0D0D0;
2004 2017 float:left;
2005 2018 margin-right:0.7em;
2006 2019 padding:2px 2px 0;
2007 2020 }
2008 2021
2009 2022 #header,#content,#footer {
2010 2023 min-width:1024px;
2011 2024 }
2012 2025
2013 2026 #content {
2014 2027 min-height:100%;
2015 2028 clear:both;
2016 2029 overflow:hidden;
2017 2030 padding:14px 30px;
2018 2031 }
2019 2032
2020 2033 #content div.box div.title div.search {
2021 2034 background:url("../../images/title_link.png") no-repeat top left;
2022 2035 border-left:1px solid #316293;
2023 2036 }
2024 2037
2025 2038 #content div.box div.title div.search div.input input {
2026 2039 border:1px solid #316293;
2027 2040 }
2028 2041
2029 2042 #content div.box div.title div.search div.button input.ui-state-default {
2030 2043 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
2031 2044 border:1px solid #316293;
2032 2045 border-left:none;
2033 2046 color:#FFF;
2034 2047 }
2035 2048
2036 2049 #content div.box div.title div.search div.button input.ui-state-hover {
2037 2050 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
2038 2051 border:1px solid #316293;
2039 2052 border-left:none;
2040 2053 color:#FFF;
2041 2054 }
2042 2055
2043 2056 #content div.box div.form div.fields div.field div.highlight .ui-state-default {
2044 2057 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
2045 2058 border-top:1px solid #5c91a4;
2046 2059 border-left:1px solid #2a6f89;
2047 2060 border-right:1px solid #2b7089;
2048 2061 border-bottom:1px solid #1a6480;
2049 2062 color:#fff;
2050 2063 }
2051 2064
2052 2065 #content div.box div.form div.fields div.field div.highlight .ui-state-hover {
2053 2066 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
2054 2067 border-top:1px solid #78acbf;
2055 2068 border-left:1px solid #34819e;
2056 2069 border-right:1px solid #35829f;
2057 2070 border-bottom:1px solid #257897;
2058 2071 color:#fff;
2059 2072 }
2060 2073
2061 2074 ins,div.options a:hover {
2062 2075 text-decoration:none;
2063 2076 }
2064 2077
2065 2078 img,#header #header-inner #quick li a:hover span.normal,#header #header-inner #quick li ul li.last,#content div.box div.form div.fields div.field div.textarea table td table td a,#clone_url {
2066 2079 border:none;
2067 2080 }
2068 2081
2069 2082 img.icon,.right .merge img {
2070 2083 vertical-align:bottom;
2071 2084 }
2072 2085
2073 2086 #header ul#logged-user,#content div.box div.title ul.links,#content div.box div.message div.dismiss,#content div.box div.traffic div.legend ul {
2074 2087 float:right;
2075 2088 margin:0;
2076 2089 padding:0;
2077 2090 }
2078 2091
2079 2092 #header #header-inner #home,#header #header-inner #logo,#content div.box ul.left,#content div.box ol.left,#content div.box div.pagination-left,div#commit_history,div#legend_data,div#legend_container,div#legend_choices {
2080 2093 float:left;
2081 2094 }
2082 2095
2083 2096 #header #header-inner #quick li:hover ul ul,#header #header-inner #quick li:hover ul ul ul,#header #header-inner #quick li:hover ul ul ul ul,#content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow {
2084 2097 display:none;
2085 2098 }
2086 2099
2087 2100 #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 {
2088 2101 display:block;
2089 2102 }
2090 2103
2091 2104 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a {
2092 2105 color:#bfe3ff;
2093 2106 }
2094 2107
2095 2108 #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 {
2096 2109 margin:10px 24px 10px 44px;
2097 2110 }
2098 2111
2099 2112 #content div.box div.form,#content div.box div.table,#content div.box div.traffic {
2100 2113 clear:both;
2101 2114 overflow:hidden;
2102 2115 margin:0;
2103 2116 padding:0 20px 10px;
2104 2117 }
2105 2118
2106 2119 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields {
2107 2120 clear:both;
2108 2121 overflow:hidden;
2109 2122 margin:0;
2110 2123 padding:0;
2111 2124 }
2112 2125
2113 2126 #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 {
2114 2127 height:1%;
2115 2128 display:block;
2116 2129 color:#363636;
2117 2130 margin:0;
2118 2131 padding:2px 0 0;
2119 2132 }
2120 2133
2121 2134 #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 {
2122 2135 background:#FBE3E4;
2123 2136 border-top:1px solid #e1b2b3;
2124 2137 border-left:1px solid #e1b2b3;
2125 2138 border-right:1px solid #FBC2C4;
2126 2139 border-bottom:1px solid #FBC2C4;
2127 2140 }
2128 2141
2129 2142 #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 {
2130 2143 background:#E6EFC2;
2131 2144 border-top:1px solid #cebb98;
2132 2145 border-left:1px solid #cebb98;
2133 2146 border-right:1px solid #c6d880;
2134 2147 border-bottom:1px solid #c6d880;
2135 2148 }
2136 2149
2137 2150 #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 {
2138 2151 margin:0;
2139 2152 }
2140 2153
2141 2154 #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{
2142 2155 margin:0 0 0 0px !important;
2143 2156 padding:0;
2144 2157 }
2145 2158
2146 2159 #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 {
2147 2160 margin:0 0 0 200px;
2148 2161 padding:0;
2149 2162 }
2150 2163
2151 2164
2152 2165 #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 {
2153 2166 color:#000;
2154 2167 text-decoration:none;
2155 2168 }
2156 2169
2157 2170 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus {
2158 2171 border:1px solid #666;
2159 2172 }
2160 2173
2161 2174 #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 {
2162 2175 clear:both;
2163 2176 overflow:hidden;
2164 2177 margin:0;
2165 2178 padding:8px 0 2px;
2166 2179 }
2167 2180
2168 2181 #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 {
2169 2182 float:left;
2170 2183 margin:0;
2171 2184 }
2172 2185
2173 2186 #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 {
2174 2187 height:1%;
2175 2188 display:block;
2176 2189 float:left;
2177 2190 margin:2px 0 0 4px;
2178 2191 }
2179 2192
2180 2193 div.form div.fields div.field div.button input,#content div.box div.form div.fields div.buttons input,div.form div.fields div.buttons input,#content div.box div.action div.button input {
2181 2194 color:#000;
2182 2195 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
2183 2196 font-size:11px;
2184 2197 font-weight:700;
2185 2198 margin:0;
2186 2199 }
2187 2200
2188 2201 div.form div.fields div.field div.button .ui-state-default,#content div.box div.form div.fields div.buttons input.ui-state-default {
2189 2202 background:#e5e3e3 url("../images/button.png") repeat-x;
2190 2203 border-top:1px solid #DDD;
2191 2204 border-left:1px solid #c6c6c6;
2192 2205 border-right:1px solid #DDD;
2193 2206 border-bottom:1px solid #c6c6c6;
2194 2207 color:#515151;
2195 2208 outline:none;
2196 2209 margin:0;
2197 2210 padding:6px 12px;
2198 2211 }
2199 2212
2200 2213 div.form div.fields div.field div.button .ui-state-hover,#content div.box div.form div.fields div.buttons input.ui-state-hover {
2201 2214 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2202 2215 border-top:1px solid #ccc;
2203 2216 border-left:1px solid #bebebe;
2204 2217 border-right:1px solid #b1b1b1;
2205 2218 border-bottom:1px solid #afafaf;
2206 2219 color:#515151;
2207 2220 outline:none;
2208 2221 margin:0;
2209 2222 padding:6px 12px;
2210 2223 }
2211 2224
2212 2225 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight {
2213 2226 display:inline;
2214 2227 }
2215 2228
2216 2229 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons {
2217 2230 margin:10px 0 0 200px;
2218 2231 padding:0;
2219 2232 }
2220 2233
2221 2234 #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 {
2222 2235 margin:10px 0 0;
2223 2236 }
2224 2237
2225 2238 #content div.box table td.user,#content div.box table td.address {
2226 2239 width:10%;
2227 2240 text-align:center;
2228 2241 }
2229 2242
2230 2243 #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 {
2231 2244 text-align:right;
2232 2245 margin:6px 0 0;
2233 2246 padding:0;
2234 2247 }
2235 2248
2236 2249 #content div.box div.action div.button input.ui-state-default,#login div.form div.fields div.buttons input.ui-state-default,#register div.form div.fields div.buttons input.ui-state-default {
2237 2250 background:#e5e3e3 url("../images/button.png") repeat-x;
2238 2251 border-top:1px solid #DDD;
2239 2252 border-left:1px solid #c6c6c6;
2240 2253 border-right:1px solid #DDD;
2241 2254 border-bottom:1px solid #c6c6c6;
2242 2255 color:#515151;
2243 2256 margin:0;
2244 2257 padding:6px 12px;
2245 2258 }
2246 2259
2247 2260 #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 {
2248 2261 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2249 2262 border-top:1px solid #ccc;
2250 2263 border-left:1px solid #bebebe;
2251 2264 border-right:1px solid #b1b1b1;
2252 2265 border-bottom:1px solid #afafaf;
2253 2266 color:#515151;
2254 2267 margin:0;
2255 2268 padding:6px 12px;
2256 2269 }
2257 2270
2258 2271 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results {
2259 2272 text-align:left;
2260 2273 float:left;
2261 2274 margin:0;
2262 2275 padding:0;
2263 2276 }
2264 2277
2265 2278 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span {
2266 2279 height:1%;
2267 2280 display:block;
2268 2281 float:left;
2269 2282 background:#ebebeb url("../images/pager.png") repeat-x;
2270 2283 border-top:1px solid #dedede;
2271 2284 border-left:1px solid #cfcfcf;
2272 2285 border-right:1px solid #c4c4c4;
2273 2286 border-bottom:1px solid #c4c4c4;
2274 2287 color:#4A4A4A;
2275 2288 font-weight:700;
2276 2289 margin:0;
2277 2290 padding:6px 8px;
2278 2291 }
2279 2292
2280 2293 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled {
2281 2294 color:#B4B4B4;
2282 2295 padding:6px;
2283 2296 }
2284 2297
2285 2298 #login,#register {
2286 2299 width:520px;
2287 2300 margin:10% auto 0;
2288 2301 padding:0;
2289 2302 }
2290 2303
2291 2304 #login div.color,#register div.color {
2292 2305 clear:both;
2293 2306 overflow:hidden;
2294 2307 background:#FFF;
2295 2308 margin:10px auto 0;
2296 2309 padding:3px 3px 3px 0;
2297 2310 }
2298 2311
2299 2312 #login div.color a,#register div.color a {
2300 2313 width:20px;
2301 2314 height:20px;
2302 2315 display:block;
2303 2316 float:left;
2304 2317 margin:0 0 0 3px;
2305 2318 padding:0;
2306 2319 }
2307 2320
2308 2321 #login div.title h5,#register div.title h5 {
2309 2322 color:#fff;
2310 2323 margin:10px;
2311 2324 padding:0;
2312 2325 }
2313 2326
2314 2327 #login div.form div.fields div.field,#register div.form div.fields div.field {
2315 2328 clear:both;
2316 2329 overflow:hidden;
2317 2330 margin:0;
2318 2331 padding:0 0 10px;
2319 2332 }
2320 2333
2321 2334 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message {
2322 2335 height:1%;
2323 2336 display:block;
2324 2337 color:red;
2325 2338 margin:8px 0 0;
2326 2339 padding:0;
2327 2340 max-width: 320px;
2328 2341 }
2329 2342
2330 2343 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label {
2331 2344 color:#000;
2332 2345 font-weight:700;
2333 2346 }
2334 2347
2335 2348 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input {
2336 2349 float:left;
2337 2350 margin:0;
2338 2351 padding:0;
2339 2352 }
2340 2353
2341 2354 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox {
2342 2355 margin:0 0 0 184px;
2343 2356 padding:0;
2344 2357 }
2345 2358
2346 2359 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label {
2347 2360 color:#565656;
2348 2361 font-weight:700;
2349 2362 }
2350 2363
2351 2364 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input {
2352 2365 color:#000;
2353 2366 font-size:1em;
2354 2367 font-weight:700;
2355 2368 font-family:Verdana, Helvetica, Sans-Serif;
2356 2369 margin:0;
2357 2370 }
2358 2371
2359 2372 #changeset_content .container .wrapper,#graph_content .container .wrapper {
2360 2373 width:600px;
2361 2374 }
2362 2375
2363 2376 #changeset_content .container .left,#graph_content .container .left {
2364 2377 float:left;
2365 2378 width:70%;
2366 2379 padding-left:5px;
2367 2380 }
2368 2381
2369 2382 #changeset_content .container .left .date,.ac .match {
2370 2383 font-weight:700;
2371 2384 padding-top: 5px;
2372 2385 padding-bottom:5px;
2373 2386 }
2374 2387
2375 2388 div#legend_container table td,div#legend_choices table td {
2376 2389 border:none !important;
2377 2390 height:20px !important;
2378 2391 padding:0 !important;
2379 2392 }
2380 2393
2381 2394 #q_filter{
2382 2395 border:0 none;
2383 2396 color:#AAAAAA;
2384 2397 margin-bottom:-4px;
2385 2398 margin-top:-4px;
2386 2399 padding-left:3px;
2387 2400 }
2388 2401
@@ -1,354 +1,362 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 3 <html xmlns="http://www.w3.org/1999/xhtml" id="mainhtml">
4 4 <head>
5 5 <title>${next.title()}</title>
6 6 <link rel="icon" href="/images/icons/database_gear.png" type="image/png" />
7 7 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8 8 <meta name="robots" content="index, nofollow"/>
9 9 <!-- stylesheets -->
10 10 ${self.css()}
11 11 <!-- scripts -->
12 12 ${self.js()}
13 13 </head>
14 14 <body>
15 15 <!-- header -->
16 16 <div id="header">
17 17 <!-- user -->
18 18 <ul id="logged-user">
19 %if c.rhodecode_user.username == 'default':
20 <li class="first">
21 <div class="account">
22 ## ${h.link_to('%s %s'%(c.rhodecode_user.name,c.rhodecode_user.lastname),h.url('#'))}<br/>
23 ## ${h.link_to(c.rhodecode_user.username,h.url('#'))}
24 </div>
25 </li>
26 <li class="last highlight">${h.link_to(u'Login',h.url('login_home'))}</li>
27 %else:
28 19 <li class="first">
29 20 <div class="gravatar">
30 <img alt="gravatar" src="${h.gravatar_url(c.rhodecode_user.email,24)}" />
21 <img alt="gravatar" src="${h.gravatar_url(c.rhodecode_user.email,20)}" />
31 22 </div>
32 23 <div class="account">
33 ${h.link_to('%s %s'%(c.rhodecode_user.name,c.rhodecode_user.lastname),h.url('admin_settings_my_account'))}<br/>
24 %if c.rhodecode_user.username == 'default':
25 ##${h.link_to('%s %s'%(c.rhodecode_user.name,c.rhodecode_user.lastname),h.url('register'))}<br/>
26 ${h.link_to('anonymous',h.url('register'))}
27 %else:
28 ##${h.link_to('%s %s'%(c.rhodecode_user.name,c.rhodecode_user.lastname),h.url('admin_settings_my_account'))}<br/>
34 29 ${h.link_to(c.rhodecode_user.username,h.url('admin_settings_my_account'))}
30 %endif
35 31 </div>
36 32 </li>
37 <li class="last highlight">${h.link_to(u'Logout',h.url('logout_home'))}</li>
38 %endif
33 <li>
34 <a href="${h.url('home')}">${_('Home')}</a>
35 </li>
36 <li>
37 <a href="${h.url('journal')}">${_('Journal')}</a>
38 ##(${c.unread_journal})</a>
39 </li>
40 %if c.rhodecode_user.username == 'default':
41 <li class="last highlight">${h.link_to(u'Login',h.url('login_home'))}</li>
42 %else:
43 <li class="last highlight">${h.link_to(u'Log Out',h.url('logout_home'))}</li>
44 %endif
45
46
39 47 </ul>
40 48 <!-- end user -->
41 49 <div id="header-inner" class="title top-left-rounded-corner top-right-rounded-corner">
42 50 <!-- logo -->
43 51 <div id="logo">
44 52 <h1><a href="${h.url('home')}">${c.rhodecode_name}</a></h1>
45 53 </div>
46 54 <!-- end logo -->
47 55 <!-- menu -->
48 56 ${self.page_nav()}
49 57 <!-- quick -->
50 58 </div>
51 59 </div>
52 60 <!-- end header -->
53 61
54 62 <!-- CONTENT -->
55 63 <div id="content">
56 64 <div class="flash_msg">
57 65 <% messages = h.flash.pop_messages() %>
58 66 % if messages:
59 67 <ul id="flash-messages">
60 68 % for message in messages:
61 69 <li class="${message.category}_msg">${message}</li>
62 70 % endfor
63 71 </ul>
64 72 % endif
65 73 </div>
66 74 <div id="main">
67 75 ${next.main()}
68 76 </div>
69 77 </div>
70 78 <!-- END CONTENT -->
71 79
72 80 <!-- footer -->
73 81 <div id="footer">
74 82 <div id="footer-inner" class="title bottom-left-rounded-corner bottom-right-rounded-corner">
75 83 <div>
76 84 <p class="footer-link">${h.link_to(_('Submit a bug'),h.url('bugtracker'))}</p>
77 85 <p class="footer-link">${h.link_to(_('GPL license'),h.url('gpl_license'))}</p>
78 86 <p>RhodeCode ${c.rhodecode_version} &copy; 2010 by Marcin Kuzminski</p>
79 87 </div>
80 88 </div>
81 89 <script type="text/javascript">${h.tooltip.activate()}</script>
82 90 </div>
83 91 <!-- end footer -->
84 92 </body>
85 93
86 94 </html>
87 95
88 96 ### MAKO DEFS ###
89 97 <%def name="page_nav()">
90 98 ${self.menu()}
91 99 </%def>
92 100
93 101 <%def name="menu(current=None)">
94 102 <%
95 103 def is_current(selected):
96 104 if selected == current:
97 105 return h.literal('class="current"')
98 106 %>
99 107 %if current not in ['home','admin']:
100 108 ##REGULAR MENU
101 109 <ul id="quick">
102 110 <!-- repo switcher -->
103 111 <li>
104 112 <a id="repo_switcher" title="${_('Switch repository')}" href="#">
105 113 <span class="icon">
106 114 <img src="/images/icons/database.png" alt="${_('Products')}" />
107 115 </span>
108 116 <span>&darr;</span>
109 117 </a>
110 118 <ul class="repo_switcher">
111 119 %for repo in c.cached_repo_list:
112 120
113 121 %if repo['repo'].dbrepo.private:
114 122 <li><img src="/images/icons/lock.png" alt="${_('Private repository')}" class="repo_switcher_type"/>${h.link_to(repo['repo'].name,h.url('summary_home',repo_name=repo['repo'].name),class_="%s" % repo['repo'].dbrepo.repo_type)}</li>
115 123 %else:
116 124 <li><img src="/images/icons/lock_open.png" alt="${_('Public repository')}" class="repo_switcher_type" />${h.link_to(repo['repo'].name,h.url('summary_home',repo_name=repo['repo'].name),class_="%s" % repo['repo'].dbrepo.repo_type)}</li>
117 125 %endif
118 126 %endfor
119 127 </ul>
120 128 </li>
121 129
122 130 <li ${is_current('summary')}>
123 131 <a title="${_('Summary')}" href="${h.url('summary_home',repo_name=c.repo_name)}">
124 132 <span class="icon">
125 133 <img src="/images/icons/clipboard_16.png" alt="${_('Summary')}" />
126 134 </span>
127 135 <span>${_('Summary')}</span>
128 136 </a>
129 137 </li>
130 138 ##<li ${is_current('shortlog')}>
131 139 ## <a title="${_('Shortlog')}" href="${h.url('shortlog_home',repo_name=c.repo_name)}">
132 140 ## <span class="icon">
133 141 ## <img src="/images/icons/application_view_list.png" alt="${_('Shortlog')}" />
134 142 ## </span>
135 143 ## <span>${_('Shortlog')}</span>
136 144 ## </a>
137 145 ##</li>
138 146 <li ${is_current('changelog')}>
139 147 <a title="${_('Changelog')}" href="${h.url('changelog_home',repo_name=c.repo_name)}">
140 148 <span class="icon">
141 149 <img src="/images/icons/time.png" alt="${_('Changelog')}" />
142 150 </span>
143 151 <span>${_('Changelog')}</span>
144 152 </a>
145 153 </li>
146 154
147 155 <li ${is_current('switch_to')}>
148 156 <a title="${_('Switch to')}" href="#">
149 157 <span class="icon">
150 158 <img src="/images/icons/arrow_switch.png" alt="${_('Switch to')}" />
151 159 </span>
152 160 <span>${_('Switch to')}</span>
153 161 </a>
154 162 <ul>
155 163 <li>
156 164 ${h.link_to('%s (%s)' % (_('branches'),len(c.repository_branches.values()),),h.url('branches_home',repo_name=c.repo_name),class_='branches childs')}
157 165 <ul>
158 166 %if c.repository_branches.values():
159 167 %for cnt,branch in enumerate(c.repository_branches.items()):
160 168 <li>${h.link_to('%s - %s' % (branch[0],h.short_id(branch[1])),h.url('files_home',repo_name=c.repo_name,revision=branch[1]))}</li>
161 169 %endfor
162 170 %else:
163 171 <li>${h.link_to(_('There are no branches yet'),'#')}</li>
164 172 %endif
165 173 </ul>
166 174 </li>
167 175 <li>
168 176 ${h.link_to('%s (%s)' % (_('tags'),len(c.repository_tags.values()),),h.url('tags_home',repo_name=c.repo_name),class_='tags childs')}
169 177 <ul>
170 178 %if c.repository_tags.values():
171 179 %for cnt,tag in enumerate(c.repository_tags.items()):
172 180 <li>${h.link_to('%s - %s' % (tag[0],h.short_id(tag[1])),h.url('files_home',repo_name=c.repo_name,revision=tag[1]))}</li>
173 181 %endfor
174 182 %else:
175 183 <li>${h.link_to(_('There are no tags yet'),'#')}</li>
176 184 %endif
177 185 </ul>
178 186 </li>
179 187 </ul>
180 188 </li>
181 189 <li ${is_current('files')}>
182 190 <a title="${_('Files')}" href="${h.url('files_home',repo_name=c.repo_name)}">
183 191 <span class="icon">
184 192 <img src="/images/icons/file.png" alt="${_('Files')}" />
185 193 </span>
186 194 <span>${_('Files')}</span>
187 195 </a>
188 196 </li>
189 197
190 198 <li ${is_current('options')}>
191 199 <a title="${_('Options')}" href="#">
192 200 <span class="icon">
193 201 <img src="/images/icons/table_gear.png" alt="${_('Admin')}" />
194 202 </span>
195 203 <span>${_('Options')}</span>
196 204 </a>
197 205 <ul>
198 206 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
199 207 <li>${h.link_to(_('settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')}</li>
200 208 <li>${h.link_to(_('fork'),h.url('repo_fork_home',repo_name=c.repo_name),class_='fork')}</li>
201 209 %endif
202 210 <li>${h.link_to(_('search'),h.url('search_repo',search_repo=c.repo_name),class_='search')}</li>
203 211
204 212 %if h.HasPermissionAll('hg.admin')('access admin main page'):
205 213 <li>
206 214 ${h.link_to(_('admin'),h.url('admin_home'),class_='admin')}
207 215 <%def name="admin_menu()">
208 216 <ul>
209 217 <li>${h.link_to(_('journal'),h.url('admin_home'),class_='journal')}</li>
210 218 <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li>
211 219 <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li>
212 220 <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li>
213 221 <li>${h.link_to(_('ldap'),h.url('ldap_home'),class_='ldap')}</li>
214 222 <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li>
215 223 </ul>
216 224 </%def>
217 225
218 226 ${admin_menu()}
219 227 </li>
220 228 %endif
221 229
222 230 </ul>
223 231 </li>
224 232
225 233 <li>
226 234 <a title="${_('Followers')}" href="#">
227 235 <span class="icon_short">
228 236 <img src="/images/icons/heart.png" alt="${_('Followers')}" />
229 237 </span>
230 238 <span class="short">${c.repository_followers}</span>
231 239 </a>
232 240 </li>
233 241 <li>
234 242 <a title="${_('Forks')}" href="#">
235 243 <span class="icon_short">
236 244 <img src="/images/icons/arrow_divide.png" alt="${_('Forks')}" />
237 245 </span>
238 246 <span class="short">${c.repository_forks}</span>
239 247 </a>
240 248 </li>
241 249
242 250
243 251
244 252 </ul>
245 253 %else:
246 254 ##ROOT MENU
247 255 <ul id="quick">
248 256 <li>
249 257 <a title="${_('Home')}" href="${h.url('home')}">
250 258 <span class="icon">
251 259 <img src="/images/icons/home_16.png" alt="${_('Home')}" />
252 260 </span>
253 261 <span>${_('Home')}</span>
254 262 </a>
255 263 </li>
256 264
257 265 <li>
258 266 <a title="${_('Journal')}" href="${h.url('journal')}">
259 267 <span class="icon">
260 268 <img src="/images/icons/book.png" alt="${_('Journal')}" />
261 269 </span>
262 270 <span>${_('Journal')}</span>
263 271 </a>
264 272 </li>
265 273
266 274 <li>
267 275 <a title="${_('Search')}" href="${h.url('search')}">
268 276 <span class="icon">
269 277 <img src="/images/icons/search_16.png" alt="${_('Search')}" />
270 278 </span>
271 279 <span>${_('Search')}</span>
272 280 </a>
273 281 </li>
274 282
275 283 %if h.HasPermissionAll('hg.admin')('access admin main page'):
276 284 <li ${is_current('admin')}>
277 285 <a title="${_('Admin')}" href="${h.url('admin_home')}">
278 286 <span class="icon">
279 287 <img src="/images/icons/cog_edit.png" alt="${_('Admin')}" />
280 288 </span>
281 289 <span>${_('Admin')}</span>
282 290 </a>
283 291 ${admin_menu()}
284 292 </li>
285 293 %endif
286 294 </ul>
287 295 %endif
288 296 </%def>
289 297
290 298
291 299 <%def name="css()">
292 300 <link rel="stylesheet" type="text/css" href="/css/style.css" media="screen" />
293 301 <link rel="stylesheet" type="text/css" href="/css/pygments.css" />
294 302 <link rel="stylesheet" type="text/css" href="/css/diff.css" />
295 303 </%def>
296 304
297 305 <%def name="js()">
298 306 ##<script type="text/javascript" src="/js/yui/utilities/utilities.js"></script>
299 307 ##<script type="text/javascript" src="/js/yui/container/container.js"></script>
300 308 ##<script type="text/javascript" src="/js/yui/datasource/datasource.js"></script>
301 309 ##<script type="text/javascript" src="/js/yui/autocomplete/autocomplete.js"></script>
302 310 ##<script type="text/javascript" src="/js/yui/selector/selector-min.js"></script>
303 311
304 312 <script type="text/javascript" src="/js/yui2a.js"></script>
305 313 <!--[if IE]><script language="javascript" type="text/javascript" src="/js/excanvas.min.js"></script><![endif]-->
306 314 <script type="text/javascript" src="/js/yui.flot.js"></script>
307 315
308 316 <script type="text/javascript">
309 317 var base_url ='/_admin/toggle_following';
310 318 var YUC = YAHOO.util.Connect;
311 319 var YUD = YAHOO.util.Dom;
312 320 var YUE = YAHOO.util.Event;
313 321
314 322 function onSuccess(){
315 323
316 324 var f = YUD.get('follow_toggle');
317 325 if(f.getAttribute('class')=='follow'){
318 326 f.setAttribute('class','following');
319 327 f.setAttribute('title',"${_('Stop following this repository')}");
320 328 }
321 329 else{
322 330 f.setAttribute('class','follow');
323 331 f.setAttribute('title',"${_('Start following this repository')}");
324 332 }
325 333 }
326 334
327 335 function toggleFollowingUser(fallows_user_id,token){
328 336 args = 'follows_user_id='+fallows_user_id;
329 337 args+= '&auth_token='+token;
330 338 YUC.asyncRequest('POST',base_url,{
331 339 success:function(o){
332 340 onSuccess();
333 341 }
334 342 },args); return false;
335 343 }
336 344
337 345 function toggleFollowingRepo(fallows_repo_id,token){
338 346 args = 'follows_repo_id='+fallows_repo_id;
339 347 args+= '&auth_token='+token;
340 348 YUC.asyncRequest('POST',base_url,{
341 349 success:function(o){
342 350 onSuccess();
343 351 }
344 352 },args); return false;
345 353 }
346 354 </script>
347 355
348 356 </%def>
349 357
350 358 <%def name="breadcrumbs()">
351 359 <div class="breadcrumbs">
352 360 ${self.breadcrumbs_links()}
353 361 </div>
354 362 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now