changeset 1955:d02997291f23 beta

merge upstream
author Aras Pranckevicius <aras@unity3d.com>
date Fri, 27 Jan 2012 08:02:34 +0200
parents 455444503e83 (current diff) 4a7de41dc22a (diff)
children fe64fecda0fd
files rhodecode/public/css/style.css rhodecode/templates/changeset/changeset.html
diffstat 14 files changed, 238 insertions(+), 163 deletions(-) [+]
line wrap: on
line diff
--- a/docs/api/api.rst	Fri Jan 27 08:01:57 2012 +0200
+++ b/docs/api/api.rst	Fri Jan 27 08:02:34 2012 +0200
@@ -158,9 +158,9 @@
     args :    {
                 "username" :  "<username>",
                 "password" :  "<password>",
-                "firstname" : "<firstname>",
-                "lastname" :  "<lastname>",
-                "email" :     "<useremail>"
+                "email" :     "<useremail>",
+                "firstname" : "<firstname> = None",
+                "lastname" :  "<lastname> = None",
                 "active" :    "<bool> = True",
                 "admin" :     "<bool> = False",
                 "ldap_dn" :   "<ldap_dn> = None"
--- a/docs/changelog.rst	Fri Jan 27 08:01:57 2012 +0200
+++ b/docs/changelog.rst	Fri Jan 27 08:02:34 2012 +0200
@@ -35,6 +35,7 @@
   based on user defined regular expression
 - added linking of changesets in commit messages  
 - new compact changelog with expandable commit messages
+- firstname and lastname are optional in user creation
     
 fixes
 -----
--- a/rhodecode/controllers/admin/users_groups.py	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/controllers/admin/users_groups.py	Fri Jan 27 08:02:34 2012 +0200
@@ -108,8 +108,9 @@
         # url('users_group', id=ID)
 
         c.users_group = UsersGroup.get(id)
-        c.group_members = [(x.user_id, x.user.username) for x in
-                           c.users_group.members]
+        c.group_members_obj = [x.user for x in c.users_group.members]
+        c.group_members = [(x.user_id, x.username) for x in
+                           c.group_members_obj]
 
         c.available_members = [(x.user_id, x.username) for x in
                                self.sa.query(User).all()]
@@ -181,8 +182,9 @@
             return redirect(url('users_groups'))
 
         c.users_group.permissions = {}
-        c.group_members = [(x.user_id, x.user.username) for x in
-                           c.users_group.members]
+        c.group_members_obj = [x.user for x in c.users_group.members]
+        c.group_members = [(x.user_id, x.username) for x in
+                           c.group_members_obj]
         c.available_members = [(x.user_id, x.username) for x in
                                self.sa.query(User).all()]
         defaults = c.users_group.get_dict()
--- a/rhodecode/controllers/api/api.py	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/controllers/api/api.py	Fri Jan 27 08:02:34 2012 +0200
@@ -131,17 +131,17 @@
         return result
 
     @HasPermissionAllDecorator('hg.admin')
-    def create_user(self, apiuser, username, password, firstname,
-                    lastname, email, active=True, admin=False, ldap_dn=None):
+    def create_user(self, apiuser, username, password, email, firstname=None,
+                    lastname=None, active=True, admin=False, ldap_dn=None):
         """
         Create new user or updates current one
 
         :param apiuser:
         :param username:
         :param password:
+        :param email:
         :param name:
         :param lastname:
-        :param email:
         :param active:
         :param admin:
         :param ldap_dn:
--- a/rhodecode/lib/auth.py	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/lib/auth.py	Fri Jan 27 08:02:34 2012 +0200
@@ -129,6 +129,7 @@
 def check_password(password, hashed):
     return RhodeCodeCrypto.hash_check(password, hashed)
 
+
 def generate_api_key(str_, salt=None):
     """
     Generates API KEY from given string
@@ -237,6 +238,7 @@
                 pass
     return False
 
+
 def login_container_auth(username):
     user = User.get_by_username(username)
     if user is None:
@@ -260,6 +262,7 @@
               user.username)
     return user
 
+
 def get_container_username(environ, config):
     username = None
 
@@ -278,6 +281,7 @@
 
     return username
 
