Added public user index and visibility level to users
Created by: cirosantilli
Note: the pull request changed a lot after the third commit so I decided to change the description. Before the third commit, there was only the public index. After the 3rd commit, users now have visibility levels.
Behaviour changes
Users have visibility levels with semantics completely analogous to that of projects.
If an user is visible to another, it gets listed on the public area, and his profile page (/u/someuser
) can be seen.
Currently, if a user is private only himself can see his profile page. Maybe in the future we can allow private users to let only selected users see their profile.
The default user visibility level is internal so that the current visibility behaviour does not change:
only logged in users can see profile pages of other users.
A configuration option was added to control the default level user visibility level: gitlab:user_default_visibility_level
.
Use cases
Since the feature is completely analogous to "public projects", the use cases are the same:
- find the profile of users which you only know by real name
- open up the next step which will make the feature shine: add user gamification/metrics/analytics like Stackoverflow does, but for real projects. We can start with simple things like stars on owned projects and number of accepted pull request lines, but the sky is the limit.
Screenshots
Here goes screenshots of everything that changed on the UI:
public/users
: new page, analogous to public/projects
but for users. This is the main goal of the PR.
users/sign_in
: says "browse the public area" instead of "public projects"
u/someuser
:
- possible to view public users while not logged in
- a visibility level icon shows besides the name
help
: "Public Access" was moved under "Use Documentation" since it is relevant to any user, not just admins.
help/public_access
: completelly refactored. Also explains user visibility levels.
profile/account
: possible to edit visibility level
admin/users
:
- possible to filter by visibility level
- visibility level icon shows next to the user
- forms on the left edited to look just like those on
admin/projects
for greater UI uniformity
admin/users/someuser
: access field added
admin/users/someuser/edit
: visibility level selection added
Implementaion notes
Since this is the second public object (projects being the first) some refactoring was needed to keep things DRY:
-
visibility level specifics were separated from projects and put under shared directories
-
app/models/ability.rb
was refactored to treat the user not authenticated case on a per object basis and not separately, because we have multiple cases where non authenticated users have some permissions.The existing behaviour should be identical, except for one "obscure" permission case: if the user is not logged in, then if
subject
responded toproject
, project would be used automatically instead independently of thesubject
class.This is not done anymore because it feels confusing, and it seems the case was not used since all tests pass.
-
help defines what is visible (public is visible to anyone, internal to any authorized user) and then talks in terms of visibility.
This way we don't have to say "public or internal and authorized" all the time.
-
Project#visibility_level_field
andProject#visibility_levels
methods were removed since they were simple aliases, and their functionality was moved intoGitlab::VisibilityLevel
where it can be shared between projects and users.
old description before 3rd commit
This is only left if you want to understand initial discussions. It does not reflect anymore the current state of the PR.
The index is analogous to the public project index, except that all users are public.
The public area now has a navigation panel with currently two items: public projects and public groups. The public projects section is identical to the previous public/projects
URL, and the public
URL still goes to public projects as before.
The main use case for now is to find the profile of someone which you only know the name, for example to view his projects. In the future, other things could be added, such as user metrics/analytics.