##// END OF EJS Templates
added cache reset, stats reset, and delete into repository settings in admin....
marcink -
r708:b9bbc0d6 beta
parent child Browse files
Show More
@@ -1,192 +1,198 b''
1 1 """
2 2 Routes configuration
3 3
4 4 The more specific and detailed routes should be defined first so they
5 5 may take precedent over the more generic routes. For more information
6 6 refer to the routes manual at http://routes.groovie.org/docs/
7 7 """
8 8 from __future__ import with_statement
9 9 from routes import Mapper
10 10 from rhodecode.lib.utils import check_repo_fast as cr
11 11
12 12 def make_map(config):
13 13 """Create, configure and return the routes Mapper"""
14 14 map = Mapper(directory=config['pylons.paths']['controllers'],
15 15 always_scan=config['debug'])
16 16 map.minimization = False
17 17 map.explicit = False
18 18
19 19 def check_repo(environ, match_dict):
20 20 """
21 21 check for valid repository for proper 404 handling
22 22 :param environ:
23 23 :param match_dict:
24 24 """
25 25 repo_name = match_dict.get('repo_name')
26 26 return not cr(repo_name, config['base_path'])
27 27
28 28 # The ErrorController route (handles 404/500 error pages); it should
29 29 # likely stay at the top, ensuring it can always be resolved
30 30 map.connect('/error/{action}', controller='error')
31 31 map.connect('/error/{action}/{id}', controller='error')
32 32
33 33 #==========================================================================
34 34 # CUSTOM ROUTES HERE
35 35 #==========================================================================
36 36
37 37 #MAIN PAGE
38 38 map.connect('home', '/', controller='home', action='index')
39 39 map.connect('bugtracker', "http://bitbucket.org/marcinkuzminski/rhodecode/issues", _static=True)
40 40 map.connect('gpl_license', "http://www.gnu.org/licenses/gpl.html", _static=True)
41 41 #ADMIN REPOSITORY REST ROUTES
42 42 with map.submapper(path_prefix='/_admin', controller='admin/repos') as m:
43 43 m.connect("repos", "/repos",
44 44 action="create", conditions=dict(method=["POST"]))
45 45 m.connect("repos", "/repos",
46 46 action="index", conditions=dict(method=["GET"]))
47 47 m.connect("formatted_repos", "/repos.{format}",
48 48 action="index",
49 49 conditions=dict(method=["GET"]))
50 50 m.connect("new_repo", "/repos/new",
51 51 action="new", conditions=dict(method=["GET"]))
52 52 m.connect("formatted_new_repo", "/repos/new.{format}",
53 53 action="new", conditions=dict(method=["GET"]))
54 54 m.connect("/repos/{repo_name:.*}",
55 55 action="update", conditions=dict(method=["PUT"],
56 56 function=check_repo))
57 57 m.connect("/repos/{repo_name:.*}",
58 58 action="delete", conditions=dict(method=["DELETE"],
59 59 function=check_repo))
60 60 m.connect("edit_repo", "/repos/{repo_name:.*}/edit",
61 61 action="edit", conditions=dict(method=["GET"],
62 62 function=check_repo))
63 63 m.connect("formatted_edit_repo", "/repos/{repo_name:.*}.{format}/edit",
64 64 action="edit", conditions=dict(method=["GET"],
65 65 function=check_repo))
66 66 m.connect("repo", "/repos/{repo_name:.*}",
67 67 action="show", conditions=dict(method=["GET"],
68 68 function=check_repo))
69 69 m.connect("formatted_repo", "/repos/{repo_name:.*}.{format}",
70 70 action="show", conditions=dict(method=["GET"],
71 71 function=check_repo))
72 72 #ajax delete repo perm user
73 73 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}",
74 74 action="delete_perm_user", conditions=dict(method=["DELETE"],
75 75 function=check_repo))
76
76 #settings actions
77 m.connect('repo_stats', "/repos_stats/{repo_name:.*}",
78 action="repo_stats", conditions=dict(method=["DELETE"],
79 function=check_repo))
80 m.connect('repo_cache', "/repos_cache/{repo_name:.*}",
81 action="repo_cache", conditions=dict(method=["DELETE"],
82 function=check_repo))
77 83 #ADMIN USER REST ROUTES
78 84 map.resource('user', 'users', controller='admin/users', path_prefix='/_admin')
79 85
80 86 #ADMIN PERMISSIONS REST ROUTES
81 87 map.resource('permission', 'permissions', controller='admin/permissions', path_prefix='/_admin')
82 88 map.connect('permissions_ldap', '/_admin/permissions_ldap', controller='admin/permissions', action='ldap')
83 89
84 90
85 91 #ADMIN SETTINGS REST ROUTES
86 92 with map.submapper(path_prefix='/_admin', controller='admin/settings') as m:
87 93 m.connect("admin_settings", "/settings",
88 94 action="create", conditions=dict(method=["POST"]))
89 95 m.connect("admin_settings", "/settings",
90 96 action="index", conditions=dict(method=["GET"]))
91 97 m.connect("formatted_admin_settings", "/settings.{format}",
92 98 action="index", conditions=dict(method=["GET"]))
93 99 m.connect("admin_new_setting", "/settings/new",
94 100 action="new", conditions=dict(method=["GET"]))
95 101 m.connect("formatted_admin_new_setting", "/settings/new.{format}",
96 102 action="new", conditions=dict(method=["GET"]))
97 103 m.connect("/settings/{setting_id}",
98 104 action="update", conditions=dict(method=["PUT"]))
99 105 m.connect("/settings/{setting_id}",
100 106 action="delete", conditions=dict(method=["DELETE"]))
101 107 m.connect("admin_edit_setting", "/settings/{setting_id}/edit",
102 108 action="edit", conditions=dict(method=["GET"]))
103 109 m.connect("formatted_admin_edit_setting", "/settings/{setting_id}.{format}/edit",
104 110 action="edit", conditions=dict(method=["GET"]))
105 111 m.connect("admin_setting", "/settings/{setting_id}",
106 112 action="show", conditions=dict(method=["GET"]))
107 113 m.connect("formatted_admin_setting", "/settings/{setting_id}.{format}",
108 114 action="show", conditions=dict(method=["GET"]))
109 115 m.connect("admin_settings_my_account", "/my_account",
110 116 action="my_account", conditions=dict(method=["GET"]))
111 117 m.connect("admin_settings_my_account_update", "/my_account_update",
112 118 action="my_account_update", conditions=dict(method=["PUT"]))
113 119 m.connect("admin_settings_create_repository", "/create_repository",
114 120 action="create_repository", conditions=dict(method=["GET"]))
115 121
116 122 #ADMIN MAIN PAGES
117 123 with map.submapper(path_prefix='/_admin', controller='admin/admin') as m:
118 124 m.connect('admin_home', '', action='index')#main page
119 125 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
120 126 action='add_repo')
121 127 #SEARCH
122 128 map.connect('search', '/_admin/search', controller='search',)
123 129 map.connect('search_repo', '/_admin/search/{search_repo:.*}', controller='search')
124 130
125 131 #LOGIN/LOGOUT/REGISTER/SIGN IN
126 132 map.connect('login_home', '/_admin/login', controller='login')
127 133 map.connect('logout_home', '/_admin/logout', controller='login', action='logout')
128 134 map.connect('register', '/_admin/register', controller='login', action='register')
129 135 map.connect('reset_password', '/_admin/password_reset', controller='login', action='password_reset')
130 136
131 137 #FEEDS
132 138 map.connect('rss_feed_home', '/{repo_name:.*}/feed/rss',
133 139 controller='feed', action='rss',
134 140 conditions=dict(function=check_repo))
135 141 map.connect('atom_feed_home', '/{repo_name:.*}/feed/atom',
136 142 controller='feed', action='atom',
137 143 conditions=dict(function=check_repo))
138 144
139 145
140 146 #REPOSITORY ROUTES
141 147 map.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}',
142 148 controller='changeset', revision='tip',
143 149 conditions=dict(function=check_repo))
144 150 map.connect('raw_changeset_home', '/{repo_name:.*}/raw-changeset/{revision}',
145 151 controller='changeset', action='raw_changeset', revision='tip',
146 152 conditions=dict(function=check_repo))
147 153 map.connect('summary_home', '/{repo_name:.*}/summary',
148 154 controller='summary', conditions=dict(function=check_repo))
149 155 map.connect('shortlog_home', '/{repo_name:.*}/shortlog',
150 156 controller='shortlog', conditions=dict(function=check_repo))
151 157 map.connect('branches_home', '/{repo_name:.*}/branches',
152 158 controller='branches', conditions=dict(function=check_repo))
153 159 map.connect('tags_home', '/{repo_name:.*}/tags',
154 160 controller='tags', conditions=dict(function=check_repo))
155 161 map.connect('changelog_home', '/{repo_name:.*}/changelog',
156 162 controller='changelog', conditions=dict(function=check_repo))
157 163 map.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}',
158 164 controller='files', revision='tip', f_path='',
159 165 conditions=dict(function=check_repo))
160 166 map.connect('files_diff_home', '/{repo_name:.*}/diff/{f_path:.*}',
161 167 controller='files', action='diff', revision='tip', f_path='',
162 168 conditions=dict(function=check_repo))
163 169 map.connect('files_rawfile_home', '/{repo_name:.*}/rawfile/{revision}/{f_path:.*}',
164 170 controller='files', action='rawfile', revision='tip', f_path='',
165 171 conditions=dict(function=check_repo))
166 172 map.connect('files_raw_home', '/{repo_name:.*}/raw/{revision}/{f_path:.*}',
167 173 controller='files', action='raw', revision='tip', f_path='',
168 174 conditions=dict(function=check_repo))
169 175 map.connect('files_annotate_home', '/{repo_name:.*}/annotate/{revision}/{f_path:.*}',
170 176 controller='files', action='annotate', revision='tip', f_path='',
171 177 conditions=dict(function=check_repo))
172 178 map.connect('files_archive_home', '/{repo_name:.*}/archive/{revision}/{fileformat}',
173 179 controller='files', action='archivefile', revision='tip',
174 180 conditions=dict(function=check_repo))
175 181 map.connect('repo_settings_delete', '/{repo_name:.*}/settings',
176 182 controller='settings', action="delete",
177 183 conditions=dict(method=["DELETE"], function=check_repo))
178 184 map.connect('repo_settings_update', '/{repo_name:.*}/settings',
179 185 controller='settings', action="update",
180 186 conditions=dict(method=["PUT"], function=check_repo))
181 187 map.connect('repo_settings_home', '/{repo_name:.*}/settings',
182 188 controller='settings', action='index',
183 189 conditions=dict(function=check_repo))
184 190
185 191 map.connect('repo_fork_create_home', '/{repo_name:.*}/fork',
186 192 controller='settings', action='fork_create',
187 193 conditions=dict(function=check_repo, method=["POST"]))
188 194 map.connect('repo_fork_home', '/{repo_name:.*}/fork',
189 195 controller='settings', action='fork',
190 196 conditions=dict(function=check_repo))
191 197
192 198 return map
@@ -1,247 +1,288 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 # repos controller for pylons
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 5 #
6 6 # This program is free software; you can redistribute it and/or
7 7 # modify it under the terms of the GNU General Public License
8 8 # as published by the Free Software Foundation; version 2
9 9 # of the License or (at your opinion) any later version of the license.
10 10 #
11 11 # This program is distributed in the hope that it will be useful,
12 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 14 # GNU General Public License for more details.
15 15 #
16 16 # You should have received a copy of the GNU General Public License
17 17 # along with this program; if not, write to the Free Software
18 18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 19 # MA 02110-1301, USA.
20 20 """
21 21 Created on April 7, 2010
22 22 admin controller for pylons
23 23 @author: marcink
24 24 """
25 25 from formencode import htmlfill
26 26 from operator import itemgetter
27 27 from paste.httpexceptions import HTTPInternalServerError
28 28 from pylons import request, response, session, tmpl_context as c, url
29 29 from pylons.controllers.util import abort, redirect
30 30 from pylons.i18n.translation import _
31 31 from rhodecode.lib import helpers as h
32 32 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
33 33 HasPermissionAnyDecorator
34 34 from rhodecode.lib.base import BaseController, render
35 35 from rhodecode.lib.utils import invalidate_cache, action_logger
36 36 from rhodecode.model.db import User
37 37 from rhodecode.model.forms import RepoForm
38 38 from rhodecode.model.scm import ScmModel
39 39 from rhodecode.model.repo import RepoModel
40 40 import formencode
41 41 import logging
42 42 import traceback
43 43
44 44 log = logging.getLogger(__name__)
45 45
46 46 class ReposController(BaseController):
47 47 """REST Controller styled on the Atom Publishing Protocol"""
48 48 # To properly map this controller, ensure your config/routing.py
49 49 # file has a resource setup:
50 50 # map.resource('repo', 'repos')
51 51
52 52 @LoginRequired()
53 53 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
54 54 def __before__(self):
55 55 c.admin_user = session.get('admin_user')
56 56 c.admin_username = session.get('admin_username')
57 57 super(ReposController, self).__before__()
58 58
59 59 @HasPermissionAllDecorator('hg.admin')
60 60 def index(self, format='html'):
61 61 """GET /repos: All items in the collection"""
62 62 # url('repos')
63 63 cached_repo_list = ScmModel().get_repos()
64 64 c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort'))
65 65 return render('admin/repos/repos.html')
66 66
67 67 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
68 68 def create(self):
69 69 """POST /repos: Create a new item"""
70 70 # url('repos')
71 71 repo_model = RepoModel()
72 72 _form = RepoForm()()
73 73 form_result = {}
74 74 try:
75 75 form_result = _form.to_python(dict(request.POST))
76 76 repo_model.create(form_result, c.rhodecode_user)
77 77 h.flash(_('created repository %s') % form_result['repo_name'],
78 78 category='success')
79 79
80 80 if request.POST.get('user_created'):
81 81 action_logger(self.rhodecode_user, 'user_created_repo',
82 82 form_result['repo_name'], '', self.sa)
83 83 else:
84 84 action_logger(self.rhodecode_user, 'admin_created_repo',
85 85 form_result['repo_name'], '', self.sa)
86 86
87 87 except formencode.Invalid, errors:
88 88 c.new_repo = errors.value['repo_name']
89 89
90 90 if request.POST.get('user_created'):
91 91 r = render('admin/repos/repo_add_create_repository.html')
92 92 else:
93 93 r = render('admin/repos/repo_add.html')
94 94
95 95 return htmlfill.render(
96 96 r,
97 97 defaults=errors.value,
98 98 errors=errors.error_dict or {},
99 99 prefix_error=False,
100 100 encoding="UTF-8")
101 101
102 102 except Exception:
103 103 log.error(traceback.format_exc())
104 104 msg = _('error occured during creation of repository %s') \
105 105 % form_result.get('repo_name')
106 106 h.flash(msg, category='error')
107 107 if request.POST.get('user_created'):
108 108 return redirect(url('home'))
109 109 return redirect(url('repos'))
110 110
111 111 @HasPermissionAllDecorator('hg.admin')
112 112 def new(self, format='html'):
113 113 """GET /repos/new: Form to create a new item"""
114 114 new_repo = request.GET.get('repo', '')
115 115 c.new_repo = h.repo_name_slug(new_repo)
116 116
117 117 return render('admin/repos/repo_add.html')
118 118
119 119 @HasPermissionAllDecorator('hg.admin')
120 120 def update(self, repo_name):
121 121 """PUT /repos/repo_name: Update an existing item"""
122 122 # Forms posted to this method should contain a hidden field:
123 123 # <input type="hidden" name="_method" value="PUT" />
124 124 # Or using helpers:
125 125 # h.form(url('repo', repo_name=ID),
126 126 # method='put')
127 127 # url('repo', repo_name=ID)
128 128 repo_model = RepoModel()
129 129 changed_name = repo_name
130 130 _form = RepoForm(edit=True, old_data={'repo_name':repo_name})()
131 131
132 132 try:
133 133 form_result = _form.to_python(dict(request.POST))
134 134 repo_model.update(repo_name, form_result)
135 135 invalidate_cache('get_repo_cached_%s' % repo_name)
136 136 h.flash(_('Repository %s updated successfully' % repo_name),
137 137 category='success')
138 138 changed_name = form_result['repo_name']
139 139 action_logger(self.rhodecode_user, 'admin_updated_repo',
140 140 changed_name, '', self.sa)
141 141
142 142 except formencode.Invalid, errors:
143 143 c.repo_info = repo_model.get(repo_name)
144 144 c.users_array = repo_model.get_users_js()
145 145 errors.value.update({'user':c.repo_info.user.username})
146 146 return htmlfill.render(
147 147 render('admin/repos/repo_edit.html'),
148 148 defaults=errors.value,
149 149 errors=errors.error_dict or {},
150 150 prefix_error=False,
151 151 encoding="UTF-8")
152 152
153 153 except Exception:
154 154 log.error(traceback.format_exc())
155 155 h.flash(_('error occurred during update of repository %s') \
156 156 % repo_name, category='error')
157 157
158 158 return redirect(url('edit_repo', repo_name=changed_name))
159 159
160 160 @HasPermissionAllDecorator('hg.admin')
161 161 def delete(self, repo_name):
162 162 """DELETE /repos/repo_name: Delete an existing item"""
163 163 # Forms posted to this method should contain a hidden field:
164 164 # <input type="hidden" name="_method" value="DELETE" />
165 165 # Or using helpers:
166 166 # h.form(url('repo', repo_name=ID),
167 167 # method='delete')
168 168 # url('repo', repo_name=ID)
169 169
170 170 repo_model = RepoModel()
171 171 repo = repo_model.get(repo_name)
172 172 if not repo:
173 173 h.flash(_('%s repository is not mapped to db perhaps'
174 174 ' it was moved or renamed from the filesystem'
175 175 ' please run the application again'
176 176 ' in order to rescan repositories') % repo_name,
177 177 category='error')
178 178
179 179 return redirect(url('repos'))
180 180 try:
181 181 action_logger(self.rhodecode_user, 'admin_deleted_repo',
182 182 repo_name, '', self.sa)
183 183 repo_model.delete(repo)
184 184 invalidate_cache('get_repo_cached_%s' % repo_name)
185 185 h.flash(_('deleted repository %s') % repo_name, category='success')
186 186
187 187 except Exception, e:
188 188 log.error(traceback.format_exc())
189 189 h.flash(_('An error occured during deletion of %s') % repo_name,
190 190 category='error')
191 191
192 192 return redirect(url('repos'))
193 193
194 194 @HasPermissionAllDecorator('hg.admin')
195 195 def delete_perm_user(self, repo_name):
196 196 """
197 197 DELETE an existing repository permission user
198 198 :param repo_name:
199 199 """
200 200
201 201 try:
202 202 repo_model = RepoModel()
203 203 repo_model.delete_perm_user(request.POST, repo_name)
204 204 except Exception, e:
205 205 h.flash(_('An error occured during deletion of repository user'),
206 206 category='error')
207 207 raise HTTPInternalServerError()
208 208
209 209 @HasPermissionAllDecorator('hg.admin')
210 def repo_stats(self, repo_name):
211 """
212 DELETE an existing repository statistics
213 :param repo_name:
214 """
215
216 try:
217 repo_model = RepoModel()
218 repo_model.delete_stats(repo_name)
219 except Exception, e:
220 h.flash(_('An error occured during deletion of repository stats'),
221 category='error')
222 return redirect(url('edit_repo', repo_name=repo_name))
223
224 @HasPermissionAllDecorator('hg.admin')
225 def repo_cache(self, repo_name):
226 """
227 INVALIDATE exisitings repository cache
228 :param repo_name:
229 """
230
231 try:
232 ScmModel().mark_for_invalidation(repo_name)
233 except Exception, e:
234 h.flash(_('An error occured during cache invalidation'),
235 category='error')
236 return redirect(url('edit_repo', repo_name=repo_name))
237
238 @HasPermissionAllDecorator('hg.admin')
210 239 def show(self, repo_name, format='html'):
211 240 """GET /repos/repo_name: Show a specific item"""
212 241 # url('repo', repo_name=ID)
213 242
214 243 @HasPermissionAllDecorator('hg.admin')
215 244 def edit(self, repo_name, format='html'):
216 245 """GET /repos/repo_name/edit: Form to edit an existing item"""
217 246 # url('edit_repo', repo_name=ID)
218 247 repo_model = RepoModel()
219 248 c.repo_info = repo = repo_model.get(repo_name)
249 if repo.stats:
250 last_rev = repo.stats.stat_on_revision
251 else:
252 last_rev = 0
253 c.stats_revision = last_rev
254 c.repo_last_rev = ScmModel().get(repo_name).revisions[-1]
255 if last_rev == 0:
256 c.stats_percentage = 0
257 else:
258 c.stats_percentage = '%.2f' % ((float((last_rev)) / c.repo_last_rev) * 100)
259
260
220 261 if not repo:
221 262 h.flash(_('%s repository is not mapped to db perhaps'
222 263 ' it was created or renamed from the filesystem'
223 264 ' please run the application again'
224 265 ' in order to rescan repositories') % repo_name,
225 266 category='error')
226 267
227 268 return redirect(url('repos'))
228 269 defaults = c.repo_info.__dict__
229 270 if c.repo_info.user:
230 271 defaults.update({'user':c.repo_info.user.username})
231 272 else:
232 273 replacement_user = self.sa.query(User)\
233 274 .filter(User.admin == True).first().username
234 275 defaults.update({'user':replacement_user})
235 276
236 277 c.users_array = repo_model.get_users_js()
237 278
238 279 for p in c.repo_info.repo_to_perm:
239 280 defaults.update({'perm_%s' % p.user.username:
240 281 p.permission.permission_name})
241 282
242 283 return htmlfill.render(
243 284 render('admin/repos/repo_edit.html'),
244 285 defaults=defaults,
245 286 encoding="UTF-8",
246 287 force_defaults=False
247 288 )
@@ -1,164 +1,164 b''
1 1 from rhodecode.model.meta import Base
2 2 from sqlalchemy import *
3 3 from sqlalchemy.orm import relation, backref
4 4 from sqlalchemy.orm.session import Session
5 5 from vcs.utils.lazy import LazyProperty
6 6 import logging
7 7 log = logging.getLogger(__name__)
8 8
9 9 class RhodeCodeSettings(Base):
10 10 __tablename__ = 'rhodecode_settings'
11 11 __table_args__ = (UniqueConstraint('app_settings_name'), {'useexisting':True})
12 12 app_settings_id = Column("app_settings_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
13 13 app_settings_name = Column("app_settings_name", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
14 14 app_settings_value = Column("app_settings_value", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
15 15
16 16 def __init__(self, k, v):
17 17 self.app_settings_name = k
18 18 self.app_settings_value = v
19 19
20 20 def __repr__(self):
21 21 return "<RhodeCodeSetting('%s:%s')>" % (self.app_settings_name,
22 22 self.app_settings_value)
23 23
24 24 class RhodeCodeUi(Base):
25 25 __tablename__ = 'rhodecode_ui'
26 26 __table_args__ = {'useexisting':True}
27 27 ui_id = Column("ui_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
28 28 ui_section = Column("ui_section", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
29 29 ui_key = Column("ui_key", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
30 30 ui_value = Column("ui_value", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
31 31 ui_active = Column("ui_active", BOOLEAN(), nullable=True, unique=None, default=True)
32 32
33 33
34 34 class User(Base):
35 35 __tablename__ = 'users'
36 36 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True})
37 37 user_id = Column("user_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
38 38 username = Column("username", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
39 39 password = Column("password", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
40 40 active = Column("active", BOOLEAN(), nullable=True, unique=None, default=None)
41 41 admin = Column("admin", BOOLEAN(), nullable=True, unique=None, default=False)
42 42 name = Column("name", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
43 43 lastname = Column("lastname", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
44 44 email = Column("email", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
45 45 last_login = Column("last_login", DATETIME(timezone=False), nullable=True, unique=None, default=None)
46 46 is_ldap = Column("is_ldap", BOOLEAN(), nullable=False, unique=None, default=False)
47 47
48 48 user_log = relation('UserLog', cascade='all')
49 49 user_perms = relation('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
50 50
51 51 @LazyProperty
52 52 def full_contact(self):
53 53 return '%s %s <%s>' % (self.name, self.lastname, self.email)
54 54
55 55 def __repr__(self):
56 56 return "<User('id:%s:%s')>" % (self.user_id, self.username)
57 57
58 58 def update_lastlogin(self):
59 59 """Update user lastlogin"""
60 60 import datetime
61 61
62 62 try:
63 63 session = Session.object_session(self)
64 64 self.last_login = datetime.datetime.now()
65 65 session.add(self)
66 66 session.commit()
67 67 log.debug('updated user %s lastlogin', self.username)
68 68 except Exception:
69 69 session.rollback()
70 70
71 71
72 72 class UserLog(Base):
73 73 __tablename__ = 'user_logs'
74 74 __table_args__ = {'useexisting':True}
75 75 user_log_id = Column("user_log_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
76 76 user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
77 77 repository_id = Column("repository_id", INTEGER(length=None, convert_unicode=False, assert_unicode=None), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
78 78 repository_name = Column("repository_name", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
79 79 user_ip = Column("user_ip", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
80 80 action = Column("action", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
81 81 action_date = Column("action_date", DATETIME(timezone=False), nullable=True, unique=None, default=None)
82 82
83 83 user = relation('User')
84 84 repository = relation('Repository')
85 85
86 86 class Repository(Base):
87 87 __tablename__ = 'repositories'
88 88 __table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},)
89 89 repo_id = Column("repo_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
90 90 repo_name = Column("repo_name", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
91 91 repo_type = Column("repo_type", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
92 92 user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=False, default=None)
93 93 private = Column("private", BOOLEAN(), nullable=True, unique=None, default=None)
94 94 description = Column("description", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
95 95 fork_id = Column("fork_id", INTEGER(), ForeignKey(u'repositories.repo_id'), nullable=True, unique=False, default=None)
96 96
97 97 user = relation('User')
98 98 fork = relation('Repository', remote_side=repo_id)
99 99 repo_to_perm = relation('RepoToPerm', cascade='all')
100 stats = relation('Statistics', cascade='all')
100 stats = relation('Statistics', cascade='all', uselist=False)
101 101
102 102 def __repr__(self):
103 103 return "<Repository('%s:%s')>" % (self.repo_id, self.repo_name)
104 104
105 105 class Permission(Base):
106 106 __tablename__ = 'permissions'
107 107 __table_args__ = {'useexisting':True}
108 108 permission_id = Column("permission_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
109 109 permission_name = Column("permission_name", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
110 110 permission_longname = Column("permission_longname", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
111 111
112 112 def __repr__(self):
113 113 return "<Permission('%s:%s')>" % (self.permission_id, self.permission_name)
114 114
115 115 class RepoToPerm(Base):
116 116 __tablename__ = 'repo_to_perm'
117 117 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':True})
118 118 repo_to_perm_id = Column("repo_to_perm_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
119 119 user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
120 120 permission_id = Column("permission_id", INTEGER(), ForeignKey(u'permissions.permission_id'), nullable=False, unique=None, default=None)
121 121 repository_id = Column("repository_id", INTEGER(), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
122 122
123 123 user = relation('User')
124 124 permission = relation('Permission')
125 125 repository = relation('Repository')
126 126
127 127 class UserToPerm(Base):
128 128 __tablename__ = 'user_to_perm'
129 129 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':True})
130 130 user_to_perm_id = Column("user_to_perm_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
131 131 user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
132 132 permission_id = Column("permission_id", INTEGER(), ForeignKey(u'permissions.permission_id'), nullable=False, unique=None, default=None)
133 133
134 134 user = relation('User')
135 135 permission = relation('Permission')
136 136
137 137 class Statistics(Base):
138 138 __tablename__ = 'statistics'
139 139 __table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True})
140 140 stat_id = Column("stat_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
141 141 repository_id = Column("repository_id", INTEGER(), ForeignKey(u'repositories.repo_id'), nullable=False, unique=True, default=None)
142 142 stat_on_revision = Column("stat_on_revision", INTEGER(), nullable=False)
143 143 commit_activity = Column("commit_activity", BLOB(), nullable=False)#JSON data
144 144 commit_activity_combined = Column("commit_activity_combined", BLOB(), nullable=False)#JSON data
145 145 languages = Column("languages", BLOB(), nullable=False)#JSON data
146 146
147 147 repository = relation('Repository', single_parent=True)
148 148
149 149 class CacheInvalidation(Base):
150 150 __tablename__ = 'cache_invalidation'
151 151 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True})
152 152 cache_id = Column("cache_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
153 153 cache_key = Column("cache_key", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
154 154 cache_args = Column("cache_args", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
155 155 cache_active = Column("cache_active", BOOLEAN(), nullable=True, unique=None, default=False)
156 156
157 157
158 158 def __init__(self, cache_key, cache_args=''):
159 159 self.cache_key = cache_key
160 160 self.cache_args = cache_args
161 161 self.cache_active = False
162 162
163 163 def __repr__(self):
164 164 return "<CacheInvaidation('%s:%s')>" % (self.cache_id, self.cache_key)
@@ -1,209 +1,221 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 # model for handling repositories actions
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 5 # This program is free software; you can redistribute it and/or
6 6 # modify it under the terms of the GNU General Public License
7 7 # as published by the Free Software Foundation; version 2
8 8 # of the License or (at your opinion) any later version of the license.
9 9 #
10 10 # This program is distributed in the hope that it will be useful,
11 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 # GNU General Public License for more details.
14 14 #
15 15 # You should have received a copy of the GNU General Public License
16 16 # along with this program; if not, write to the Free Software
17 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 18 # MA 02110-1301, USA.
19 19 """
20 20 Created on Jun 5, 2010
21 21 model for handling repositories actions
22 22 :author: marcink
23 23 """
24 24 from vcs.backends import get_repo, get_backend
25 25 from datetime import datetime
26 26 from pylons import app_globals as g
27 from rhodecode.model.db import Repository, RepoToPerm, User, Permission
27 from rhodecode.model.db import Repository, RepoToPerm, User, Permission, \
28 Statistics
28 29 from rhodecode.model.meta import Session
29 30 from rhodecode.model.user import UserModel
30 31 from rhodecode.model.caching_query import FromCache
31 32 import logging
32 33 import os
33 34 import shutil
34 35 import traceback
35 36 log = logging.getLogger(__name__)
36 37
37 38 class RepoModel(object):
38 39
39 40 def __init__(self):
40 41 self.sa = Session()
41 42
42 43 def get(self, repo_id, cache=False):
43 44 repo = self.sa.query(Repository)\
44 45 .filter(Repository.repo_name == repo_id)
45 46
46 47 if cache:
47 48 repo = repo.options(FromCache("sql_cache_short",
48 49 "get_repo_%s" % repo))
49 50 return repo.scalar()
50 51
51 52 def get_users_js(self):
52 53
53 54 users = self.sa.query(User).filter(User.active == True).all()
54 55 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
55 56 users_array = '[%s];' % '\n'.join([u_tmpl % (u.user_id, u.name,
56 57 u.lastname, u.username)
57 58 for u in users])
58 59 return users_array
59 60
60 61
61 62 def update(self, repo_name, form_data):
62 63 try:
63 64
64 65 #update permissions
65 66 for username, perm in form_data['perms_updates']:
66 67 r2p = self.sa.query(RepoToPerm)\
67 68 .filter(RepoToPerm.user == UserModel().get_by_username(username, cache=False))\
68 69 .filter(RepoToPerm.repository == self.get(repo_name))\
69 70 .one()
70 71
71 72 r2p.permission_id = self.sa.query(Permission).filter(
72 73 Permission.permission_name ==
73 74 perm).one().permission_id
74 75 self.sa.add(r2p)
75 76
76 77 #set new permissions
77 78 for username, perm in form_data['perms_new']:
78 79 r2p = RepoToPerm()
79 80 r2p.repository = self.get(repo_name)
80 81 r2p.user = UserModel().get_by_username(username, cache=False)
81 82
82 83 r2p.permission_id = self.sa.query(Permission).filter(
83 84 Permission.permission_name == perm)\
84 85 .one().permission_id
85 86 self.sa.add(r2p)
86 87
87 88 #update current repo
88 89 cur_repo = self.get(repo_name, cache=False)
89 90
90 91 for k, v in form_data.items():
91 92 if k == 'user':
92 93 cur_repo.user_id = v
93 94 else:
94 95 setattr(cur_repo, k, v)
95 96
96 97 self.sa.add(cur_repo)
97 98
98 99 if repo_name != form_data['repo_name']:
99 100 #rename our data
100 101 self.__rename_repo(repo_name, form_data['repo_name'])
101 102
102 103 self.sa.commit()
103 104 except:
104 105 log.error(traceback.format_exc())
105 106 self.sa.rollback()
106 107 raise
107 108
108 109 def create(self, form_data, cur_user, just_db=False, fork=False):
109 110 try:
110 111 if fork:
111 112 #force str since hg doesn't go with unicode
112 113 repo_name = str(form_data['fork_name'])
113 114 org_name = str(form_data['repo_name'])
114 115
115 116 else:
116 117 org_name = repo_name = str(form_data['repo_name'])
117 118 new_repo = Repository()
118 119 for k, v in form_data.items():
119 120 if k == 'repo_name':
120 121 v = repo_name
121 122 setattr(new_repo, k, v)
122 123
123 124 if fork:
124 125 parent_repo = self.sa.query(Repository)\
125 126 .filter(Repository.repo_name == org_name).scalar()
126 127 new_repo.fork = parent_repo
127 128
128 129 new_repo.user_id = cur_user.user_id
129 130 self.sa.add(new_repo)
130 131
131 132 #create default permission
132 133 repo_to_perm = RepoToPerm()
133 134 default = 'repository.read'
134 135 for p in UserModel().get_by_username('default', cache=False).user_perms:
135 136 if p.permission.permission_name.startswith('repository.'):
136 137 default = p.permission.permission_name
137 138 break
138 139
139 140 default_perm = 'repository.none' if form_data['private'] else default
140 141
141 142 repo_to_perm.permission_id = self.sa.query(Permission)\
142 143 .filter(Permission.permission_name == default_perm)\
143 144 .one().permission_id
144 145
145 146 repo_to_perm.repository_id = new_repo.repo_id
146 147 repo_to_perm.user_id = UserModel().get_by_username('default', cache=False).user_id
147 148
148 149 self.sa.add(repo_to_perm)
149 150 self.sa.commit()
150 151 if not just_db:
151 152 self.__create_repo(repo_name, form_data['repo_type'])
152 153 except:
153 154 log.error(traceback.format_exc())
154 155 self.sa.rollback()
155 156 raise
156 157
157 158 def create_fork(self, form_data, cur_user):
158 159 from rhodecode.lib.celerylib import tasks, run_task
159 160 run_task(tasks.create_repo_fork, form_data, cur_user)
160 161
161 162 def delete(self, repo):
162 163 try:
163 164 self.sa.delete(repo)
164 165 self.__delete_repo(repo)
165 166 self.sa.commit()
166 167 except:
167 168 log.error(traceback.format_exc())
168 169 self.sa.rollback()
169 170 raise
170 171
171 172 def delete_perm_user(self, form_data, repo_name):
172 173 try:
173 174 self.sa.query(RepoToPerm)\
174 175 .filter(RepoToPerm.repository == self.get(repo_name))\
175 176 .filter(RepoToPerm.user_id == form_data['user_id']).delete()
176 177 self.sa.commit()
177 178 except:
178 179 log.error(traceback.format_exc())
179 180 self.sa.rollback()
180 181 raise
181 182
183 def delete_stats(self, repo_name):
184 try:
185 self.sa.query(Statistics)\
186 .filter(Statistics.repository == self.get(repo_name)).delete()
187 self.sa.commit()
188 except:
189 log.error(traceback.format_exc())
190 self.sa.rollback()
191 raise
192
193
182 194 def __create_repo(self, repo_name, alias):
183 195 from rhodecode.lib.utils import check_repo
184 196 repo_path = os.path.join(g.base_path, repo_name)
185 197 if check_repo(repo_name, g.base_path):
186 198 log.info('creating repo %s in %s', repo_name, repo_path)
187 199 backend = get_backend(alias)
188 200 backend(repo_path, create=True)
189 201
190 202 def __rename_repo(self, old, new):
191 203 log.info('renaming repo from %s to %s', old, new)
192 204
193 205 old_path = os.path.join(g.base_path, old)
194 206 new_path = os.path.join(g.base_path, new)
195 207 if os.path.isdir(new_path):
196 208 raise Exception('Was trying to rename to already existing dir %s',
197 209 new_path)
198 210 shutil.move(old_path, new_path)
199 211
200 212 def __delete_repo(self, repo):
201 213 rm_path = os.path.join(g.base_path, repo.repo_name)
202 214 log.info("Removing %s", rm_path)
203 215 #disable hg/git
204 216 alias = repo.repo_type
205 217 shutil.move(os.path.join(rm_path, '.%s' % alias),
206 218 os.path.join(rm_path, 'rm__.%s' % alias))
207 219 #disable repo
208 220 shutil.move(rm_path, os.path.join(g.base_path, 'rm__%s__%s' \
209 221 % (datetime.today(), repo.repo_name)))
@@ -1,2331 +1,2339 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 193 #header ul#logged-user li {
194 194 list-style:none;
195 195 float:left;
196 196 border-left:1px solid #bbb;
197 197 border-right:1px solid #a5a5a5;
198 198 margin:-2px 0 0;
199 199 padding:10px 12px;
200 200 }
201 201
202 202 #header ul#logged-user li.first {
203 203 border-left:none;
204 204 margin:-6px;
205 205 }
206 206
207 207 #header ul#logged-user li.first div.account {
208 208 padding-top:4px;
209 209 float:left;
210 210 }
211 211
212 212 #header ul#logged-user li.last {
213 213 border-right:none;
214 214 }
215 215
216 216 #header ul#logged-user li a {
217 217 color:#4e4e4e;
218 218 font-weight:700;
219 219 text-decoration:none;
220 220 }
221 221
222 222 #header ul#logged-user li a:hover {
223 223 color:#376ea6;
224 224 text-decoration:underline;
225 225 }
226 226
227 227 #header ul#logged-user li.highlight a {
228 228 color:#fff;
229 229 }
230 230
231 231 #header ul#logged-user li.highlight a:hover {
232 232 color:#376ea6;
233 233 }
234 234
235 235 #header #header-inner {
236 236 height:40px;
237 237 clear:both;
238 238 position:relative;
239 239 background:#003367 url("../images/header_inner.png") repeat-x;
240 240 border-bottom:2px solid #fff;
241 241 margin:0;
242 242 padding:0;
243 243 }
244 244
245 245 #header #header-inner #home a {
246 246 height:40px;
247 247 width:46px;
248 248 display:block;
249 249 background:url("../images/button_home.png");
250 250 background-position:0 0;
251 251 margin:0;
252 252 padding:0;
253 253 }
254 254
255 255 #header #header-inner #home a:hover {
256 256 background-position:0 -40px;
257 257 }
258 258
259 259 #header #header-inner #logo h1 {
260 260 color:#FFF;
261 261 font-size:18px;
262 262 margin:10px 0 0 13px;
263 263 padding:0;
264 264 }
265 265
266 266 #header #header-inner #logo a {
267 267 color:#fff;
268 268 text-decoration:none;
269 269 }
270 270
271 271 #header #header-inner #logo a:hover {
272 272 color:#bfe3ff;
273 273 }
274 274
275 275 #header #header-inner #quick,#header #header-inner #quick ul {
276 276 position:relative;
277 277 float:right;
278 278 list-style-type:none;
279 279 list-style-position:outside;
280 280 margin:10px 5px 0 0;
281 281 padding:0;
282 282 }
283 283
284 284 #header #header-inner #quick li {
285 285 position:relative;
286 286 float:left;
287 287 margin:0 5px 0 0;
288 288 padding:0;
289 289 }
290 290
291 291 #header #header-inner #quick li a {
292 292 top:0;
293 293 left:0;
294 294 height:1%;
295 295 display:block;
296 296 clear:both;
297 297 overflow:hidden;
298 298 color:#FFF;
299 299 font-weight:700;
300 300 text-decoration:none;
301 301 background:#369 url("../../images/quick_l.png") no-repeat top left;
302 302 padding:0;
303 303 }
304 304
305 305 #header #header-inner #quick li span {
306 306 top:0;
307 307 right:0;
308 308 height:1%;
309 309 display:block;
310 310 float:left;
311 311 background:url("../../images/quick_r.png") no-repeat top right;
312 312 border-left:1px solid #3f6f9f;
313 313 margin:0;
314 314 padding:10px 12px 8px 10px;
315 315 }
316 316
317 317 #header #header-inner #quick li span.normal {
318 318 border:none;
319 319 padding:10px 12px 8px;
320 320 }
321 321
322 322 #header #header-inner #quick li span.icon {
323 323 top:0;
324 324 left:0;
325 325 border-left:none;
326 326 background:url("../../images/quick_l.png") no-repeat top left;
327 327 border-right:1px solid #2e5c89;
328 328 padding:8px 8px 4px;
329 329 }
330 330
331 331 #header #header-inner #quick li a:hover {
332 332 background:#4e4e4e url("../../images/quick_l_selected.png") no-repeat top left;
333 333 }
334 334
335 335 #header #header-inner #quick li a:hover span {
336 336 border-left:1px solid #545454;
337 337 background:url("../../images/quick_r_selected.png") no-repeat top right;
338 338 }
339 339
340 340 #header #header-inner #quick li a:hover span.icon {
341 341 border-left:none;
342 342 border-right:1px solid #464646;
343 343 background:url("../../images/quick_l_selected.png") no-repeat top left;
344 344 }
345 345
346 346 #header #header-inner #quick ul {
347 347 top:29px;
348 348 right:0;
349 349 min-width:200px;
350 350 display:none;
351 351 position:absolute;
352 352 background:#FFF;
353 353 border:1px solid #666;
354 354 border-top:1px solid #003367;
355 355 z-index:100;
356 356 margin:0;
357 357 padding:0;
358 358 }
359 359
360 360 #header #header-inner #quick ul.repo_switcher {
361 361 max-height:275px;
362 362 overflow-x:hidden;
363 363 overflow-y:auto;
364 364 }
365 365
366 366 #header #header-inner #quick .repo_switcher_type{
367 367 position:absolute;
368 368 left:0;
369 369 top:9px;
370 370
371 371 }
372 372 #header #header-inner #quick li ul li {
373 373 border-bottom:1px solid #ddd;
374 374 }
375 375
376 376 #header #header-inner #quick li ul li a {
377 377 width:182px;
378 378 height:auto;
379 379 display:block;
380 380 float:left;
381 381 background:#FFF;
382 382 color:#003367;
383 383 font-weight:400;
384 384 margin:0;
385 385 padding:7px 9px;
386 386 }
387 387
388 388 #header #header-inner #quick li ul li a:hover {
389 389 color:#000;
390 390 background:#FFF;
391 391 }
392 392
393 393 #header #header-inner #quick ul ul {
394 394 top:auto;
395 395 }
396 396
397 397 #header #header-inner #quick li ul ul {
398 398 right:200px;
399 399 max-height:275px;
400 400 overflow:auto;
401 401 overflow-x:hidden;
402 402 white-space:normal;
403 403 }
404 404
405 405 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover {
406 406 background:url("../images/icons/book.png") no-repeat scroll 4px 9px #FFF;
407 407 width:167px;
408 408 margin:0;
409 409 padding:12px 9px 7px 24px;
410 410 }
411 411
412 412 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover {
413 413 background:url("../images/icons/lock.png") no-repeat scroll 4px 9px #FFF;
414 414 min-width:167px;
415 415 margin:0;
416 416 padding:12px 9px 7px 24px;
417 417 }
418 418
419 419 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover {
420 420 background:url("../images/icons/lock_open.png") no-repeat scroll 4px 9px #FFF;
421 421 min-width:167px;
422 422 margin:0;
423 423 padding:12px 9px 7px 24px;
424 424 }
425 425
426 426 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover {
427 427 background:url("../images/icons/hgicon.png") no-repeat scroll 4px 9px #FFF;
428 428 min-width:167px;
429 429 margin:0 0 0 14px;
430 430 padding:12px 9px 7px 24px;
431 431 }
432 432
433 433 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover {
434 434 background:url("../images/icons/giticon.png") no-repeat scroll 4px 9px #FFF;
435 435 min-width:167px;
436 436 margin:0 0 0 14px;
437 437 padding:12px 9px 7px 24px;
438 438 }
439 439
440 440 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover {
441 441 background:url("../images/icons/database_edit.png") no-repeat scroll 4px 9px #FFF;
442 442 width:167px;
443 443 margin:0;
444 444 padding:12px 9px 7px 24px;
445 445 }
446 446
447 447 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover {
448 448 background:#FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
449 449 width:167px;
450 450 margin:0;
451 451 padding:12px 9px 7px 24px;
452 452 }
453 453
454 454 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover {
455 455 background:#FFF url("../images/icons/cog.png") no-repeat 4px 9px;
456 456 width:167px;
457 457 margin:0;
458 458 padding:12px 9px 7px 24px;
459 459 }
460 460
461 461 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover {
462 462 background:#FFF url("../images/icons/key.png") no-repeat 4px 9px;
463 463 width:167px;
464 464 margin:0;
465 465 padding:12px 9px 7px 24px;
466 466 }
467 467
468 468 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover {
469 469 background:#FFF url("../images/icons/arrow_divide.png") no-repeat 4px 9px;
470 470 width:167px;
471 471 margin:0;
472 472 padding:12px 9px 7px 24px;
473 473 }
474 474
475 475 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover {
476 476 background:#FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
477 477 width:167px;
478 478 margin:0;
479 479 padding:12px 9px 7px 24px;
480 480 }
481 481
482 482 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover {
483 483 background:#FFF url("../images/icons/delete.png") no-repeat 4px 9px;
484 484 width:167px;
485 485 margin:0;
486 486 padding:12px 9px 7px 24px;
487 487 }
488 488
489 489 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover {
490 490 background:#FFF url("../images/icons/arrow_branch.png") no-repeat 4px 9px;
491 491 width:167px;
492 492 margin:0;
493 493 padding:12px 9px 7px 24px;
494 494 }
495 495
496 496 #header #header-inner #quick li ul li a.tags,#header #header-inner #quick li ul li a.tags:hover {
497 497 background:#FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
498 498 width:167px;
499 499 margin:0;
500 500 padding:12px 9px 7px 24px;
501 501 }
502 502
503 503 #header #header-inner #quick li ul li a.admin,#header #header-inner #quick li ul li a.admin:hover {
504 504 background:#FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
505 505 width:167px;
506 506 margin:0;
507 507 padding:12px 9px 7px 24px;
508 508 }
509 509
510 510 #content #left {
511 511 left:0;
512 512 width:280px;
513 513 position:absolute;
514 514 }
515 515
516 516 #content #right {
517 517 margin:0 60px 10px 290px;
518 518 }
519 519
520 520 #content div.box {
521 521 clear:both;
522 522 overflow:hidden;
523 523 background:#fff;
524 524 margin:0 0 10px;
525 525 padding:0 0 10px;
526 526 }
527 527
528 528 #content div.box-left {
529 529 width:49%;
530 530 clear:none;
531 531 float:left;
532 532 margin:0 0 10px;
533 533 }
534 534
535 535 #content div.box-right {
536 536 width:49%;
537 537 clear:none;
538 538 float:right;
539 539 margin:0 0 10px;
540 540 }
541 541
542 542 #content div.box div.title {
543 543 clear:both;
544 544 overflow:hidden;
545 545 background:#369 url("../images/header_inner.png") repeat-x;
546 546 margin:0 0 20px;
547 547 padding:0;
548 548 }
549 549
550 550 #content div.box div.title h5 {
551 551 float:left;
552 552 border:none;
553 553 color:#fff;
554 554 text-transform:uppercase;
555 555 margin:0;
556 556 padding:11px 0 11px 10px;
557 557 }
558 558
559 559 #content div.box div.title ul.links li {
560 560 list-style:none;
561 561 float:left;
562 562 margin:0;
563 563 padding:0;
564 564 }
565 565
566 566 #content div.box div.title ul.links li a {
567 567 height:1%;
568 568 display:block;
569 569 float:left;
570 570 border-left:1px solid #316293;
571 571 color:#fff;
572 572 font-size:11px;
573 573 font-weight:700;
574 574 text-decoration:none;
575 575 margin:0;
576 576 padding:13px 16px 12px;
577 577 }
578 578
579 579 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6 {
580 580 clear:both;
581 581 overflow:hidden;
582 582 border-bottom:1px solid #DDD;
583 583 margin:10px 20px;
584 584 padding:0 0 15px;
585 585 }
586 586
587 587 #content div.box p {
588 588 color:#5f5f5f;
589 589 font-size:12px;
590 590 line-height:150%;
591 591 margin:0 24px 10px;
592 592 padding:0;
593 593 }
594 594
595 595 #content div.box blockquote {
596 596 border-left:4px solid #DDD;
597 597 color:#5f5f5f;
598 598 font-size:11px;
599 599 line-height:150%;
600 600 margin:0 34px;
601 601 padding:0 0 0 14px;
602 602 }
603 603
604 604 #content div.box blockquote p {
605 605 margin:10px 0;
606 606 padding:0;
607 607 }
608 608
609 609 #content div.box dl {
610 610 margin:10px 24px;
611 611 }
612 612
613 613 #content div.box dt {
614 614 font-size:12px;
615 615 margin:0;
616 616 }
617 617
618 618 #content div.box dd {
619 619 font-size:12px;
620 620 margin:0;
621 621 padding:8px 0 8px 15px;
622 622 }
623 623
624 624 #content div.box li {
625 625 font-size:12px;
626 626 padding:4px 0;
627 627 }
628 628
629 629 #content div.box ul.disc,#content div.box ul.circle {
630 630 margin:10px 24px 10px 38px;
631 631 }
632 632
633 633 #content div.box ul.square {
634 634 margin:10px 24px 10px 40px;
635 635 }
636 636
637 637 #content div.box img.left {
638 638 border:none;
639 639 float:left;
640 640 margin:10px 10px 10px 0;
641 641 }
642 642
643 643 #content div.box img.right {
644 644 border:none;
645 645 float:right;
646 646 margin:10px 0 10px 10px;
647 647 }
648 648
649 649 #content div.box div.messages {
650 650 clear:both;
651 651 overflow:hidden;
652 652 margin:0 20px;
653 653 padding:0;
654 654 }
655 655
656 656 #content div.box div.message {
657 657 clear:both;
658 658 overflow:hidden;
659 659 margin:0;
660 660 padding:10px 0;
661 661 }
662 662
663 663 #content div.box div.message a {
664 664 font-weight:400 !important;
665 665 }
666 666
667 667 #content div.box div.message div.image {
668 668 float:left;
669 669 margin:9px 0 0 5px;
670 670 padding:6px;
671 671 }
672 672
673 673 #content div.box div.message div.image img {
674 674 vertical-align:middle;
675 675 margin:0;
676 676 }
677 677
678 678 #content div.box div.message div.text {
679 679 float:left;
680 680 margin:0;
681 681 padding:9px 6px;
682 682 }
683 683
684 684 #content div.box div.message div.dismiss a {
685 685 height:16px;
686 686 width:16px;
687 687 display:block;
688 688 background:url("../images/icons/cross.png") no-repeat;
689 689 margin:15px 14px 0 0;
690 690 padding:0;
691 691 }
692 692
693 693 #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 {
694 694 border:none;
695 695 margin:0;
696 696 padding:0;
697 697 }
698 698
699 699 #content div.box div.message div.text span {
700 700 height:1%;
701 701 display:block;
702 702 margin:0;
703 703 padding:5px 0 0;
704 704 }
705 705
706 706 #content div.box div.message-error {
707 707 height:1%;
708 708 clear:both;
709 709 overflow:hidden;
710 710 background:#FBE3E4;
711 711 border:1px solid #FBC2C4;
712 712 color:#860006;
713 713 }
714 714
715 715 #content div.box div.message-error h6 {
716 716 color:#860006;
717 717 }
718 718
719 719 #content div.box div.message-warning {
720 720 height:1%;
721 721 clear:both;
722 722 overflow:hidden;
723 723 background:#FFF6BF;
724 724 border:1px solid #FFD324;
725 725 color:#5f5200;
726 726 }
727 727
728 728 #content div.box div.message-warning h6 {
729 729 color:#5f5200;
730 730 }
731 731
732 732 #content div.box div.message-notice {
733 733 height:1%;
734 734 clear:both;
735 735 overflow:hidden;
736 736 background:#8FBDE0;
737 737 border:1px solid #6BACDE;
738 738 color:#003863;
739 739 }
740 740
741 741 #content div.box div.message-notice h6 {
742 742 color:#003863;
743 743 }
744 744
745 745 #content div.box div.message-success {
746 746 height:1%;
747 747 clear:both;
748 748 overflow:hidden;
749 749 background:#E6EFC2;
750 750 border:1px solid #C6D880;
751 751 color:#4e6100;
752 752 }
753 753
754 754 #content div.box div.message-success h6 {
755 755 color:#4e6100;
756 756 }
757 757
758 758 #content div.box div.form div.fields div.field {
759 759 height:1%;
760 760 border-bottom:1px solid #DDD;
761 761 clear:both;
762 762 margin:0;
763 763 padding:10px 0;
764 764 }
765 765
766 766 #content div.box div.form div.fields div.field-first {
767 767 padding:0 0 10px;
768 768 }
769 769
770 770 #content div.box div.form div.fields div.field-noborder {
771 771 border-bottom:0 !important;
772 772 }
773 773
774 774 #content div.box div.form div.fields div.field span.error-message {
775 775 height:1%;
776 776 display:inline-block;
777 777 color:red;
778 778 margin:8px 0 0 4px;
779 779 padding:0;
780 780 }
781 781
782 782 #content div.box div.form div.fields div.field span.success {
783 783 height:1%;
784 784 display:block;
785 785 color:#316309;
786 786 margin:8px 0 0;
787 787 padding:0;
788 788 }
789 789
790 790 #content div.box div.form div.fields div.field div.label {
791 791 left:80px;
792 792 width:auto;
793 793 position:absolute;
794 794 margin:0;
795 795 padding:8px 0 0 5px;
796 796 }
797 797
798 798 #content div.box-left div.form div.fields div.field div.label,#content div.box-right div.form div.fields div.field div.label {
799 799 clear:both;
800 800 overflow:hidden;
801 801 left:0;
802 802 width:auto;
803 803 position:relative;
804 804 margin:0;
805 805 padding:0 0 8px;
806 806 }
807 807
808 808 #content div.box div.form div.fields div.field div.label-select {
809 809 padding:5px 0 0 5px;
810 810 }
811 811
812 812 #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 {
813 813 padding:0 0 8px;
814 814 }
815 815
816 816 #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 {
817 817 padding:0 0 8px !important;
818 818 }
819 819
820 820 #content div.box div.form div.fields div.field div.label label {
821 821 color:#393939;
822 822 font-weight:700;
823 823 }
824 824
825 825 #content div.box div.form div.fields div.field div.input {
826 826 margin:0 0 0 200px;
827 827 }
828 828 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input {
829 829 margin:0 0 0 0px;
830 830 }
831 831
832 832 #content div.box div.form div.fields div.field div.input input {
833 833 background:#FFF;
834 834 border-top:1px solid #b3b3b3;
835 835 border-left:1px solid #b3b3b3;
836 836 border-right:1px solid #eaeaea;
837 837 border-bottom:1px solid #eaeaea;
838 838 color:#000;
839 839 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
840 840 font-size:11px;
841 841 margin:0;
842 842 padding:7px 7px 6px;
843 843 }
844 844
845 845
846 846
847 847 #content div.box div.form div.fields div.field div.input input.small {
848 848 width:30%;
849 849 }
850 850
851 851 #content div.box div.form div.fields div.field div.input input.medium {
852 852 width:55%;
853 853 }
854 854
855 855 #content div.box div.form div.fields div.field div.input input.large {
856 856 width:85%;
857 857 }
858 858
859 859 #content div.box div.form div.fields div.field div.input input.date {
860 860 width:177px;
861 861 }
862 862
863 863 #content div.box div.form div.fields div.field div.input input.button {
864 864 background:#D4D0C8;
865 865 border-top:1px solid #FFF;
866 866 border-left:1px solid #FFF;
867 867 border-right:1px solid #404040;
868 868 border-bottom:1px solid #404040;
869 869 color:#000;
870 870 margin:0;
871 871 padding:4px 8px;
872 872 }
873 873
874 874 #content div.box div.form div.fields div.field div.input a.ui-input-file {
875 875 width:28px;
876 876 height:28px;
877 877 display:inline;
878 878 position:absolute;
879 879 overflow:hidden;
880 880 cursor:pointer;
881 881 background:#e5e3e3 url("../images/button_browse.png") no-repeat;
882 882 border:none;
883 883 text-decoration:none;
884 884 margin:0 0 0 6px;
885 885 padding:0;
886 886 }
887 887
888 888 #content div.box div.form div.fields div.field div.textarea {
889 889 border-top:1px solid #b3b3b3;
890 890 border-left:1px solid #b3b3b3;
891 891 border-right:1px solid #eaeaea;
892 892 border-bottom:1px solid #eaeaea;
893 893 margin:0 0 0 200px;
894 894 padding:10px;
895 895 }
896 896
897 897 #content div.box div.form div.fields div.field div.textarea-editor {
898 898 border:1px solid #ddd;
899 899 padding:0;
900 900 }
901 901
902 902 #content div.box div.form div.fields div.field div.textarea textarea {
903 903 width:100%;
904 904 height:220px;
905 905 overflow:hidden;
906 906 background:#FFF;
907 907 color:#000;
908 908 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
909 909 font-size:11px;
910 910 outline:none;
911 911 border-width:0;
912 912 margin:0;
913 913 padding:0;
914 914 }
915 915
916 916 #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 {
917 917 width:100%;
918 918 height:100px;
919 919 }
920 920
921 921 #content div.box div.form div.fields div.field div.textarea table {
922 922 width:100%;
923 923 border:none;
924 924 margin:0;
925 925 padding:0;
926 926 }
927 927
928 928 #content div.box div.form div.fields div.field div.textarea table td {
929 929 background:#DDD;
930 930 border:none;
931 931 padding:0;
932 932 }
933 933
934 934 #content div.box div.form div.fields div.field div.textarea table td table {
935 935 width:auto;
936 936 border:none;
937 937 margin:0;
938 938 padding:0;
939 939 }
940 940
941 941 #content div.box div.form div.fields div.field div.textarea table td table td {
942 942 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
943 943 font-size:11px;
944 944 padding:5px 5px 5px 0;
945 945 }
946 946
947 947 #content div.box div.form div.fields div.field div.textarea table td table td a.mceButtonActive {
948 948 background:#b1b1b1;
949 949 }
950 950
951 951 #content div.box div.form div.fields div.field div.select a.ui-selectmenu {
952 952 color:#565656;
953 953 text-decoration:none;
954 954 }
955 955
956 956 #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 {
957 957 background:#f6f6f6;
958 958 border-color:#666;
959 959 }
960 960
961 961 div.form div.fields div.field div.button {
962 962 margin:0;
963 963 padding:0 0 0 8px;
964 964 }
965 965
966 966 div.form div.fields div.field div.highlight .ui-state-default {
967 967 background:#4e85bb url("../images/button_highlight.png") repeat-x;
968 968 border-top:1px solid #5c91a4;
969 969 border-left:1px solid #2a6f89;
970 970 border-right:1px solid #2b7089;
971 971 border-bottom:1px solid #1a6480;
972 972 color:#FFF;
973 973 margin:0;
974 974 padding:6px 12px;
975 975 }
976 976
977 977 div.form div.fields div.field div.highlight .ui-state-hover {
978 978 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
979 979 border-top:1px solid #78acbf;
980 980 border-left:1px solid #34819e;
981 981 border-right:1px solid #35829f;
982 982 border-bottom:1px solid #257897;
983 983 color:#FFF;
984 984 margin:0;
985 985 padding:6px 12px;
986 986 }
987 987
988 988 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-default {
989 989 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
990 990 border-top:1px solid #5c91a4;
991 991 border-left:1px solid #2a6f89;
992 992 border-right:1px solid #2b7089;
993 993 border-bottom:1px solid #1a6480;
994 994 color:#fff;
995 995 margin:0;
996 996 padding:6px 12px;
997 997 }
998 998
999 999 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-hover {
1000 1000 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
1001 1001 border-top:1px solid #78acbf;
1002 1002 border-left:1px solid #34819e;
1003 1003 border-right:1px solid #35829f;
1004 1004 border-bottom:1px solid #257897;
1005 1005 color:#fff;
1006 1006 margin:0;
1007 1007 padding:6px 12px;
1008 1008 }
1009 1009
1010 1010 #content div.box table {
1011 1011 width:100%;
1012 1012 border-collapse:collapse;
1013 1013 margin:0;
1014 1014 padding:0;
1015 1015 }
1016 1016
1017 1017 #content div.box table th {
1018 1018 background:#eee;
1019 1019 border-bottom:1px solid #ddd;
1020 1020 padding:5px 0px 5px 5px;
1021 1021 }
1022 1022
1023 1023 #content div.box table th.left {
1024 1024 text-align:left;
1025 1025 }
1026 1026
1027 1027 #content div.box table th.right {
1028 1028 text-align:right;
1029 1029 }
1030 1030
1031 1031 #content div.box table th.center {
1032 1032 text-align:center;
1033 1033 }
1034 1034
1035 1035 #content div.box table th.selected {
1036 1036 vertical-align:middle;
1037 1037 padding:0;
1038 1038 }
1039 1039
1040 1040 #content div.box table td {
1041 1041 background:#fff;
1042 1042 border-bottom:1px solid #cdcdcd;
1043 1043 vertical-align:middle;
1044 1044 padding:5px;
1045 1045 }
1046 1046
1047 1047 #content div.box table tr.selected td {
1048 1048 background:#FFC;
1049 1049 }
1050 1050
1051 1051 #content div.box table td.selected {
1052 1052 width:3%;
1053 1053 text-align:center;
1054 1054 vertical-align:middle;
1055 1055 padding:0;
1056 1056 }
1057 1057
1058 1058 #content div.box table td.action {
1059 1059 width:45%;
1060 1060 text-align:left;
1061 1061 }
1062 1062
1063 1063 #content div.box table td.date {
1064 1064 width:33%;
1065 1065 text-align:center;
1066 1066 }
1067 1067
1068 1068 #content div.box div.action {
1069 1069 float:right;
1070 1070 background:#FFF;
1071 1071 text-align:right;
1072 1072 margin:10px 0 0;
1073 1073 padding:0;
1074 1074 }
1075 1075
1076 1076 #content div.box div.action select {
1077 1077 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1078 1078 font-size:11px;
1079 1079 margin:0;
1080 1080 }
1081 1081
1082 1082 #content div.box div.action .ui-selectmenu {
1083 1083 margin:0;
1084 1084 padding:0;
1085 1085 }
1086 1086
1087 1087 #content div.box div.pagination {
1088 1088 height:1%;
1089 1089 clear:both;
1090 1090 overflow:hidden;
1091 1091 margin:10px 0 0;
1092 1092 padding:0;
1093 1093 }
1094 1094
1095 1095 #content div.box div.pagination ul.pager {
1096 1096 float:right;
1097 1097 text-align:right;
1098 1098 margin:0;
1099 1099 padding:0;
1100 1100 }
1101 1101
1102 1102 #content div.box div.pagination ul.pager li {
1103 1103 height:1%;
1104 1104 float:left;
1105 1105 list-style:none;
1106 1106 background:#ebebeb url("../images/pager.png") repeat-x;
1107 1107 border-top:1px solid #dedede;
1108 1108 border-left:1px solid #cfcfcf;
1109 1109 border-right:1px solid #c4c4c4;
1110 1110 border-bottom:1px solid #c4c4c4;
1111 1111 color:#4A4A4A;
1112 1112 font-weight:700;
1113 1113 margin:0 0 0 4px;
1114 1114 padding:0;
1115 1115 }
1116 1116
1117 1117 #content div.box div.pagination ul.pager li.separator {
1118 1118 padding:6px;
1119 1119 }
1120 1120
1121 1121 #content div.box div.pagination ul.pager li.current {
1122 1122 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1123 1123 border-top:1px solid #ccc;
1124 1124 border-left:1px solid #bebebe;
1125 1125 border-right:1px solid #b1b1b1;
1126 1126 border-bottom:1px solid #afafaf;
1127 1127 color:#515151;
1128 1128 padding:6px;
1129 1129 }
1130 1130
1131 1131 #content div.box div.pagination ul.pager li a {
1132 1132 height:1%;
1133 1133 display:block;
1134 1134 float:left;
1135 1135 color:#515151;
1136 1136 text-decoration:none;
1137 1137 margin:0;
1138 1138 padding:6px;
1139 1139 }
1140 1140
1141 1141 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active {
1142 1142 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1143 1143 border-top:1px solid #ccc;
1144 1144 border-left:1px solid #bebebe;
1145 1145 border-right:1px solid #b1b1b1;
1146 1146 border-bottom:1px solid #afafaf;
1147 1147 margin:-1px;
1148 1148 }
1149 1149
1150 1150 #content div.box div.pagination-wh {
1151 1151 height:1%;
1152 1152 clear:both;
1153 1153 overflow:hidden;
1154 1154 text-align:right;
1155 1155 margin:10px 0 0;
1156 1156 padding:0;
1157 1157 }
1158 1158
1159 1159 #content div.box div.pagination-right {
1160 1160 float:right;
1161 1161 }
1162 1162
1163 1163 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot {
1164 1164 height:1%;
1165 1165 float:left;
1166 1166 background:#ebebeb url("../images/pager.png") repeat-x;
1167 1167 border-top:1px solid #dedede;
1168 1168 border-left:1px solid #cfcfcf;
1169 1169 border-right:1px solid #c4c4c4;
1170 1170 border-bottom:1px solid #c4c4c4;
1171 1171 color:#4A4A4A;
1172 1172 font-weight:700;
1173 1173 margin:0 0 0 4px;
1174 1174 padding:6px;
1175 1175 }
1176 1176
1177 1177 #content div.box div.pagination-wh span.pager_curpage {
1178 1178 height:1%;
1179 1179 float:left;
1180 1180 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1181 1181 border-top:1px solid #ccc;
1182 1182 border-left:1px solid #bebebe;
1183 1183 border-right:1px solid #b1b1b1;
1184 1184 border-bottom:1px solid #afafaf;
1185 1185 color:#515151;
1186 1186 font-weight:700;
1187 1187 margin:0 0 0 4px;
1188 1188 padding:6px;
1189 1189 }
1190 1190
1191 1191 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active {
1192 1192 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1193 1193 border-top:1px solid #ccc;
1194 1194 border-left:1px solid #bebebe;
1195 1195 border-right:1px solid #b1b1b1;
1196 1196 border-bottom:1px solid #afafaf;
1197 1197 text-decoration:none;
1198 1198 }
1199 1199
1200 1200 #content div.box div.traffic div.legend {
1201 1201 clear:both;
1202 1202 overflow:hidden;
1203 1203 border-bottom:1px solid #ddd;
1204 1204 margin:0 0 10px;
1205 1205 padding:0 0 10px;
1206 1206 }
1207 1207
1208 1208 #content div.box div.traffic div.legend h6 {
1209 1209 float:left;
1210 1210 border:none;
1211 1211 margin:0;
1212 1212 padding:0;
1213 1213 }
1214 1214
1215 1215 #content div.box div.traffic div.legend li {
1216 1216 list-style:none;
1217 1217 float:left;
1218 1218 font-size:11px;
1219 1219 margin:0;
1220 1220 padding:0 8px 0 4px;
1221 1221 }
1222 1222
1223 1223 #content div.box div.traffic div.legend li.visits {
1224 1224 border-left:12px solid #edc240;
1225 1225 }
1226 1226
1227 1227 #content div.box div.traffic div.legend li.pageviews {
1228 1228 border-left:12px solid #afd8f8;
1229 1229 }
1230 1230
1231 1231 #content div.box div.traffic table {
1232 1232 width:auto;
1233 1233 }
1234 1234
1235 1235 #content div.box div.traffic table td {
1236 1236 background:transparent;
1237 1237 border:none;
1238 1238 padding:2px 3px 3px;
1239 1239 }
1240 1240
1241 1241 #content div.box div.traffic table td.legendLabel {
1242 1242 padding:0 3px 2px;
1243 1243 }
1244 1244
1245 1245 #footer {
1246 1246 clear:both;
1247 1247 overflow:hidden;
1248 1248 text-align:right;
1249 1249 margin:0;
1250 1250 padding:0 30px 4px;
1251 1251 margin:-10px 0 0;
1252 1252 }
1253 1253
1254 1254 #footer div#footer-inner {
1255 1255 background:url("../images/header_inner.png") repeat-x scroll 0 0 #003367;
1256 1256 border-top:2px solid #FFFFFF;
1257 1257 }
1258 1258
1259 1259 #footer div#footer-inner p {
1260 1260 padding:15px 25px 15px 0;
1261 1261 color:#FFF;
1262 1262 font-weight:700;
1263 1263 }
1264 1264 #footer div#footer-inner .footer-link {
1265 1265 float:left;
1266 1266 padding-left:10px;
1267 1267 }
1268 1268 #footer div#footer-inner .footer-link a {
1269 1269 color:#FFF;
1270 1270 }
1271 1271
1272 1272 #login div.title {
1273 1273 width:420px;
1274 1274 clear:both;
1275 1275 overflow:hidden;
1276 1276 position:relative;
1277 1277 background:#003367 url("../../images/header_inner.png") repeat-x;
1278 1278 margin:0 auto;
1279 1279 padding:0;
1280 1280 }
1281 1281
1282 1282 #login div.inner {
1283 1283 width:380px;
1284 1284 background:#FFF url("../images/login.png") no-repeat top left;
1285 1285 border-top:none;
1286 1286 border-bottom:none;
1287 1287 margin:0 auto;
1288 1288 padding:20px;
1289 1289 }
1290 1290
1291 1291 #login div.form div.fields div.field div.label {
1292 1292 width:173px;
1293 1293 float:left;
1294 1294 text-align:right;
1295 1295 margin:2px 10px 0 0;
1296 1296 padding:5px 0 0 5px;
1297 1297 }
1298 1298
1299 1299 #login div.form div.fields div.field div.input input {
1300 1300 width:176px;
1301 1301 background:#FFF;
1302 1302 border-top:1px solid #b3b3b3;
1303 1303 border-left:1px solid #b3b3b3;
1304 1304 border-right:1px solid #eaeaea;
1305 1305 border-bottom:1px solid #eaeaea;
1306 1306 color:#000;
1307 1307 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1308 1308 font-size:11px;
1309 1309 margin:0;
1310 1310 padding:7px 7px 6px;
1311 1311 }
1312 1312
1313 1313 #login div.form div.fields div.buttons {
1314 1314 clear:both;
1315 1315 overflow:hidden;
1316 1316 border-top:1px solid #DDD;
1317 1317 text-align:right;
1318 1318 margin:0;
1319 1319 padding:10px 0 0;
1320 1320 }
1321 1321
1322 1322 #login div.form div.links {
1323 1323 clear:both;
1324 1324 overflow:hidden;
1325 1325 margin:10px 0 0;
1326 1326 padding:0 0 2px;
1327 1327 }
1328 1328
1329 1329 #register div.title {
1330 1330 width:420px;
1331 1331 clear:both;
1332 1332 overflow:hidden;
1333 1333 position:relative;
1334 1334 background:#003367 url("../images/header_inner.png") repeat-x;
1335 1335 margin:0 auto;
1336 1336 padding:0;
1337 1337 }
1338 1338
1339 1339 #register div.inner {
1340 1340 width:380px;
1341 1341 background:#FFF;
1342 1342 border-top:none;
1343 1343 border-bottom:none;
1344 1344 margin:0 auto;
1345 1345 padding:20px;
1346 1346 }
1347 1347
1348 1348 #register div.form div.fields div.field div.label {
1349 1349 width:100px;
1350 1350 float:left;
1351 1351 text-align:right;
1352 1352 margin:2px 10px 0 0;
1353 1353 padding:5px 0 0 5px;
1354 1354 }
1355 1355
1356 1356 #register div.form div.fields div.field div.input input {
1357 1357 width:245px;
1358 1358 background:#FFF;
1359 1359 border-top:1px solid #b3b3b3;
1360 1360 border-left:1px solid #b3b3b3;
1361 1361 border-right:1px solid #eaeaea;
1362 1362 border-bottom:1px solid #eaeaea;
1363 1363 color:#000;
1364 1364 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1365 1365 font-size:11px;
1366 1366 margin:0;
1367 1367 padding:7px 7px 6px;
1368 1368 }
1369 1369
1370 1370 #register div.form div.fields div.buttons {
1371 1371 clear:both;
1372 1372 overflow:hidden;
1373 1373 border-top:1px solid #DDD;
1374 1374 text-align:left;
1375 1375 margin:0;
1376 1376 padding:10px 0 0 114px;
1377 1377 }
1378 1378
1379 1379 #register div.form div.fields div.buttons div.highlight input.ui-state-default {
1380 1380 background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB;
1381 1381 color:#FFF;
1382 1382 border-color:#5C91A4 #2B7089 #1A6480 #2A6F89;
1383 1383 border-style:solid;
1384 1384 border-width:1px;
1385 1385 }
1386 1386
1387 1387 #register div.form div.activation_msg {
1388 1388 padding-top:4px;
1389 1389 padding-bottom:4px;
1390 1390 }
1391 1391
1392 1392 .trending_language_tbl,.trending_language_tbl td {
1393 1393 border:0 !important;
1394 1394 margin:0 !important;
1395 1395 padding:0 !important;
1396 1396 }
1397 1397
1398 1398 .trending_language {
1399 1399 background-color:#003367;
1400 1400 color:#FFF;
1401 1401 display:block;
1402 1402 min-width:20px;
1403 1403 text-decoration:none;
1404 1404 height:12px;
1405 1405 margin-bottom:4px;
1406 1406 margin-left:5px;
1407 1407 white-space:pre;
1408 1408 padding:3px;
1409 1409 }
1410 1410
1411 1411 h3.files_location {
1412 1412 font-size:1.8em;
1413 1413 font-weight:700;
1414 1414 border-bottom:none !important;
1415 1415 margin:10px 0 !important;
1416 1416 }
1417 1417
1418 1418 #files_data dl dt {
1419 1419 float:left;
1420 1420 width:115px;
1421 1421 margin:0 !important;
1422 1422 padding:5px;
1423 1423 }
1424 1424
1425 1425 #files_data dl dd {
1426 1426 margin:0 !important;
1427 1427 padding:5px !important;
1428 1428 }
1429 1429
1430 1430 #changeset_content {
1431 1431 border:1px solid #CCC;
1432 1432 padding:5px;
1433 1433 }
1434 1434
1435 1435 #changeset_content .container {
1436 1436 min-height:120px;
1437 1437 font-size:1.2em;
1438 1438 overflow:hidden;
1439 1439 }
1440 1440
1441 1441 #changeset_content .container .right {
1442 1442 float:right;
1443 1443 width:25%;
1444 1444 text-align:right;
1445 1445 }
1446 1446
1447 1447 #changeset_content .container .left .message {
1448 1448 font-style:italic;
1449 1449 color:#556CB5;
1450 1450 white-space:pre-wrap;
1451 1451 }
1452 1452
1453 1453 .cs_files .cs_added {
1454 1454 background:url("../images/icons/page_white_add.png") no-repeat scroll 3px;
1455 1455 height:16px;
1456 1456 padding-left:20px;
1457 1457 margin-top:7px;
1458 1458 text-align:left;
1459 1459 }
1460 1460
1461 1461 .cs_files .cs_changed {
1462 1462 background:url("../images/icons/page_white_edit.png") no-repeat scroll 3px;
1463 1463 height:16px;
1464 1464 padding-left:20px;
1465 1465 margin-top:7px;
1466 1466 text-align:left;
1467 1467 }
1468 1468
1469 1469 .cs_files .cs_removed {
1470 1470 background:url("../images/icons/page_white_delete.png") no-repeat scroll 3px;
1471 1471 height:16px;
1472 1472 padding-left:20px;
1473 1473 margin-top:7px;
1474 1474 text-align:left;
1475 1475 }
1476 1476
1477 1477 #graph {
1478 1478 overflow:hidden;
1479 1479 }
1480 1480
1481 1481 #graph_nodes {
1482 1482 width:160px;
1483 1483 float:left;
1484 1484 margin-left:-50px;
1485 1485 margin-top:5px;
1486 1486 }
1487 1487
1488 1488 #graph_content {
1489 1489 width:800px;
1490 1490 float:left;
1491 1491 }
1492 1492
1493 1493 #graph_content .container_header {
1494 1494 border:1px solid #CCC;
1495 1495 padding:10px;
1496 1496 }
1497 1497
1498 1498 #graph_content .container {
1499 1499 border-bottom:1px solid #CCC;
1500 1500 border-left:1px solid #CCC;
1501 1501 border-right:1px solid #CCC;
1502 1502 min-height:80px;
1503 1503 overflow:hidden;
1504 1504 font-size:1.2em;
1505 1505 }
1506 1506
1507 1507 #graph_content .container .right {
1508 1508 float:right;
1509 1509 width:28%;
1510 1510 text-align:right;
1511 1511 padding-bottom:5px;
1512 1512 }
1513 1513
1514 1514 #graph_content .container .left .date {
1515 1515 font-weight:700;
1516 1516 padding-bottom:5px;
1517 1517 }
1518 1518
1519 1519 #graph_content .container .left .message {
1520 1520 font-size:100%;
1521 1521 padding-top:3px;
1522 1522 white-space:pre-wrap;
1523 1523 }
1524 1524
1525 1525 .right div {
1526 1526 clear:both;
1527 1527 }
1528 1528
1529 1529 .right .changes .added,.changed,.removed {
1530 1530 border:1px solid #DDD;
1531 1531 display:block;
1532 1532 float:right;
1533 1533 text-align:center;
1534 1534 min-width:15px;
1535 1535 }
1536 1536
1537 1537 .right .changes .added {
1538 1538 background:#BFB;
1539 1539 }
1540 1540
1541 1541 .right .changes .changed {
1542 1542 background:#FD8;
1543 1543 }
1544 1544
1545 1545 .right .changes .removed {
1546 1546 background:#F88;
1547 1547 }
1548 1548
1549 1549 .right .merge {
1550 1550 vertical-align:top;
1551 1551 font-size:0.75em;
1552 1552 font-weight:700;
1553 1553 }
1554 1554
1555 1555 .right .parent {
1556 1556 font-size:90%;
1557 1557 font-family:monospace;
1558 1558 }
1559 1559
1560 1560 .right .logtags .branchtag {
1561 1561 background:#FFF url("../images/icons/arrow_branch.png") no-repeat right 6px;
1562 1562 display:block;
1563 1563 font-size:0.8em;
1564 1564 padding:11px 16px 0 0;
1565 1565 }
1566 1566
1567 1567 .right .logtags .tagtag {
1568 1568 background:#FFF url("../images/icons/tag_blue.png") no-repeat right 6px;
1569 1569 display:block;
1570 1570 font-size:0.8em;
1571 1571 padding:11px 16px 0 0;
1572 1572 }
1573 1573
1574 1574 div.browserblock {
1575 1575 overflow:hidden;
1576 1576 border:1px solid #ccc;
1577 1577 background:#f8f8f8;
1578 1578 font-size:100%;
1579 1579 line-height:125%;
1580 1580 padding:0;
1581 1581 }
1582 1582
1583 1583 div.browserblock .browser-header {
1584 1584 border-bottom:1px solid #CCC;
1585 1585 background:#FFF;
1586 1586 color:blue;
1587 1587 padding:10px 0;
1588 1588 }
1589 1589
1590 1590 div.browserblock .browser-header span {
1591 1591 margin-left:25px;
1592 1592 font-weight:700;
1593 1593 }
1594 1594
1595 1595 div.browserblock .browser-body {
1596 1596 background:#EEE;
1597 1597 }
1598 1598
1599 1599 table.code-browser {
1600 1600 border-collapse:collapse;
1601 1601 width:100%;
1602 1602 }
1603 1603
1604 1604 table.code-browser tr {
1605 1605 margin:3px;
1606 1606 }
1607 1607
1608 1608 table.code-browser thead th {
1609 1609 background-color:#EEE;
1610 1610 height:20px;
1611 1611 font-size:1.1em;
1612 1612 font-weight:700;
1613 1613 text-align:left;
1614 1614 padding-left:10px;
1615 1615 }
1616 1616
1617 1617 table.code-browser tbody td {
1618 1618 padding-left:10px;
1619 1619 height:20px;
1620 1620 }
1621 1621
1622 1622 table.code-browser .browser-file {
1623 1623 background:url("../images/icons/document_16.png") no-repeat scroll 3px;
1624 1624 height:16px;
1625 1625 padding-left:20px;
1626 1626 text-align:left;
1627 1627 }
1628 1628
1629 1629 table.code-browser .browser-dir {
1630 1630 background:url("../images/icons/folder_16.png") no-repeat scroll 3px;
1631 1631 height:16px;
1632 1632 padding-left:20px;
1633 1633 text-align:left;
1634 1634 }
1635 1635
1636 1636 .box .search {
1637 1637 clear:both;
1638 1638 overflow:hidden;
1639 1639 margin:0;
1640 1640 padding:0 20px 10px;
1641 1641 }
1642 1642
1643 1643 .box .search div.search_path {
1644 1644 background:none repeat scroll 0 0 #EEE;
1645 1645 border:1px solid #CCC;
1646 1646 color:blue;
1647 1647 margin-bottom:10px;
1648 1648 padding:10px 0;
1649 1649 }
1650 1650
1651 1651 .box .search div.search_path div.link {
1652 1652 font-weight:700;
1653 1653 margin-left:25px;
1654 1654 }
1655 1655
1656 1656 .box .search div.search_path div.link a {
1657 1657 color:#003367;
1658 1658 cursor:pointer;
1659 1659 text-decoration:none;
1660 1660 }
1661 1661
1662 1662 #path_unlock {
1663 1663 color:red;
1664 1664 font-size:1.2em;
1665 1665 padding-left:4px;
1666 1666 }
1667 1667
1668 1668 .info_box * {
1669 1669 background:url("../../images/pager.png") repeat-x scroll 0 0 #EBEBEB;
1670 1670 color:#4A4A4A;
1671 1671 font-weight:700;
1672 1672 height:1%;
1673 1673 display:inline;
1674 1674 border-color:#DEDEDE #C4C4C4 #C4C4C4 #CFCFCF;
1675 1675 border-style:solid;
1676 1676 border-width:1px;
1677 1677 padding:4px 6px;
1678 1678 }
1679 1679
1680 1680 .info_box span {
1681 1681 margin-left:3px;
1682 1682 margin-right:3px;
1683 1683 }
1684 1684
1685 1685 .info_box input#at_rev {
1686 1686 text-align:center;
1687 1687 padding:5px 3px 3px 2px;
1688 1688 }
1689 1689
1690 1690 .info_box input#view {
1691 1691 text-align:center;
1692 1692 padding:4px 3px 2px 2px;
1693 1693 }
1694 1694
1695 1695 .yui-overlay,.yui-panel-container {
1696 1696 visibility:hidden;
1697 1697 position:absolute;
1698 1698 z-index:2;
1699 1699 }
1700 1700
1701 1701 .yui-tt {
1702 1702 visibility:hidden;
1703 1703 position:absolute;
1704 1704 color:#666;
1705 1705 background-color:#FFF;
1706 1706 font-family:arial, helvetica, verdana, sans-serif;
1707 1707 border:2px solid #003367;
1708 1708 font:100% sans-serif;
1709 1709 width:auto;
1710 1710 opacity:1px;
1711 1711 padding:8px;
1712 1712 white-space: pre;
1713 1713 }
1714 1714
1715 1715 .ac {
1716 1716 vertical-align:top;
1717 1717 }
1718 1718
1719 1719 .ac .yui-ac {
1720 1720 position:relative;
1721 1721 font-family:arial;
1722 1722 font-size:100%;
1723 1723 }
1724 1724
1725 1725 .ac .perm_ac {
1726 1726 width:15em;
1727 1727 }
1728 1728
1729 1729 .ac .yui-ac-input {
1730 1730 width:100%;
1731 1731 }
1732 1732
1733 1733 .ac .yui-ac-container {
1734 1734 position:absolute;
1735 1735 top:1.6em;
1736 1736 width:100%;
1737 1737 }
1738 1738
1739 1739 .ac .yui-ac-content {
1740 1740 position:absolute;
1741 1741 width:100%;
1742 1742 border:1px solid gray;
1743 1743 background:#fff;
1744 1744 overflow:hidden;
1745 1745 z-index:9050;
1746 1746 }
1747 1747
1748 1748 .ac .yui-ac-shadow {
1749 1749 position:absolute;
1750 1750 width:100%;
1751 1751 background:#000;
1752 1752 -moz-opacity:0.1px;
1753 1753 opacity:.10;
1754 1754 filter:alpha(opacity = 10);
1755 1755 z-index:9049;
1756 1756 margin:.3em;
1757 1757 }
1758 1758
1759 1759 .ac .yui-ac-content ul {
1760 1760 width:100%;
1761 1761 margin:0;
1762 1762 padding:0;
1763 1763 }
1764 1764
1765 1765 .ac .yui-ac-content li {
1766 1766 cursor:default;
1767 1767 white-space:nowrap;
1768 1768 margin:0;
1769 1769 padding:2px 5px;
1770 1770 }
1771 1771
1772 1772 .ac .yui-ac-content li.yui-ac-prehighlight {
1773 1773 background:#B3D4FF;
1774 1774 }
1775 1775
1776 1776 .ac .yui-ac-content li.yui-ac-highlight {
1777 1777 background:#556CB5;
1778 1778 color:#FFF;
1779 1779 }
1780 1780
1781 1781 .add_icon {
1782 1782 background:url("../images/icons/add.png") no-repeat scroll 3px;
1783 1783 height:16px;
1784 1784 padding-left:20px;
1785 1785 padding-top:1px;
1786 1786 text-align:left;
1787 1787 }
1788 1788
1789 1789 .edit_icon {
1790 1790 background:url("../images/icons/folder_edit.png") no-repeat scroll 3px;
1791 1791 height:16px;
1792 1792 padding-left:20px;
1793 1793 padding-top:1px;
1794 1794 text-align:left;
1795 1795 }
1796 1796
1797 1797 .delete_icon {
1798 1798 background:url("../images/icons/delete.png") no-repeat scroll 3px;
1799 1799 height:16px;
1800 1800 padding-left:20px;
1801 1801 padding-top:1px;
1802 1802 text-align:left;
1803 1803 }
1804 1804
1805 .refresh_icon {
1806 background:url("../images/icons/arrow_refresh.png") no-repeat scroll 3px;
1807 height:16px;
1808 padding-left:20px;
1809 padding-top:1px;
1810 text-align:left;
1811 }
1812
1805 1813 .rss_icon {
1806 1814 background:url("../images/icons/rss_16.png") no-repeat scroll 3px;
1807 1815 height:16px;
1808 1816 padding-left:20px;
1809 1817 padding-top:1px;
1810 1818 text-align:left;
1811 1819 }
1812 1820
1813 1821 .atom_icon {
1814 1822 background:url("../images/icons/atom.png") no-repeat scroll 3px;
1815 1823 height:16px;
1816 1824 padding-left:20px;
1817 1825 padding-top:1px;
1818 1826 text-align:left;
1819 1827 }
1820 1828
1821 1829 .archive_icon {
1822 1830 background:url("../images/icons/compress.png") no-repeat scroll 3px;
1823 1831 height:16px;
1824 1832 padding-left:20px;
1825 1833 text-align:left;
1826 1834 padding-top:1px;
1827 1835 }
1828 1836
1829 1837 .action_button {
1830 1838 border:0;
1831 1839 display:block;
1832 1840 }
1833 1841
1834 1842 .action_button:hover {
1835 1843 border:0;
1836 1844 text-decoration:underline;
1837 1845 cursor:pointer;
1838 1846 }
1839 1847
1840 1848 #switch_repos {
1841 1849 position:absolute;
1842 1850 height:25px;
1843 1851 z-index:1;
1844 1852 }
1845 1853
1846 1854 #switch_repos select {
1847 1855 min-width:150px;
1848 1856 max-height:250px;
1849 1857 z-index:1;
1850 1858 }
1851 1859
1852 1860 .breadcrumbs {
1853 1861 border:medium none;
1854 1862 color:#FFF;
1855 1863 float:left;
1856 1864 text-transform:uppercase;
1857 1865 font-weight:700;
1858 1866 font-size:14px;
1859 1867 margin:0;
1860 1868 padding:11px 0 11px 10px;
1861 1869 }
1862 1870
1863 1871 .breadcrumbs a {
1864 1872 color:#FFF;
1865 1873 }
1866 1874
1867 1875 .flash_msg ul {
1868 1876 margin:0;
1869 1877 padding:0 0 10px;
1870 1878 }
1871 1879
1872 1880 .error_msg {
1873 1881 background-color:#FFCFCF;
1874 1882 background-image:url("../../images/icons/error_msg.png");
1875 1883 border:1px solid #FF9595;
1876 1884 color:#C30;
1877 1885 }
1878 1886
1879 1887 .warning_msg {
1880 1888 background-color:#FFFBCC;
1881 1889 background-image:url("../../images/icons/warning_msg.png");
1882 1890 border:1px solid #FFF35E;
1883 1891 color:#C69E00;
1884 1892 }
1885 1893
1886 1894 .success_msg {
1887 1895 background-color:#D5FFCF;
1888 1896 background-image:url("../../images/icons/success_msg.png");
1889 1897 border:1px solid #97FF88;
1890 1898 color:#090;
1891 1899 }
1892 1900
1893 1901 .notice_msg {
1894 1902 background-color:#DCE3FF;
1895 1903 background-image:url("../../images/icons/notice_msg.png");
1896 1904 border:1px solid #93A8FF;
1897 1905 color:#556CB5;
1898 1906 }
1899 1907
1900 1908 .success_msg,.error_msg,.notice_msg,.warning_msg {
1901 1909 background-position:10px center;
1902 1910 background-repeat:no-repeat;
1903 1911 font-size:12px;
1904 1912 font-weight:700;
1905 1913 min-height:14px;
1906 1914 line-height:14px;
1907 1915 margin-bottom:0;
1908 1916 margin-top:0;
1909 1917 display:block;
1910 1918 overflow:auto;
1911 1919 padding:6px 10px 6px 40px;
1912 1920 }
1913 1921
1914 1922 #msg_close {
1915 1923 background:transparent url("../../icons/cross_grey_small.png") no-repeat scroll 0 0;
1916 1924 cursor:pointer;
1917 1925 height:16px;
1918 1926 position:absolute;
1919 1927 right:5px;
1920 1928 top:5px;
1921 1929 width:16px;
1922 1930 }
1923 1931
1924 1932 div#legend_container table,div#legend_choices table {
1925 1933 width:auto !important;
1926 1934 }
1927 1935
1928 1936 table#permissions_manage {
1929 1937 width:0 !important;
1930 1938 }
1931 1939
1932 1940 table#permissions_manage span.private_repo_msg {
1933 1941 font-size:0.8em;
1934 1942 opacity:0.6px;
1935 1943 }
1936 1944
1937 1945 table#permissions_manage td.private_repo_msg {
1938 1946 font-size:0.8em;
1939 1947 }
1940 1948
1941 1949 table#permissions_manage tr#add_perm_input td {
1942 1950 vertical-align:middle;
1943 1951 }
1944 1952
1945 1953 div.gravatar {
1946 1954 background-color:#FFF;
1947 1955 border:1px solid #D0D0D0;
1948 1956 float:left;
1949 1957 margin-right:0.7em;
1950 1958 padding:2px 2px 0;
1951 1959 }
1952 1960
1953 1961 #header,#content,#footer {
1954 1962 min-width:1024px;
1955 1963 }
1956 1964
1957 1965 #content {
1958 1966 min-height:100%;
1959 1967 clear:both;
1960 1968 overflow:hidden;
1961 1969 padding:14px 30px;
1962 1970 }
1963 1971
1964 1972 #content div.box div.title div.search {
1965 1973 background:url("../../images/title_link.png") no-repeat top left;
1966 1974 border-left:1px solid #316293;
1967 1975 }
1968 1976
1969 1977 #content div.box div.title div.search div.input input {
1970 1978 border:1px solid #316293;
1971 1979 }
1972 1980
1973 1981 #content div.box div.title div.search div.button input.ui-state-default {
1974 1982 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1975 1983 border:1px solid #316293;
1976 1984 border-left:none;
1977 1985 color:#FFF;
1978 1986 }
1979 1987
1980 1988 #content div.box div.title div.search div.button input.ui-state-hover {
1981 1989 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
1982 1990 border:1px solid #316293;
1983 1991 border-left:none;
1984 1992 color:#FFF;
1985 1993 }
1986 1994
1987 1995 #content div.box div.form div.fields div.field div.highlight .ui-state-default {
1988 1996 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1989 1997 border-top:1px solid #5c91a4;
1990 1998 border-left:1px solid #2a6f89;
1991 1999 border-right:1px solid #2b7089;
1992 2000 border-bottom:1px solid #1a6480;
1993 2001 color:#fff;
1994 2002 }
1995 2003
1996 2004 #content div.box div.form div.fields div.field div.highlight .ui-state-hover {
1997 2005 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
1998 2006 border-top:1px solid #78acbf;
1999 2007 border-left:1px solid #34819e;
2000 2008 border-right:1px solid #35829f;
2001 2009 border-bottom:1px solid #257897;
2002 2010 color:#fff;
2003 2011 }
2004 2012
2005 2013 ins,div.options a:hover {
2006 2014 text-decoration:none;
2007 2015 }
2008 2016
2009 2017 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 {
2010 2018 border:none;
2011 2019 }
2012 2020
2013 2021 img.icon,.right .merge img {
2014 2022 vertical-align:bottom;
2015 2023 }
2016 2024
2017 2025 #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 {
2018 2026 float:right;
2019 2027 margin:0;
2020 2028 padding:0;
2021 2029 }
2022 2030
2023 2031 #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 {
2024 2032 float:left;
2025 2033 }
2026 2034
2027 2035 #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 {
2028 2036 display:none;
2029 2037 }
2030 2038
2031 2039 #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 {
2032 2040 display:block;
2033 2041 }
2034 2042
2035 2043 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a {
2036 2044 color:#bfe3ff;
2037 2045 }
2038 2046
2039 2047 #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 {
2040 2048 margin:10px 24px 10px 44px;
2041 2049 }
2042 2050
2043 2051 #content div.box div.form,#content div.box div.table,#content div.box div.traffic {
2044 2052 clear:both;
2045 2053 overflow:hidden;
2046 2054 margin:0;
2047 2055 padding:0 20px 10px;
2048 2056 }
2049 2057
2050 2058 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields {
2051 2059 clear:both;
2052 2060 overflow:hidden;
2053 2061 margin:0;
2054 2062 padding:0;
2055 2063 }
2056 2064
2057 2065 #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 {
2058 2066 height:1%;
2059 2067 display:block;
2060 2068 color:#363636;
2061 2069 margin:0;
2062 2070 padding:2px 0 0;
2063 2071 }
2064 2072
2065 2073 #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 {
2066 2074 background:#FBE3E4;
2067 2075 border-top:1px solid #e1b2b3;
2068 2076 border-left:1px solid #e1b2b3;
2069 2077 border-right:1px solid #FBC2C4;
2070 2078 border-bottom:1px solid #FBC2C4;
2071 2079 }
2072 2080
2073 2081 #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 {
2074 2082 background:#E6EFC2;
2075 2083 border-top:1px solid #cebb98;
2076 2084 border-left:1px solid #cebb98;
2077 2085 border-right:1px solid #c6d880;
2078 2086 border-bottom:1px solid #c6d880;
2079 2087 }
2080 2088
2081 2089 #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 {
2082 2090 margin:0;
2083 2091 }
2084 2092
2085 2093 #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{
2086 2094 margin:0 0 0 0px !important;
2087 2095 padding:0;
2088 2096 }
2089 2097
2090 2098 #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 {
2091 2099 margin:0 0 0 200px;
2092 2100 padding:0;
2093 2101 }
2094 2102
2095 2103
2096 2104 #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 {
2097 2105 color:#000;
2098 2106 text-decoration:none;
2099 2107 }
2100 2108
2101 2109 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus {
2102 2110 border:1px solid #666;
2103 2111 }
2104 2112
2105 2113 #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 {
2106 2114 clear:both;
2107 2115 overflow:hidden;
2108 2116 margin:0;
2109 2117 padding:8px 0 2px;
2110 2118 }
2111 2119
2112 2120 #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 {
2113 2121 float:left;
2114 2122 margin:0;
2115 2123 }
2116 2124
2117 2125 #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 {
2118 2126 height:1%;
2119 2127 display:block;
2120 2128 float:left;
2121 2129 margin:2px 0 0 4px;
2122 2130 }
2123 2131
2124 2132 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 {
2125 2133 color:#000;
2126 2134 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
2127 2135 font-size:11px;
2128 2136 font-weight:700;
2129 2137 margin:0;
2130 2138 }
2131 2139
2132 2140 div.form div.fields div.field div.button .ui-state-default,#content div.box div.form div.fields div.buttons input.ui-state-default {
2133 2141 background:#e5e3e3 url("../images/button.png") repeat-x;
2134 2142 border-top:1px solid #DDD;
2135 2143 border-left:1px solid #c6c6c6;
2136 2144 border-right:1px solid #DDD;
2137 2145 border-bottom:1px solid #c6c6c6;
2138 2146 color:#515151;
2139 2147 outline:none;
2140 2148 margin:0;
2141 2149 padding:6px 12px;
2142 2150 }
2143 2151
2144 2152 div.form div.fields div.field div.button .ui-state-hover,#content div.box div.form div.fields div.buttons input.ui-state-hover {
2145 2153 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2146 2154 border-top:1px solid #ccc;
2147 2155 border-left:1px solid #bebebe;
2148 2156 border-right:1px solid #b1b1b1;
2149 2157 border-bottom:1px solid #afafaf;
2150 2158 color:#515151;
2151 2159 outline:none;
2152 2160 margin:0;
2153 2161 padding:6px 12px;
2154 2162 }
2155 2163
2156 2164 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight {
2157 2165 display:inline;
2158 2166 }
2159 2167
2160 2168 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons {
2161 2169 margin:10px 0 0 200px;
2162 2170 padding:0;
2163 2171 }
2164 2172
2165 2173 #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 {
2166 2174 margin:10px 0 0;
2167 2175 }
2168 2176
2169 2177 #content div.box table td.user,#content div.box table td.address {
2170 2178 width:10%;
2171 2179 text-align:center;
2172 2180 }
2173 2181
2174 2182 #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 {
2175 2183 text-align:right;
2176 2184 margin:6px 0 0;
2177 2185 padding:0;
2178 2186 }
2179 2187
2180 2188 #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 {
2181 2189 background:#e5e3e3 url("../images/button.png") repeat-x;
2182 2190 border-top:1px solid #DDD;
2183 2191 border-left:1px solid #c6c6c6;
2184 2192 border-right:1px solid #DDD;
2185 2193 border-bottom:1px solid #c6c6c6;
2186 2194 color:#515151;
2187 2195 margin:0;
2188 2196 padding:6px 12px;
2189 2197 }
2190 2198
2191 2199 #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 {
2192 2200 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2193 2201 border-top:1px solid #ccc;
2194 2202 border-left:1px solid #bebebe;
2195 2203 border-right:1px solid #b1b1b1;
2196 2204 border-bottom:1px solid #afafaf;
2197 2205 color:#515151;
2198 2206 margin:0;
2199 2207 padding:6px 12px;
2200 2208 }
2201 2209
2202 2210 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results {
2203 2211 text-align:left;
2204 2212 float:left;
2205 2213 margin:0;
2206 2214 padding:0;
2207 2215 }
2208 2216
2209 2217 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span {
2210 2218 height:1%;
2211 2219 display:block;
2212 2220 float:left;
2213 2221 background:#ebebeb url("../images/pager.png") repeat-x;
2214 2222 border-top:1px solid #dedede;
2215 2223 border-left:1px solid #cfcfcf;
2216 2224 border-right:1px solid #c4c4c4;
2217 2225 border-bottom:1px solid #c4c4c4;
2218 2226 color:#4A4A4A;
2219 2227 font-weight:700;
2220 2228 margin:0;
2221 2229 padding:6px 8px;
2222 2230 }
2223 2231
2224 2232 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled {
2225 2233 color:#B4B4B4;
2226 2234 padding:6px;
2227 2235 }
2228 2236
2229 2237 #login,#register {
2230 2238 width:420px;
2231 2239 margin:10% auto 0;
2232 2240 padding:0;
2233 2241 }
2234 2242
2235 2243 #login div.color,#register div.color {
2236 2244 clear:both;
2237 2245 overflow:hidden;
2238 2246 background:#FFF;
2239 2247 margin:10px auto 0;
2240 2248 padding:3px 3px 3px 0;
2241 2249 }
2242 2250
2243 2251 #login div.color a,#register div.color a {
2244 2252 width:20px;
2245 2253 height:20px;
2246 2254 display:block;
2247 2255 float:left;
2248 2256 margin:0 0 0 3px;
2249 2257 padding:0;
2250 2258 }
2251 2259
2252 2260 #login div.title h5,#register div.title h5 {
2253 2261 color:#fff;
2254 2262 margin:10px;
2255 2263 padding:0;
2256 2264 }
2257 2265
2258 2266 #login div.form div.fields div.field,#register div.form div.fields div.field {
2259 2267 clear:both;
2260 2268 overflow:hidden;
2261 2269 margin:0;
2262 2270 padding:0 0 10px;
2263 2271 }
2264 2272
2265 2273 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message {
2266 2274 height:1%;
2267 2275 display:block;
2268 2276 color:red;
2269 2277 margin:8px 0 0;
2270 2278 padding:0;
2271 2279 }
2272 2280
2273 2281 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label {
2274 2282 color:#000;
2275 2283 font-weight:700;
2276 2284 }
2277 2285
2278 2286 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input {
2279 2287 float:left;
2280 2288 margin:0;
2281 2289 padding:0;
2282 2290 }
2283 2291
2284 2292 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox {
2285 2293 margin:0 0 0 184px;
2286 2294 padding:0;
2287 2295 }
2288 2296
2289 2297 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label {
2290 2298 color:#565656;
2291 2299 font-weight:700;
2292 2300 }
2293 2301
2294 2302 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input {
2295 2303 color:#000;
2296 2304 font-size:1em;
2297 2305 font-weight:700;
2298 2306 font-family:Verdana, Helvetica, Sans-Serif;
2299 2307 margin:0;
2300 2308 }
2301 2309
2302 2310 #changeset_content .container .wrapper,#graph_content .container .wrapper {
2303 2311 width:600px;
2304 2312 }
2305 2313
2306 2314 #changeset_content .container .left,#graph_content .container .left {
2307 2315 float:left;
2308 2316 width:70%;
2309 2317 padding-left:5px;
2310 2318 }
2311 2319
2312 2320 #changeset_content .container .left .date,.ac .match {
2313 2321 font-weight:700;
2314 2322 padding-top: 5px;
2315 2323 padding-bottom:5px;
2316 2324 }
2317 2325
2318 2326 div#legend_container table td,div#legend_choices table td {
2319 2327 border:none !important;
2320 2328 height:20px !important;
2321 2329 padding:0 !important;
2322 2330 }
2323 2331
2324 2332 #q_filter{
2325 2333 border:0 none;
2326 2334 color:#AAAAAA;
2327 2335 margin-bottom:-4px;
2328 2336 margin-top:-4px;
2329 2337 padding-left:3px;
2330 2338 }
2331 2339
@@ -1,125 +1,125 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.html"/>
3 3
4 4 <%def name="title()">
5 5 ${_('Permissions administration')} - ${c.rhodecode_name}
6 6 </%def>
7 7
8 8 <%def name="breadcrumbs_links()">
9 9 ${h.link_to(_('Admin'),h.url('admin_home'))}
10 10 &raquo;
11 11 ${_('Permissions')}
12 12 </%def>
13 13
14 14 <%def name="page_nav()">
15 15 ${self.menu('admin')}
16 16 </%def>
17 17
18 18 <%def name="main()">
19 19 <div class="box">
20 20 <!-- box / title -->
21 21 <div class="title">
22 22 ${self.breadcrumbs()}
23 23 </div>
24 24 <h3>${_('Default permissions')}</h3>
25 25 ${h.form(url('permission', id='default'),method='put')}
26 26 <div class="form">
27 27 <!-- fields -->
28 28 <div class="fields">
29 29 <div class="field">
30 30 <div class="label label-checkbox">
31 31 <label for="anonymous">${_('Anonymous access')}:</label>
32 32 </div>
33 33 <div class="checkboxes">
34 34 <div class="checkbox">
35 35 ${h.checkbox('anonymous',True)}
36 36 </div>
37 37 </div>
38 38 </div>
39 39 <div class="field">
40 40 <div class="label label-select">
41 41 <label for="default_perm">${_('Repository permission')}:</label>
42 42 </div>
43 43 <div class="select">
44 44 ${h.select('default_perm','',c.perms_choices)}
45 45
46 46 ${h.checkbox('overwrite_default','true')}
47 47 <label for="overwrite_default">
48 48 <span class="tooltip"
49 49 tooltip_title="${h.tooltip(_('All default permissions on each repository will be reset to choosen permission, note that all custom default permission on repositories will be lost'))}">
50 50 ${_('overwrite existing settings')}</span> </label>
51 51 </div>
52 52 </div>
53 53 <div class="field">
54 54 <div class="label">
55 55 <label for="default_register">${_('Registration')}:</label>
56 56 </div>
57 57 <div class="select">
58 58 ${h.select('default_register','',c.register_choices)}
59 59 </div>
60 60 </div>
61 61 <div class="field">
62 62 <div class="label">
63 63 <label for="default_create">${_('Repository creation')}:</label>
64 64 </div>
65 65 <div class="select">
66 66 ${h.select('default_create','',c.create_choices)}
67 67 </div>
68 68 </div>
69 69
70 70 <div class="buttons">
71 71 ${h.submit('set','set',class_="ui-button ui-widget ui-state-default ui-corner-all")}
72 72 </div>
73 73 </div>
74 74 </div>
75 75 ${h.end_form()}
76 76 ##LDAP
77 77 <h3>${_('LDAP settings')}</h3>
78 78 ${h.form(url('permissions_ldap',id_iser='default'),method='put')}
79 79 <div class="form">
80 80 <div class="fields">
81 81
82 82 <div class="field">
83 83 <div class="label label-checkbox"><label for="ldap_active">${_('Enable ldap')}</label></div>
84 84 <div class="checkboxes"><div class="checkbox">${h.checkbox('ldap_active',True,class_='small')}</div></div>
85 85 </div>
86 86 <div class="field">
87 87 <div class="label"><label for="ldap_host">${_('Host')}</label></div>
88 88 <div class="input">${h.text('ldap_host',class_='small')}</div>
89 89 </div>
90 90 <div class="field">
91 91 <div class="label"><label for="ldap_port">${_('Port')}</label></div>
92 92 <div class="input">${h.text('ldap_port',class_='small')}</div>
93 93 </div>
94 94 <div class="field">
95 <div class="label label-checkbox"><label for="ldap_ldaps">${_('LDAPS')}</label></div>
95 <div class="label label-checkbox"><label for="ldap_ldaps">${_('Enable LDAPS')}</label></div>
96 96 <div class="checkboxes"><div class="checkbox">${h.checkbox('ldap_ldaps',True,class_='small')}</div></div>
97 97 </div>
98 98 <div class="field">
99 99 <div class="label"><label for="ldap_dn_user">${_('Account')}</label></div>
100 100 <div class="input">${h.text('ldap_dn_user',class_='small')}</div>
101 101 </div>
102 102 <div class="field">
103 103 <div class="label"><label for="ldap_dn_pass">${_('Password')}</label></div>
104 104 <div class="input">${h.password('ldap_dn_pass',class_='small')}</div>
105 105 </div>
106 106 <div class="field">
107 107 <div class="label"><label for="ldap_base_dn">${_('Base DN')}</label></div>
108 108 <div class="input">${h.text('ldap_base_dn',class_='small')}</div>
109 109 </div>
110 110
111 111 <div class="buttons">
112 112 ${h.submit('save','Save',class_="ui-button ui-widget ui-state-default ui-corner-all")}
113 113 </div>
114 114 </div>
115 115 </div>
116 116 ${h.end_form()}
117 117 </div>
118 118 </%def>
119 119
120 120
121 121
122 122
123 123
124 124
125 125
@@ -1,302 +1,329 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.html"/>
3 3
4 4 <%def name="title()">
5 5 ${_('Edit repository')} ${c.repo_info.repo_name} - ${c.rhodecode_name}
6 6 </%def>
7 7
8 8 <%def name="breadcrumbs_links()">
9 9 ${h.link_to(_('Admin'),h.url('admin_home'))}
10 10 &raquo;
11 11 ${h.link_to(_('Repositories'),h.url('repos'))}
12 12 &raquo;
13 13 ${_('edit')} "${c.repo_name}"
14 14 </%def>
15 15
16 16 <%def name="page_nav()">
17 17 ${self.menu('admin')}
18 18 </%def>
19 19
20 20 <%def name="main()">
21 21 <div class="box box-left">
22 22 <!-- box / title -->
23 23 <div class="title">
24 24 ${self.breadcrumbs()}
25 25 </div>
26 26 ${h.form(url('repo', repo_name=c.repo_info.repo_name),method='put')}
27 27 <div class="form">
28 28 <!-- fields -->
29 29 <div class="fields">
30 30 <div class="field">
31 31 <div class="label">
32 32 <label for="repo_name">${_('Name')}:</label>
33 33 </div>
34 34 <div class="input">
35 35 ${h.text('repo_name',class_="medium")}
36 36 </div>
37 37 </div>
38 38 <div class="field">
39 39 <div class="label">
40 40 <label for="repo_type">${_('Type')}:</label>
41 41 </div>
42 42 <div class="input">
43 43 ${h.select('repo_type','hg',c.backends,class_="medium")}
44 44 </div>
45 45 </div>
46 46 <div class="field">
47 47 <div class="label label-textarea">
48 48 <label for="description">${_('Description')}:</label>
49 49 </div>
50 50 <div class="textarea text-area editor">
51 51 ${h.textarea('description',cols=23,rows=5)}
52 52 </div>
53 53 </div>
54 54
55 55 <div class="field">
56 56 <div class="label label-checkbox">
57 57 <label for="private">${_('Private')}:</label>
58 58 </div>
59 59 <div class="checkboxes">
60 60 ${h.checkbox('private',value="True")}
61 61 </div>
62 62 </div>
63 63
64 64 <div class="field">
65 65 <div class="label">
66 66 <label for="user">${_('Owner')}:</label>
67 67 </div>
68 68 <div class="input input-small ac">
69 69 <div class="perm_ac">
70 70 ${h.text('user',class_='yui-ac-input')}
71 71 <div id="owner_container"></div>
72 72 </div>
73 73 </div>
74 74 </div>
75 75
76 76 <div class="field">
77 77 <div class="label">
78 78 <label for="input">${_('Permissions')}:</label>
79 79 </div>
80 80 <div class="input">
81 81 <table id="permissions_manage">
82 82 <tr>
83 83 <td>${_('none')}</td>
84 84 <td>${_('read')}</td>
85 85 <td>${_('write')}</td>
86 86 <td>${_('admin')}</td>
87 87 <td>${_('user')}</td>
88 88 <td></td>
89 89 </tr>
90 90
91 91 %for r2p in c.repo_info.repo_to_perm:
92 92 %if r2p.user.username =='default' and c.repo_info.private:
93 93 <tr>
94 94 <td colspan="4">
95 95 <span class="private_repo_msg">
96 96 ${_('private repository')}
97 97 </span>
98 98 </td>
99 99 <td class="private_repo_msg">${r2p.user.username}</td>
100 100 </tr>
101 101 %else:
102 102 <tr id="id${id(r2p.user.username)}">
103 103 <td>${h.radio('perm_%s' % r2p.user.username,'repository.none')}</td>
104 104 <td>${h.radio('perm_%s' % r2p.user.username,'repository.read')}</td>
105 105 <td>${h.radio('perm_%s' % r2p.user.username,'repository.write')}</td>
106 106 <td>${h.radio('perm_%s' % r2p.user.username,'repository.admin')}</td>
107 107 <td>${r2p.user.username}</td>
108 108 <td>
109 109 %if r2p.user.username !='default':
110 110 <span class="delete_icon action_button" onclick="ajaxAction(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
111 111 <script type="text/javascript">
112 112 function ajaxAction(user_id,field_id){
113 113 var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
114 114 var callback = { success:function(o){
115 115 var tr = YAHOO.util.Dom.get(String(field_id));
116 116 tr.parentNode.removeChild(tr);},failure:function(o){
117 117 alert("${_('Failed to remove user')}");},};
118 118 var postData = '_method=delete&user_id='+user_id;
119 119 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);};
120 120 </script>
121 121 </span>
122 122 %endif
123 123 </td>
124 124 </tr>
125 125 %endif
126 126 %endfor
127 127
128 128 <tr id="add_perm_input">
129 129 <td>${h.radio('perm_new_user','repository.none')}</td>
130 130 <td>${h.radio('perm_new_user','repository.read')}</td>
131 131 <td>${h.radio('perm_new_user','repository.write')}</td>
132 132 <td>${h.radio('perm_new_user','repository.admin')}</td>
133 133 <td class='ac'>
134 134 <div class="perm_ac" id="perm_ac">
135 135 ${h.text('perm_new_user_name',class_='yui-ac-input')}
136 136 <div id="perm_container"></div>
137 137 </div>
138 138 </td>
139 139 <td></td>
140 140 </tr>
141 141 <tr>
142 142 <td colspan="6">
143 143 <span id="add_perm" class="add_icon" style="cursor: pointer;">
144 144 ${_('Add another user')}
145 145 </span>
146 146 </td>
147 147 </tr>
148 148 </table>
149 149 </div>
150 150
151 151 <div class="buttons">
152 152 ${h.submit('save','Save',class_="ui-button ui-widget ui-state-default ui-corner-all")}
153 153 ${h.reset('reset','Reset',class_="ui-button ui-widget ui-state-default ui-corner-all")}
154 154 </div>
155 155 </div>
156 156 </div>
157 157 </div>
158 158 ${h.end_form()}
159 159 <script type="text/javascript">
160 160 YAHOO.util.Event.onDOMReady(function(){
161 161 var D = YAHOO.util.Dom;
162 162 if(!D.hasClass('perm_new_user_name','error')){
163 163 D.setStyle('add_perm_input','display','none');
164 164 }
165 165 YAHOO.util.Event.addListener('add_perm','click',function(){
166 166 D.setStyle('add_perm_input','display','');
167 167 D.setStyle('add_perm','opacity','0.6');
168 168 D.setStyle('add_perm','cursor','default');
169 169 });
170 170 });
171 171 </script>
172 172 <script type="text/javascript">
173 173 YAHOO.example.FnMultipleFields = function(){
174 174 var myContacts = ${c.users_array|n}
175 175
176 176 // Define a custom search function for the DataSource
177 177 var matchNames = function(sQuery) {
178 178 // Case insensitive matching
179 179 var query = sQuery.toLowerCase(),
180 180 contact,
181 181 i=0,
182 182 l=myContacts.length,
183 183 matches = [];
184 184
185 185 // Match against each name of each contact
186 186 for(; i<l; i++) {
187 187 contact = myContacts[i];
188 188 if((contact.fname.toLowerCase().indexOf(query) > -1) ||
189 189 (contact.lname.toLowerCase().indexOf(query) > -1) ||
190 190 (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
191 191 matches[matches.length] = contact;
192 192 }
193 193 }
194 194
195 195 return matches;
196 196 };
197 197
198 198 // Use a FunctionDataSource
199 199 var oDS = new YAHOO.util.FunctionDataSource(matchNames);
200 200 oDS.responseSchema = {
201 201 fields: ["id", "fname", "lname", "nname"]
202 202 }
203 203
204 204 // Instantiate AutoComplete for perms
205 205 var oAC_perms = new YAHOO.widget.AutoComplete("perm_new_user_name", "perm_container", oDS);
206 206 oAC_perms.useShadow = false;
207 207 oAC_perms.resultTypeList = false;
208 208
209 209 // Instantiate AutoComplete for owner
210 210 var oAC_owner = new YAHOO.widget.AutoComplete("user", "owner_container", oDS);
211 211 oAC_owner.useShadow = false;
212 212 oAC_owner.resultTypeList = false;
213 213
214 214
215 215 // Custom formatter to highlight the matching letters
216 216 var custom_formatter = function(oResultData, sQuery, sResultMatch) {
217 217 var query = sQuery.toLowerCase(),
218 218 fname = oResultData.fname,
219 219 lname = oResultData.lname,
220 220 nname = oResultData.nname || "", // Guard against null value
221 221 query = sQuery.toLowerCase(),
222 222 fnameMatchIndex = fname.toLowerCase().indexOf(query),
223 223 lnameMatchIndex = lname.toLowerCase().indexOf(query),
224 224 nnameMatchIndex = nname.toLowerCase().indexOf(query),
225 225 displayfname, displaylname, displaynname;
226 226
227 227 if(fnameMatchIndex > -1) {
228 228 displayfname = highlightMatch(fname, query, fnameMatchIndex);
229 229 }
230 230 else {
231 231 displayfname = fname;
232 232 }
233 233
234 234 if(lnameMatchIndex > -1) {
235 235 displaylname = highlightMatch(lname, query, lnameMatchIndex);
236 236 }
237 237 else {
238 238 displaylname = lname;
239 239 }
240 240
241 241 if(nnameMatchIndex > -1) {
242 242 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
243 243 }
244 244 else {
245 245 displaynname = nname ? "(" + nname + ")" : "";
246 246 }
247 247
248 248 return displayfname + " " + displaylname + " " + displaynname;
249 249
250 250 };
251 251 oAC_perms.formatResult = custom_formatter;
252 252 oAC_owner.formatResult = custom_formatter;
253 253
254 254 // Helper function for the formatter
255 255 var highlightMatch = function(full, snippet, matchindex) {
256 256 return full.substring(0, matchindex) +
257 257 "<span class='match'>" +
258 258 full.substr(matchindex, snippet.length) +
259 259 "</span>" +
260 260 full.substring(matchindex + snippet.length);
261 261 };
262 262
263 263 var myHandler = function(sType, aArgs) {
264 264 var myAC = aArgs[0]; // reference back to the AC instance
265 265 var elLI = aArgs[1]; // reference to the selected LI element
266 266 var oData = aArgs[2]; // object literal of selected item's result data
267 267 myAC.getInputEl().value = oData.nname;
268 268 };
269 269
270 270 oAC_perms.itemSelectEvent.subscribe(myHandler);
271 271 oAC_owner.itemSelectEvent.subscribe(myHandler);
272 272
273 273 return {
274 274 oDS: oDS,
275 275 oAC_perms: oAC_perms,
276 276 oAC_owner: oAC_owner,
277 277 };
278 278 }();
279 279
280 280 </script>
281 281
282 282 </div>
283 283
284 284 <div class="box box-right">
285 285 <div class="title">
286 286 <h5>${_('Administration')}</h5>
287 287 </div>
288 288
289 <div class="form">
290
291 <h3>${_('Reset statistics')}</h3>
292 <h3>${_('Reset cache')}</h3>
293 <h3>${_('Delete')}</h3>
289 <h3>${_('Statistics')}</h3>
290
291 ${h.form(url('repo_stats', repo_name=c.repo_info.repo_name),method='delete')}
292 <div class="form">
293 <div class="fields">
294 ${h.submit('reset_stats_%s' % c.repo_info.repo_name,_('Reset current statistics'),class_="refresh_icon action_button",onclick="return confirm('Confirm to remove current statistics');")}
295
296 <div class="field">
297 <ul>
298 <li>${_('Fetched to rev')}: ${c.stats_revision}/${c.repo_last_rev}</li>
299 <li>${_('Percentage of stats gathered')}: ${c.stats_percentage} %</li>
300 </ul>
301 </div>
302
303 </div>
304 </div>
305 ${h.end_form()}
306
307 <h3>${_('Cache')}</h3>
308 ${h.form(url('repo_cache', repo_name=c.repo_info.repo_name),method='delete')}
309 <div class="form">
310 <div class="fields">
311 ${h.submit('reset_cache_%s' % c.repo_info.repo_name,_('Invalidate repository cache'),class_="refresh_icon action_button",onclick="return confirm('Confirm to invalidate repository cache');")}
312 </div>
313 </div>
314 ${h.end_form()}
294 315
295 316
296
297 </div>
317 <h3>${_('Delete')}</h3>
318 ${h.form(url('repo', repo_name=c.repo_info.repo_name),method='delete')}
319 <div class="form">
320 <div class="fields">
321 ${h.submit('remove_%s' % c.repo_info.repo_name,_('Remove this repository'),class_="delete_icon action_button",onclick="return confirm('Confirm to delete this repository');")}
322 </div>
323 </div>
324 ${h.end_form()}
298 325
299 326 </div>
300 327
301 328
302 329 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now