+
 class  AuthUser(object):
     """
     A simple object that handles all attributes of user in RhodeCode
@@ -302,6 +306,7 @@
         self.permissions = {}
         self._api_key = api_key
         self.propagate_data()
+        self._instance = None
 
     def propagate_data(self):
         user_model = UserModel()
@@ -350,10 +355,6 @@
     def is_admin(self):
         return self.admin
 
-    @property
-    def full_contact(self):
-        return '%s %s <%s>' % (self.name, self.lastname, self.email)
-
     def __repr__(self):
         return "<AuthUser('id:%s:%s|%s')>" % (self.user_id, self.username,
                                               self.is_authenticated)
@@ -363,9 +364,9 @@
             self.is_authenticated = authenticated
 
     def get_cookie_store(self):
-        return {'username':self.username,
+        return {'username': self.username,
                 'user_id': self.user_id,
-                'is_authenticated':self.is_authenticated}
+                'is_authenticated': self.is_authenticated}
 
     @classmethod
     def from_cookie_store(cls, cookie_store):
@@ -374,6 +375,7 @@
         api_key = cookie_store.get('api_key')
         return AuthUser(user_id, api_key, username)
 
+
 def set_available_permissions(config):
     """
     This function will propagate pylons globals with all available defined
@@ -388,7 +390,7 @@
     try:
         sa = meta.Session
         all_perms = sa.query(Permission).all()
-    except:
+    except Exception:
         pass
     finally:
         meta.Session.remove()
--- a/rhodecode/model/db.py	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/model/db.py	Fri Jan 27 08:02:34 2012 +0200
@@ -299,6 +299,11 @@
         return '%s %s' % (self.name, self.lastname)
 
     @property
+    def full_name_or_username(self):
+        return ('%s %s' % (self.name, self.lastname)
+                if (self.name and self.lastname) else self.username)
+
+    @property
     def full_contact(self):
         return '%s %s <%s>' % (self.name, self.lastname, self.email)
 
@@ -354,8 +359,13 @@
         log.debug('updated user %s lastlogin', self.username)
 
     def __json__(self):
-        return dict(email=self.email,
-                    full_name=self.full_name)
+        return dict(
+            email=self.email,
+            full_name=self.full_name,
+            full_name_or_username=self.full_name_or_username,
+            short_contact=self.short_contact,
+            full_contact=self.full_contact
+        )
 
 
 class UserLog(Base, BaseModel):
--- a/rhodecode/model/forms.py	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/model/forms.py	Fri Jan 27 08:02:34 2012 +0200
@@ -51,13 +51,17 @@
 # VALIDATORS
 #==============================================================================
 class ValidAuthToken(formencode.validators.FancyValidator):
-    messages = {'invalid_token':_('Token mismatch')}
+    messages = {'invalid_token': _('Token mismatch')}
 
     def validate_python(self, value, state):
 
         if value != authentication_token():
-            raise formencode.Invalid(self.message('invalid_token', state,
-                                            search_number=value), value, state)
+            raise formencode.Invalid(
+                self.message('invalid_token',
+                             state, search_number=value),
+                value,
+                state
+            )
 
 
 def ValidUsername(edit, old_data):
@@ -77,11 +81,13 @@
                                                'exists') , value, state)
 
             if re.match(r'^[a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+$', value) is None:
-                raise formencode.Invalid(_('Username may only contain '
-                                           'alphanumeric characters '
-                                           'underscores, periods or dashes '
-                                           'and must begin with alphanumeric '
-                                           'character'), value, state)
+                raise formencode.Invalid(
+                    _('Username may only contain alphanumeric characters '
+                      'underscores, periods or dashes and must begin with '
+                      'alphanumeric character'), 
+                    value, 
+                    state
+                )
 
     return _ValidUsername
 
@@ -103,15 +109,17 @@
                 if UsersGroup.get_by_group_name(value, cache=False,
                                                case_insensitive=True):
                     raise formencode.Invalid(_('This users group '
-                                               'already exists') , value,
+                                               'already exists'), value,
                                              state)
 
             if re.match(r'^[a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+$', value) is None:
-                raise formencode.Invalid(_('RepoGroup name may only contain '
-                                           'alphanumeric characters '
-                                           'underscores, periods or dashes '
-                                           'and must begin with alphanumeric '
-                                           'character'), value, state)
+                raise formencode.Invalid(
+                    _('RepoGroup name may only contain  alphanumeric characters '
+                      'underscores, periods or dashes and must begin with '
+                      'alphanumeric character'), 
+                    value, 
+                    state
+                )
 
     return _ValidUsersGroup
 
@@ -177,32 +185,35 @@
 
     def to_python(self, value, state):
 
-        if value:
+        if not value:
+            return
 
-            if value.get('password'):
-                try:
-                    value['password'] = get_crypt_password(value['password'])
-                except UnicodeEncodeError:
-                    e_dict = {'password':_('Invalid characters in password')}
-                    raise formencode.Invalid('', value, state, error_dict=e_dict)
+        if value.get('password'):
+            try:
+                value['password'] = get_crypt_password(value['password'])
+            except UnicodeEncodeError:
+                e_dict = {'password': _('Invalid characters in password')}
+                raise formencode.Invalid('', value, state, error_dict=e_dict)
 
-            if value.get('password_confirmation'):
-                try:
-                    value['password_confirmation'] = \
-                        get_crypt_password(value['password_confirmation'])
-                except UnicodeEncodeError:
-                    e_dict = {'password_confirmation':_('Invalid characters in password')}
-                    raise formencode.Invalid('', value, state, error_dict=e_dict)
+        if value.get('password_confirmation'):
+            try:
+                value['password_confirmation'] = \
+                    get_crypt_password(value['password_confirmation'])
+            except UnicodeEncodeError:
+                e_dict = {
+                    'password_confirmation': _('Invalid characters in password')
+                }
+                raise formencode.Invalid('', value, state, error_dict=e_dict)
 
-            if value.get('new_password'):
-                try:
-                    value['new_password'] = \
-                        get_crypt_password(value['new_password'])
-                except UnicodeEncodeError:
-                    e_dict = {'new_password':_('Invalid characters in password')}
-                    raise formencode.Invalid('', value, state, error_dict=e_dict)
+        if value.get('new_password'):
+            try:
+                value['new_password'] = \
+                    get_crypt_password(value['new_password'])
+            except UnicodeEncodeError:
+                e_dict = {'new_password': _('Invalid characters in password')}
+                raise formencode.Invalid('', value, state, error_dict=e_dict)
 
-            return value
+        return value
 
 
 class ValidPasswordsMatch(formencode.validators.FancyValidator):
@@ -224,9 +235,9 @@
     }
 
     # error mapping
-    e_dict = {'username':messages['invalid_login'],
-              'password':messages['invalid_password']}
-    e_dict_disable = {'username':messages['disabled_account']}
+    e_dict = {'username': messages['invalid_login'],
+              'password': messages['invalid_password']}
+    e_dict_disable = {'username': messages['disabled_account']}
 
     def validate_python(self, value, state):
         password = value['password']
@@ -238,15 +249,19 @@
         else:
             if user and user.active is False:
                 log.warning('user %s is disabled', username)
-                raise formencode.Invalid(self.message('disabled_account',
-                                         state=State_obj),
-                                         value, state,
-                                         error_dict=self.e_dict_disable)
+                raise formencode.Invalid(
+                    self.message('disabled_account',
+                    state=State_obj),
+                    value, state,
+                    error_dict=self.e_dict_disable
+                )
             else:
                 log.warning('user %s not authenticated', username)
-                raise formencode.Invalid(self.message('invalid_password',
-                                         state=State_obj), value, state,
-                                         error_dict=self.e_dict)
+                raise formencode.Invalid(
+                    self.message('invalid_password',
+                    state=State_obj), value, state,
+                    error_dict=self.e_dict
+                )
 
 
 class ValidRepoUser(formencode.validators.FancyValidator):
@@ -272,7 +287,6 @@
                 e_dict = {'repo_name': _('This repository name is disallowed')}
                 raise formencode.Invalid('', value, state, error_dict=e_dict)
 
-
             if value.get('repo_group'):
                 gr = RepoGroup.get(value.get('repo_group'))
                 group_path = gr.full_path
@@ -285,7 +299,6 @@
                 group_path = ''
                 repo_name_full = repo_name
 
-
             value['repo_name_full'] = repo_name_full
             rename = old_data.get('repo_name') != repo_name_full
             create = not edit
@@ -293,20 +306,22 @@
 
                 if group_path != '':
                     if Repository.get_by_repo_name(repo_name_full):
-                        e_dict = {'repo_name':_('This repository already '
-                                                'exists in a group "%s"') %
-                                  gr.group_name}
+                        e_dict = {
+                            'repo_name': _('This repository already exists in '
+                                           'a group "%s"') % gr.group_name
+                        }
                         raise formencode.Invalid('', value, state,
                                                  error_dict=e_dict)
                 elif RepoGroup.get_by_group_name(repo_name_full):
-                        e_dict = {'repo_name':_('There is a group with this'
-                                                ' name already "%s"') %
-                                  repo_name_full}
+                        e_dict = {
+                            'repo_name': _('There is a group with this name '
+                                           'already "%s"') % repo_name_full
+                        }
                         raise formencode.Invalid('', value, state,
                                                  error_dict=e_dict)
 
                 elif Repository.get_by_repo_name(repo_name_full):
-                        e_dict = {'repo_name':_('This repository '
+                        e_dict = {'repo_name': _('This repository '
                                                 'already exists')}
                         raise formencode.Invalid('', value, state,
                                                  error_dict=e_dict)
@@ -341,14 +356,14 @@
             elif value.startswith('https'):
                 try:
                     httpsrepository(make_ui('db'), value).capabilities
-                except Exception, e:
+                except Exception:
                     log.error(traceback.format_exc())
                     raise formencode.Invalid(_('invalid clone url'), value,
                                              state)
             elif value.startswith('http'):
                 try:
                     httprepository(make_ui('db'), value).capabilities
-                except Exception, e:
+                except Exception:
                     log.error(traceback.format_exc())
                     raise formencode.Invalid(_('invalid clone url'), value,
                                              state)
@@ -374,7 +389,7 @@
 
 
 class ValidPerms(formencode.validators.FancyValidator):
-    messages = {'perm_new_member_name':_('This username or users group name'
+    messages = {'perm_new_member_name': _('This username or users group name'
                                          ' is not valid')}
 
     def to_python(self, value, state):
@@ -393,8 +408,9 @@
                         perms_new.append((new_member, new_perm, new_type))
             elif k.startswith('u_perm_') or k.startswith('g_perm_'):
                 member = k[7:]
-                t = {'u':'user',
-                     'g':'users_group'}[k[0]]
+                t = {'u': 'user',
+                     'g': 'users_group'
+                }[k[0]]
                 if member == 'default':
                     if value['private']:
                         #set none for default when updating to private repo
@@ -419,8 +435,9 @@
             except Exception:
                 msg = self.message('perm_new_member_name',
                                      state=State_obj)
-                raise formencode.Invalid(msg, value, state,
-                                         error_dict={'perm_new_member_name':msg})
+                raise formencode.Invalid(
+                    msg, value, state, error_dict={'perm_new_member_name': msg}
+                )
         return value
 
 
@@ -428,9 +445,8 @@
 
     def to_python(self, value, state):
         # settings  form can't edit user
-        if value.has_key('user'):
+        if 'user' in value:
             del['value']['user']
-
         return value
 
 
@@ -440,7 +456,7 @@
         if not os.path.isdir(value):
             msg = _('This is not a valid path')
             raise formencode.Invalid(msg, value, state,
-                                     error_dict={'paths_root_path':msg})
+                                     error_dict={'paths_root_path': msg})
         return value
 
 
@@ -448,12 +464,12 @@
     class _UniqSystemEmail(formencode.validators.FancyValidator):
         def to_python(self, value, state):
             value = value.lower()
-            if old_data.get('email','').lower() != value:
+            if old_data.get('email', '').lower() != value:
                 user = User.get_by_email(value, case_insensitive=True)
                 if user:
                     raise formencode.Invalid(
-                                    _("This e-mail address is already taken"),
-                                    value, state)
+                        _("This e-mail address is already taken"), value, state
+                    )
             return value
 
     return _UniqSystemEmail
@@ -464,8 +480,9 @@
         value = value.lower()
         user = User.get_by_email(value, case_insensitive=True)
         if  user is None:
-            raise formencode.Invalid(_("This e-mail address doesn't exist.") ,
-                                     value, state)
+            raise formencode.Invalid(
+                _("This e-mail address doesn't exist."), value, state
+            )
 
         return value
 
@@ -486,14 +503,15 @@
     def to_python(self, value, state):
 
         if not value or not isinstance(value, (str, unicode)):
-            raise formencode.Invalid(_("The LDAP Login attribute of the CN "
-                                       "must be specified - this is the name "
-                                       "of the attribute that is equivalent "
-                                       "to 'username'"),
-                                     value, state)
+            raise formencode.Invalid(
+                _("The LDAP Login attribute of the CN must be specified - "
+                  "this is the name of the attribute that is equivalent "
+                  "to 'username'"), value, state
+            )
 
         return value
 
+
 #==============================================================================
 # FORMS
 #==============================================================================
@@ -501,22 +519,22 @@
     allow_extra_fields = True
     filter_extra_fields = True
     username = UnicodeString(
-                             strip=True,
-                             min=1,
-                             not_empty=True,
-                             messages={
-                                'empty':_('Please enter a login'),
-                                'tooShort':_('Enter a value %(min)i characters long or more')}
-                            )
+        strip=True,
+        min=1,
+        not_empty=True,
+        messages={
+           'empty': _('Please enter a login'),
+           'tooShort': _('Enter a value %(min)i characters long or more')}
+    )
 
     password = UnicodeString(
-                            strip=True,
-                            min=3,
-                            not_empty=True,
-                            messages={
-                                'empty':_('Please enter a password'),
-                                'tooShort':_('Enter %(min)i characters or more')}
-                                )
+        strip=True,
+        min=3,
+        not_empty=True,
+        messages={
+            'empty': _('Please enter a password'),
+            'tooShort': _('Enter %(min)i characters or more')}
+    )
 
     remember = StringBoolean(if_missing=False)
 
