Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Tatuya Kamada
gitlab-ce
Commits
62ed1c53
Commit
62ed1c53
authored
Feb 05, 2015
by
Dmitriy Zaporozhets
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Explicitly define ordering in models using default_scope
parent
dbca8c97
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
67 additions
and
16 deletions
+67
-16
app/controllers/admin/dashboard_controller.rb
app/controllers/admin/dashboard_controller.rb
+3
-3
app/controllers/admin/groups_controller.rb
app/controllers/admin/groups_controller.rb
+1
-1
app/controllers/admin/users_controller.rb
app/controllers/admin/users_controller.rb
+2
-2
app/controllers/profiles/keys_controller.rb
app/controllers/profiles/keys_controller.rb
+1
-1
app/models/broadcast_message.rb
app/models/broadcast_message.rb
+2
-0
app/models/concerns/internal_id.rb
app/models/concerns/internal_id.rb
+1
-0
app/models/concerns/sortable.rb
app/models/concerns/sortable.rb
+32
-0
app/models/email.rb
app/models/email.rb
+2
-0
app/models/event.rb
app/models/event.rb
+1
-0
app/models/hooks/web_hook.rb
app/models/hooks/web_hook.rb
+1
-0
app/models/identity.rb
app/models/identity.rb
+1
-0
app/models/key.rb
app/models/key.rb
+1
-0
app/models/label.rb
app/models/label.rb
+2
-0
app/models/member.rb
app/models/member.rb
+1
-0
app/models/merge_request_diff.rb
app/models/merge_request_diff.rb
+2
-0
app/models/namespace.rb
app/models/namespace.rb
+1
-0
app/models/note.rb
app/models/note.rb
+1
-0
app/models/project.rb
app/models/project.rb
+7
-4
app/models/service.rb
app/models/service.rb
+1
-0
app/models/snippet.rb
app/models/snippet.rb
+1
-0
app/models/user.rb
app/models/user.rb
+3
-3
lib/api/issues.rb
lib/api/issues.rb
+0
-2
No files found.
app/controllers/admin/dashboard_controller.rb
View file @
62ed1c53
class
Admin::DashboardController
<
Admin
::
ApplicationController
class
Admin::DashboardController
<
Admin
::
ApplicationController
def
index
def
index
@projects
=
Project
.
order
(
"created_at DESC"
).
limit
(
10
)
@projects
=
Project
.
limit
(
10
)
@users
=
User
.
order
(
"created_at DESC"
).
limit
(
10
)
@users
=
User
.
limit
(
10
)
@groups
=
Group
.
order
(
"created_at DESC"
).
limit
(
10
)
@groups
=
Group
.
limit
(
10
)
end
end
end
end
app/controllers/admin/groups_controller.rb
View file @
62ed1c53
...
@@ -2,7 +2,7 @@ class Admin::GroupsController < Admin::ApplicationController
...
@@ -2,7 +2,7 @@ class Admin::GroupsController < Admin::ApplicationController
before_filter
:group
,
only:
[
:edit
,
:show
,
:update
,
:destroy
,
:project_update
,
:project_teams_update
]
before_filter
:group
,
only:
[
:edit
,
:show
,
:update
,
:destroy
,
:project_update
,
:project_teams_update
]
def
index
def
index
@groups
=
Group
.
order
(
'name ASC'
)
@groups
=
Group
.
order
_name
@groups
=
@groups
.
search
(
params
[
:name
])
if
params
[
:name
].
present?
@groups
=
@groups
.
search
(
params
[
:name
])
if
params
[
:name
].
present?
@groups
=
@groups
.
page
(
params
[
:page
]).
per
(
20
)
@groups
=
@groups
.
page
(
params
[
:page
]).
per
(
20
)
end
end
...
...
app/controllers/admin/users_controller.rb
View file @
62ed1c53
...
@@ -5,13 +5,13 @@ class Admin::UsersController < Admin::ApplicationController
...
@@ -5,13 +5,13 @@ class Admin::UsersController < Admin::ApplicationController
@users
=
User
.
filter
(
params
[
:filter
])
@users
=
User
.
filter
(
params
[
:filter
])
@users
=
@users
.
search
(
params
[
:name
])
if
params
[
:name
].
present?
@users
=
@users
.
search
(
params
[
:name
])
if
params
[
:name
].
present?
@users
=
@users
.
sort
(
@sort
=
params
[
:sort
])
@users
=
@users
.
sort
(
@sort
=
params
[
:sort
])
@users
=
@users
.
alphabetically
.
page
(
params
[
:page
])
@users
=
@users
.
order_name
.
page
(
params
[
:page
])
end
end
def
show
def
show
@personal_projects
=
user
.
personal_projects
@personal_projects
=
user
.
personal_projects
@joined_projects
=
user
.
projects
.
joined
(
@user
)
@joined_projects
=
user
.
projects
.
joined
(
@user
)
@keys
=
user
.
keys
.
order
(
'id DESC'
)
@keys
=
user
.
keys
end
end
def
new
def
new
...
...
app/controllers/profiles/keys_controller.rb
View file @
62ed1c53
...
@@ -3,7 +3,7 @@ class Profiles::KeysController < ApplicationController
...
@@ -3,7 +3,7 @@ class Profiles::KeysController < ApplicationController
skip_before_filter
:authenticate_user!
,
only:
[
:get_keys
]
skip_before_filter
:authenticate_user!
,
only:
[
:get_keys
]
def
index
def
index
@keys
=
current_user
.
keys
.
order
(
'id DESC'
)
@keys
=
current_user
.
keys
end
end
def
show
def
show
...
...
app/models/broadcast_message.rb
View file @
62ed1c53
...
@@ -14,6 +14,8 @@
...
@@ -14,6 +14,8 @@
#
#
class
BroadcastMessage
<
ActiveRecord
::
Base
class
BroadcastMessage
<
ActiveRecord
::
Base
include
Sortable
validates
:message
,
presence:
true
validates
:message
,
presence:
true
validates
:starts_at
,
presence:
true
validates
:starts_at
,
presence:
true
validates
:ends_at
,
presence:
true
validates
:ends_at
,
presence:
true
...
...
app/models/concerns/internal_id.rb
View file @
62ed1c53
module
InternalId
module
InternalId
extend
ActiveSupport
::
Concern
extend
ActiveSupport
::
Concern
include
Sortable
included
do
included
do
validate
:set_iid
,
on: :create
validate
:set_iid
,
on: :create
...
...
app/models/concerns/sortable.rb
0 → 100644
View file @
62ed1c53
# == Sortable concern
#
# Set default scope for ordering objects
#
module
Sortable
extend
ActiveSupport
::
Concern
included
do
# By default all models should be ordered
# by created_at field starting from newest
default_scope
{
order
(
created_at: :desc
,
id: :desc
)
}
scope
:order_name
,
->
{
reorder
(
name: :asc
)
}
scope
:order_recent
,
->
{
reorder
(
created_at: :desc
,
id: :desc
)
}
scope
:order_oldest
,
->
{
reorder
(
created_at: :asc
,
id: :asc
)
}
scope
:order_recent_updated
,
->
{
reorder
(
updated_at: :desc
,
id: :desc
)
}
scope
:order_oldest_updated
,
->
{
reorder
(
updated_at: :asc
,
id: :asc
)
}
end
module
ClassMethods
def
sort
(
method
)
case
method
.
to_s
when
'name'
then
order_name_asc
when
'recent'
then
order_recent
when
'oldest'
then
order_oldest
when
'recent_updated'
then
order_recent_updated
when
'oldest_updated'
then
order_oldest_updated
else
self
end
end
end
end
app/models/email.rb
View file @
62ed1c53
...
@@ -10,6 +10,8 @@
...
@@ -10,6 +10,8 @@
#
#
class
Email
<
ActiveRecord
::
Base
class
Email
<
ActiveRecord
::
Base
include
Sortable
belongs_to
:user
belongs_to
:user
validates
:user_id
,
presence:
true
validates
:user_id
,
presence:
true
...
...
app/models/event.rb
View file @
62ed1c53
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
#
#
class
Event
<
ActiveRecord
::
Base
class
Event
<
ActiveRecord
::
Base
include
Sortable
default_scope
{
where
.
not
(
author_id:
nil
)
}
default_scope
{
where
.
not
(
author_id:
nil
)
}
CREATED
=
1
CREATED
=
1
...
...
app/models/hooks/web_hook.rb
View file @
62ed1c53
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
#
#
class
WebHook
<
ActiveRecord
::
Base
class
WebHook
<
ActiveRecord
::
Base
include
Sortable
include
HTTParty
include
HTTParty
default_value_for
:push_events
,
true
default_value_for
:push_events
,
true
...
...
app/models/identity.rb
View file @
62ed1c53
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
#
#
class
Identity
<
ActiveRecord
::
Base
class
Identity
<
ActiveRecord
::
Base
include
Sortable
belongs_to
:user
belongs_to
:user
validates
:extern_uid
,
allow_blank:
true
,
uniqueness:
{
scope: :provider
}
validates
:extern_uid
,
allow_blank:
true
,
uniqueness:
{
scope: :provider
}
...
...
app/models/key.rb
View file @
62ed1c53
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
require
'digest/md5'
require
'digest/md5'
class
Key
<
ActiveRecord
::
Base
class
Key
<
ActiveRecord
::
Base
include
Sortable
include
Gitlab
::
Popen
include
Gitlab
::
Popen
belongs_to
:user
belongs_to
:user
...
...
app/models/label.rb
View file @
62ed1c53
...
@@ -11,6 +11,8 @@
...
@@ -11,6 +11,8 @@
#
#
class
Label
<
ActiveRecord
::
Base
class
Label
<
ActiveRecord
::
Base
include
Sortable
DEFAULT_COLOR
=
'#428BCA'
DEFAULT_COLOR
=
'#428BCA'
belongs_to
:project
belongs_to
:project
...
...
app/models/member.rb
View file @
62ed1c53
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
#
#
class
Member
<
ActiveRecord
::
Base
class
Member
<
ActiveRecord
::
Base
include
Sortable
include
Notifiable
include
Notifiable
include
Gitlab
::
Access
include
Gitlab
::
Access
...
...
app/models/merge_request_diff.rb
View file @
62ed1c53
...
@@ -14,6 +14,8 @@
...
@@ -14,6 +14,8 @@
require
Rails
.
root
.
join
(
"app/models/commit"
)
require
Rails
.
root
.
join
(
"app/models/commit"
)
class
MergeRequestDiff
<
ActiveRecord
::
Base
class
MergeRequestDiff
<
ActiveRecord
::
Base
include
Sortable
# Prevent store of diff
# Prevent store of diff
# if commits amount more then 200
# if commits amount more then 200
COMMITS_SAFE_SIZE
=
200
COMMITS_SAFE_SIZE
=
200
...
...
app/models/namespace.rb
View file @
62ed1c53
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
#
#
class
Namespace
<
ActiveRecord
::
Base
class
Namespace
<
ActiveRecord
::
Base
include
Sortable
include
Gitlab
::
ShellAdapter
include
Gitlab
::
ShellAdapter
has_many
:projects
,
dependent: :destroy
has_many
:projects
,
dependent: :destroy
...
...
app/models/note.rb
View file @
62ed1c53
...
@@ -23,6 +23,7 @@ require 'file_size_validator'
...
@@ -23,6 +23,7 @@ require 'file_size_validator'
class
Note
<
ActiveRecord
::
Base
class
Note
<
ActiveRecord
::
Base
include
Mentionable
include
Mentionable
default_scope
{
order
(
created_at: :asc
,
id: :asc
)
}
default_value_for
:system
,
false
default_value_for
:system
,
false
attr_mentionable
:note
attr_mentionable
:note
...
...
app/models/project.rb
View file @
62ed1c53
...
@@ -33,6 +33,7 @@ require 'carrierwave/orm/activerecord'
...
@@ -33,6 +33,7 @@ require 'carrierwave/orm/activerecord'
require
'file_size_validator'
require
'file_size_validator'
class
Project
<
ActiveRecord
::
Base
class
Project
<
ActiveRecord
::
Base
include
Sortable
include
Gitlab
::
ShellAdapter
include
Gitlab
::
ShellAdapter
include
Gitlab
::
VisibilityLevel
include
Gitlab
::
VisibilityLevel
include
Gitlab
::
ConfigHelper
include
Gitlab
::
ConfigHelper
...
@@ -53,7 +54,7 @@ class Project < ActiveRecord::Base
...
@@ -53,7 +54,7 @@ class Project < ActiveRecord::Base
attr_accessor
:new_default_branch
attr_accessor
:new_default_branch
# Relations
# Relations
belongs_to
:creator
,
foreign_key:
'creator_id'
,
class_name:
'User'
belongs_to
:creator
,
foreign_key:
'creator_id'
,
class_name:
'User'
belongs_to
:group
,
->
{
where
(
type:
Group
)
},
foreign_key:
'namespace_id'
belongs_to
:group
,
->
{
where
(
type:
Group
)
},
foreign_key:
'namespace_id'
belongs_to
:namespace
belongs_to
:namespace
...
@@ -86,7 +87,7 @@ class Project < ActiveRecord::Base
...
@@ -86,7 +87,7 @@ class Project < ActiveRecord::Base
has_many
:merge_requests
,
dependent: :destroy
,
foreign_key:
'target_project_id'
has_many
:merge_requests
,
dependent: :destroy
,
foreign_key:
'target_project_id'
# Merge requests from source project should be kept when source project was removed
# Merge requests from source project should be kept when source project was removed
has_many
:fork_merge_requests
,
foreign_key:
'source_project_id'
,
class_name:
MergeRequest
has_many
:fork_merge_requests
,
foreign_key:
'source_project_id'
,
class_name:
MergeRequest
has_many
:issues
,
->
{
order
'issues.state DESC, issues.created_at DESC'
},
dependent: :destroy
has_many
:issues
,
dependent: :destroy
has_many
:labels
,
dependent: :destroy
has_many
:labels
,
dependent: :destroy
has_many
:services
,
dependent: :destroy
has_many
:services
,
dependent: :destroy
has_many
:events
,
dependent: :destroy
has_many
:events
,
dependent: :destroy
...
@@ -139,14 +140,16 @@ class Project < ActiveRecord::Base
...
@@ -139,14 +140,16 @@ class Project < ActiveRecord::Base
mount_uploader
:avatar
,
AttachmentUploader
mount_uploader
:avatar
,
AttachmentUploader
# Scopes
# Scopes
scope
:sorted_by_activity
,
->
{
reorder
(
'projects.last_activity_at DESC'
)
}
scope
:sorted_by_stars
,
->
{
reorder
(
'projects.star_count DESC'
)
}
scope
:sorted_by_names
,
->
{
joins
(
:namespace
).
reorder
(
'namespaces.name ASC, projects.name ASC'
)
}
scope
:without_user
,
->
(
user
)
{
where
(
'projects.id NOT IN (:ids)'
,
ids:
user
.
authorized_projects
.
map
(
&
:id
)
)
}
scope
:without_user
,
->
(
user
)
{
where
(
'projects.id NOT IN (:ids)'
,
ids:
user
.
authorized_projects
.
map
(
&
:id
)
)
}
scope
:without_team
,
->
(
team
)
{
team
.
projects
.
present?
?
where
(
'projects.id NOT IN (:ids)'
,
ids:
team
.
projects
.
map
(
&
:id
))
:
scoped
}
scope
:without_team
,
->
(
team
)
{
team
.
projects
.
present?
?
where
(
'projects.id NOT IN (:ids)'
,
ids:
team
.
projects
.
map
(
&
:id
))
:
scoped
}
scope
:not_in_group
,
->
(
group
)
{
where
(
'projects.id NOT IN (:ids)'
,
ids:
group
.
project_ids
)
}
scope
:not_in_group
,
->
(
group
)
{
where
(
'projects.id NOT IN (:ids)'
,
ids:
group
.
project_ids
)
}
scope
:in_team
,
->
(
team
)
{
where
(
'projects.id IN (:ids)'
,
ids:
team
.
projects
.
map
(
&
:id
))
}
scope
:in_team
,
->
(
team
)
{
where
(
'projects.id IN (:ids)'
,
ids:
team
.
projects
.
map
(
&
:id
))
}
scope
:in_namespace
,
->
(
namespace
)
{
where
(
namespace_id:
namespace
.
id
)
}
scope
:in_namespace
,
->
(
namespace
)
{
where
(
namespace_id:
namespace
.
id
)
}
scope
:in_group_namespace
,
->
{
joins
(
:group
)
}
scope
:in_group_namespace
,
->
{
joins
(
:group
)
}
scope
:sorted_by_activity
,
->
{
reorder
(
'projects.last_activity_at DESC'
)
}
scope
:sorted_by_stars
,
->
{
reorder
(
'projects.star_count DESC'
)
}
scope
:personal
,
->
(
user
)
{
where
(
namespace_id:
user
.
namespace_id
)
}
scope
:personal
,
->
(
user
)
{
where
(
namespace_id:
user
.
namespace_id
)
}
scope
:joined
,
->
(
user
)
{
where
(
'namespace_id != ?'
,
user
.
namespace_id
)
}
scope
:joined
,
->
(
user
)
{
where
(
'namespace_id != ?'
,
user
.
namespace_id
)
}
scope
:public_only
,
->
{
where
(
visibility_level:
Project
::
PUBLIC
)
}
scope
:public_only
,
->
{
where
(
visibility_level:
Project
::
PUBLIC
)
}
...
...
app/models/service.rb
View file @
62ed1c53
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
# To add new service you should build a class inherited from Service
# To add new service you should build a class inherited from Service
# and implement a set of methods
# and implement a set of methods
class
Service
<
ActiveRecord
::
Base
class
Service
<
ActiveRecord
::
Base
include
Sortable
serialize
:properties
,
JSON
serialize
:properties
,
JSON
default_value_for
:active
,
false
default_value_for
:active
,
false
...
...
app/models/snippet.rb
View file @
62ed1c53
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
#
#
class
Snippet
<
ActiveRecord
::
Base
class
Snippet
<
ActiveRecord
::
Base
include
Sortable
include
Linguist
::
BlobHelper
include
Linguist
::
BlobHelper
include
Gitlab
::
VisibilityLevel
include
Gitlab
::
VisibilityLevel
...
...
app/models/user.rb
View file @
62ed1c53
...
@@ -49,6 +49,7 @@ require 'carrierwave/orm/activerecord'
...
@@ -49,6 +49,7 @@ require 'carrierwave/orm/activerecord'
require
'file_size_validator'
require
'file_size_validator'
class
User
<
ActiveRecord
::
Base
class
User
<
ActiveRecord
::
Base
include
Sortable
include
Gitlab
::
ConfigHelper
include
Gitlab
::
ConfigHelper
include
TokenAuthenticatable
include
TokenAuthenticatable
extend
Gitlab
::
ConfigHelper
extend
Gitlab
::
ConfigHelper
...
@@ -176,7 +177,6 @@ class User < ActiveRecord::Base
...
@@ -176,7 +177,6 @@ class User < ActiveRecord::Base
scope
:admins
,
->
{
where
(
admin:
true
)
}
scope
:admins
,
->
{
where
(
admin:
true
)
}
scope
:blocked
,
->
{
with_state
(
:blocked
)
}
scope
:blocked
,
->
{
with_state
(
:blocked
)
}
scope
:active
,
->
{
with_state
(
:active
)
}
scope
:active
,
->
{
with_state
(
:active
)
}
scope
:alphabetically
,
->
{
order
(
'name ASC'
)
}
scope
:in_team
,
->
(
team
){
where
(
id:
team
.
member_ids
)
}
scope
:in_team
,
->
(
team
){
where
(
id:
team
.
member_ids
)
}
scope
:not_in_team
,
->
(
team
){
where
(
'users.id NOT IN (:ids)'
,
ids:
team
.
member_ids
)
}
scope
:not_in_team
,
->
(
team
){
where
(
'users.id NOT IN (:ids)'
,
ids:
team
.
member_ids
)
}
scope
:not_in_project
,
->
(
project
)
{
project
.
users
.
present?
?
where
(
"id not in (:ids)"
,
ids:
project
.
users
.
map
(
&
:id
)
)
:
all
}
scope
:not_in_project
,
->
(
project
)
{
project
.
users
.
present?
?
where
(
"id not in (:ids)"
,
ids:
project
.
users
.
map
(
&
:id
)
)
:
all
}
...
@@ -290,7 +290,7 @@ class User < ActiveRecord::Base
...
@@ -290,7 +290,7 @@ class User < ActiveRecord::Base
def
authorized_groups
def
authorized_groups
@authorized_groups
||=
begin
@authorized_groups
||=
begin
group_ids
=
(
groups
.
pluck
(
:id
)
+
authorized_projects
.
pluck
(
:namespace_id
))
group_ids
=
(
groups
.
pluck
(
:id
)
+
authorized_projects
.
pluck
(
:namespace_id
))
Group
.
where
(
id:
group_ids
)
.
order
(
'namespaces.name ASC'
)
Group
.
where
(
id:
group_ids
)
end
end
end
end
...
@@ -301,7 +301,7 @@ class User < ActiveRecord::Base
...
@@ -301,7 +301,7 @@ class User < ActiveRecord::Base
project_ids
=
personal_projects
.
pluck
(
:id
)
project_ids
=
personal_projects
.
pluck
(
:id
)
project_ids
.
push
(
*
groups_projects
.
pluck
(
:id
))
project_ids
.
push
(
*
groups_projects
.
pluck
(
:id
))
project_ids
.
push
(
*
projects
.
pluck
(
:id
).
uniq
)
project_ids
.
push
(
*
projects
.
pluck
(
:id
).
uniq
)
Project
.
where
(
id:
project_ids
)
.
joins
(
:namespace
).
order
(
'namespaces.name ASC'
)
Project
.
where
(
id:
project_ids
)
end
end
end
end
...
...
lib/api/issues.rb
View file @
62ed1c53
...
@@ -39,7 +39,6 @@ module API
...
@@ -39,7 +39,6 @@ module API
issues
=
current_user
.
issues
issues
=
current_user
.
issues
issues
=
filter_issues_state
(
issues
,
params
[
:state
])
unless
params
[
:state
].
nil?
issues
=
filter_issues_state
(
issues
,
params
[
:state
])
unless
params
[
:state
].
nil?
issues
=
filter_issues_labels
(
issues
,
params
[
:labels
])
unless
params
[
:labels
].
nil?
issues
=
filter_issues_labels
(
issues
,
params
[
:labels
])
unless
params
[
:labels
].
nil?
issues
=
issues
.
order
(
'issues.id DESC'
)
present
paginate
(
issues
),
with:
Entities
::
Issue
present
paginate
(
issues
),
with:
Entities
::
Issue
end
end
...
@@ -70,7 +69,6 @@ module API
...
@@ -70,7 +69,6 @@ module API
unless
params
[
:milestone
].
nil?
unless
params
[
:milestone
].
nil?
issues
=
filter_issues_milestone
(
issues
,
params
[
:milestone
])
issues
=
filter_issues_milestone
(
issues
,
params
[
:milestone
])
end
end
issues
=
issues
.
order
(
'issues.id DESC'
)
present
paginate
(
issues
),
with:
Entities
::
Issue
present
paginate
(
issues
),
with:
Entities
::
Issue
end
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment