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