@@ -531,15 +549,17 @@
                        ValidUsername(edit, old_data))
         if edit:
             new_password = All(UnicodeString(strip=True, min=6, not_empty=False))
-            password_confirmation = All(UnicodeString(strip=True, min=6, not_empty=False))
+            password_confirmation = All(UnicodeString(strip=True, min=6,
+                                                      not_empty=False))
             admin = StringBoolean(if_missing=False)
         else:
             password = All(UnicodeString(strip=True, min=6, not_empty=True))
-            password_confirmation = All(UnicodeString(strip=True, min=6, not_empty=False))
+            password_confirmation = All(UnicodeString(strip=True, min=6,
+                                                      not_empty=False))
 
         active = StringBoolean(if_missing=False)
-        name = UnicodeString(strip=True, min=1, not_empty=True)
-        lastname = UnicodeString(strip=True, min=1, not_empty=True)
+        name = UnicodeString(strip=True, min=1, not_empty=False)
+        lastname = UnicodeString(strip=True, min=1, not_empty=False)
         email = All(Email(not_empty=True), UniqSystemEmail(old_data))
 
         chained_validators = [ValidPasswordsMatch, ValidPassword]
@@ -592,14 +612,15 @@
         password = All(UnicodeString(strip=True, min=6, not_empty=True))
         password_confirmation = All(UnicodeString(strip=True, min=6, not_empty=True))
         active = StringBoolean(if_missing=False)
-        name = UnicodeString(strip=True, min=1, not_empty=True)
-        lastname = UnicodeString(strip=True, min=1, not_empty=True)
+        name = UnicodeString(strip=True, min=1, not_empty=False)
+        lastname = UnicodeString(strip=True, min=1, not_empty=False)
         email = All(Email(not_empty=True), UniqSystemEmail(old_data))
 
         chained_validators = [ValidPasswordsMatch, ValidPassword]
 
     return _RegisterForm
 
+
 def PasswordResetForm():
     class _PasswordResetForm(formencode.Schema):
         allow_extra_fields = True
@@ -607,6 +628,7 @@
         email = All(ValidSystemEmail(), Email(not_empty=True))
     return _PasswordResetForm
 
+
 def RepoForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
              repo_groups=[]):
     class _RepoForm(formencode.Schema):
@@ -630,6 +652,7 @@
         chained_validators = [ValidRepoName(edit, old_data), ValidPerms]
     return _RepoForm
 
+
 def RepoForkForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
                  repo_groups=[]):
     class _RepoForkForm(formencode.Schema):
@@ -648,6 +671,7 @@
 
     return _RepoForkForm
 
+
 def RepoSettingsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
                      repo_groups=[]):
     class _RepoForm(formencode.Schema):
@@ -674,6 +698,7 @@
 
     return _ApplicationSettingsForm
 
+
 def ApplicationUiSettingsForm():
     class _ApplicationUiSettingsForm(formencode.Schema):
         allow_extra_fields = True
@@ -687,6 +712,7 @@
 
     return _ApplicationUiSettingsForm
 
+
 def DefaultPermissionsForm(perms_choices, register_choices, create_choices):
     class _DefaultPermissionsForm(formencode.Schema):
         allow_extra_fields = True
--- a/rhodecode/model/user.py	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/model/user.py	Fri Jan 27 08:02:34 2012 +0200
@@ -92,7 +92,6 @@
             log.error(traceback.format_exc())
             raise
 
-
     def create_or_update(self, username, password, email, name, lastname,
                          active=True, admin=False, ldap_dn=None):
         """
@@ -136,7 +135,6 @@
             log.error(traceback.format_exc())
             raise
 
-
     def create_for_container_auth(self, username, attrs):
         """
         Creates the given user if it's not already in the database
@@ -231,7 +229,7 @@
             body = body % (new_user.username, new_user.full_name,
                            new_user.email)
             edit_url = url('edit_user', id=new_user.user_id, qualified=True)
-            kw = {'registered_user_url':edit_url}
+            kw = {'registered_user_url': edit_url}
             NotificationModel().create(created_by=new_user, subject=subject,
                                        body=body, recipients=None,
                                        type_=Notification.TYPE_REGISTRATION,
@@ -493,7 +491,6 @@
         new.permission = perm
         self.sa.add(new)
 
-
     def revoke_perm(self, user, perm):
         if not isinstance(perm, Permission):
             raise Exception('perm needs to be an instance of Permission class '
--- a/rhodecode/public/css/style.css	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/public/css/style.css	Fri Jan 27 08:02:34 2012 +0200
@@ -3639,6 +3639,16 @@
 	padding-left: 3px;
 }
 
+
+.group_members_wrap{
+	
+}
+
+.group_members .group_member{
+	height: 30px;
+	padding:0px 0px 0px 10px;
+}
+
 /*README STYLE*/
 
 div.readme {
@@ -4132,7 +4142,11 @@
 	padding: 0px 0px 10px 5px !important;
 	margin: 0 !important;
 }
-
+div.diffblock .code-header .hash{
+    float: left;
+    font-family: monospace;
+    padding: 3px 0 0 2px;
+}
 div.diffblock .code-header .date{
     float:left;
     text-transform: uppercase;
--- a/rhodecode/templates/admin/users/user_add.html	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/templates/admin/users/user_add.html	Fri Jan 27 08:02:34 2012 +0200
@@ -86,7 +86,7 @@
                     <label for="active">${_('Active')}:</label>
                 </div>
                 <div class="checkboxes">
-                    ${h.checkbox('active',value=True)}
+                    ${h.checkbox('active',value=True,checked='checked')}
                 </div>
              </div>
 
--- a/rhodecode/templates/admin/users_groups/users_group_add.html	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/templates/admin/users_groups/users_group_add.html	Fri Jan 27 08:02:34 2012 +0200
@@ -41,7 +41,7 @@
                     <label for="users_group_active">${_('Active')}:</label>
                 </div>
                 <div class="checkboxes">
-                    ${h.checkbox('users_group_active',value=True)}
+                    ${h.checkbox('users_group_active',value=True, checked='checked')}
                 </div>
              </div>
 
--- a/rhodecode/templates/admin/users_groups/users_group_edit.html	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/templates/admin/users_groups/users_group_edit.html	Fri Jan 27 08:02:34 2012 +0200
@@ -94,6 +94,51 @@
 ${h.end_form()}
 </div>
 
+<div class="box box-right">
+    <!-- box / title -->
+    <div class="title">
+        <h5>${_('Permissions')}</h5>
+    </div>
+    ${h.form(url('users_group_perm', id=c.users_group.users_group_id), method='put')}
+    <div class="form">
+        <!-- fields -->
+        <div class="fields">
+             <div class="field">
+                <div class="label label-checkbox">
+                    <label for="create_repo_perm">${_('Create repositories')}:</label>
+                </div>
+                <div class="checkboxes">
+                    ${h.checkbox('create_repo_perm',value=True)}
+                </div>
+             </div>
+            <div class="buttons">
+              ${h.submit('save',_('Save'),class_="ui-button")}
+              ${h.reset('reset',_('Reset'),class_="ui-button")}
+            </div>
+        </div>
+    </div>
+    ${h.end_form()}
+</div>
+
+<div class="box box-right">
+    <!-- box / title -->
+    <div class="title">
+        <h5>${_('Group members')}</h5>
+    </div>
+    <div class="group_members_wrap">
+      <ul class="group_members">
+      %for user in c.group_members_obj:
+        <li>
+          <div class="group_member">
+            <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(user.email,24)}"/> </div>
+            <div>${user.username}</div>
+            <div>${user.full_name}</div>
+          </div>
+        </li>
+      %endfor
+      </ul>
+    </div>
+</div>
 <script type="text/javascript">
     YAHOO.util.Event.onDOMReady(function(){
             var D = YAHOO.util.Dom;
@@ -140,16 +185,16 @@
             tmp_cache = new Array();
 
             for(var i = 0;node = av_cache[i];i++){
-            	var add = true;
-	            for(var i2 = 0;node_2 = cache[i2];i2++){
-	                if(node.value == node_2.value){
-	                	add=false;
-	                	break;
-	                }
-	            }
-	            if(add){
-	            	tmp_cache.push(new Option(node.text, node.value, false, false));
-	            }
+                var add = true;
+                for(var i2 = 0;node_2 = cache[i2];i2++){
+                    if(node.value == node_2.value){
+                        add=false;
+                        break;
+                    }
+                }
+                if(add){
+                    tmp_cache.push(new Option(node.text, node.value, false, false));
+                }
             }
 
             for(var i = 0;node = tmp_cache[i];i++){
@@ -173,7 +218,7 @@
                             sel_cache.push(node);
                         }
                         else{
-                        	oth_cache.push(node)
+                            oth_cache.push(node)
                         }
                     }
 
@@ -182,8 +227,8 @@
 
                 //fill the field with given options
                 function fill_with(field,options){
-                	//clear firtst
-                	field.options.length=0;
+                    //clear firtst
+                    field.options.length=0;
                     for(var i = 0;node = options[i];i++){
                             field.options[i]=new Option(node.text, node.value,
                                     false, false);
@@ -242,29 +287,4 @@
             })
         });
 </script>
-<div class="box box-right">
-    <!-- box / title -->
-    <div class="title">
-        <h5>${_('Permissions')}</h5>
-    </div>
-    ${h.form(url('users_group_perm', id=c.users_group.users_group_id), method='put')}
-    <div class="form">
-        <!-- fields -->
-        <div class="fields">
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="create_repo_perm">${_('Create repositories')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('create_repo_perm',value=True)}
-                </div>
-             </div>
-            <div class="buttons">
-              ${h.submit('save',_('Save'),class_="ui-button")}
-              ${h.reset('reset',_('Reset'),class_="ui-button")}
-            </div>
-        </div>
-    </div>
-    ${h.end_form()}
-</div>
 </%def>
--- a/rhodecode/templates/base/base.html	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/templates/base/base.html	Fri Jan 27 08:02:34 2012 +0200
@@ -112,7 +112,7 @@
             ${h.end_form()}
         %else:
             <div class="links_left">
-                <div class="full_name">${c.rhodecode_user.full_name}</div>
+                <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
                 <div class="email">${c.rhodecode_user.email}</div>
                 <div class="big_gravatar"><img alt="gravatar" src="${h.gravatar_url(c.rhodecode_user.email,48)}" /></div>
             </div>
--- a/rhodecode/templates/changeset/changeset.html	Fri Jan 27 08:01:57 2012 +0200
+++ b/rhodecode/templates/changeset/changeset.html	Fri Jan 27 08:02:34 2012 +0200
@@ -27,9 +27,12 @@
     <div class="table">
 		<div class="diffblock">
 			<div class="code-header">
-                <div class="date">
-                  R${c.changeset.revision}:${h.link_to(h.short_id(c.changeset.raw_id),h.url('changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id))}
-                  ${c.changeset.date}</div>
+                <div class="hash">
+                 r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)}
+                </div>
+                <div class="date"> 
+                  ${c.changeset.date}
+                </div>
                 <div class="diff-actions">
                   <a href="${h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='show')}" title="${_('raw diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white.png')}"/></a>
                   <a href="${h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download')}" title="${_('download diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white_get.png')}"/></a>