Skip to content

Commit 6ae8536

Browse files
authored
Merge pull request #18112 from craftcms/feature/user-permissions
[6.x] UserPermissions
2 parents f723828 + 876219c commit 6ae8536

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1924
-1216
lines changed

CHANGELOG-WIP.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,3 +426,6 @@ Moved the following controllers:
426426
- Deprecated `\craft\records\User`. `\CraftCms\Cms\User\Models\User` should be used instead.
427427
- Deprecated `\craft\records\UserGroup`. `\CraftCms\Cms\User\Models\UserGroup` should be used instead.
428428
- Deprecated `\craft\records\UserPermission`. `\CraftCms\Cms\User\Models\UserPermission` should be used instead.
429+
- Deprecated `craft\services\UserPermissions`. `CraftCms\Cms\User\UserPermissions` should be used instead.
430+
- Deprecated `craft.app.userPermissions`. `craft.userPermissions` should be used instead.
431+
- Deprecated `craft\events\DefineEditUserScreensEvent`. `CraftCms\Cms\User\Events\DefineEditUserScreens` should be used instead.

resources/templates/_includes/permissions.twig

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616
{% from _self import permissionList %}
1717

1818
<ul{% if id %} id="{{ id|replace(':', '-') }}"{% endif %}>
19-
{% for permissionName, props in permissions %}
20-
{% set isInGroupPermissions = permissionName|lower in groupPermissions %}
19+
{% for permission in permissions %}
20+
{% set isInGroupPermissions = permission.key|lower in groupPermissions %}
2121

2222
{% if (isInGroupPermissions) %}
2323
{% set checked = true %}
2424
{% else %}
2525
{% if subject %}
26-
{% if craft.app.request.getActionSegments() == ['users', 'save-user'] %}
27-
{% set checked = permissionName in craft.app.request.getBodyParam('permissions', []) %}
26+
{% if request.actionSegments() == ['users', 'save-user'] %}
27+
{% set checked = permission.key in request.input('permissions', []) %}
2828
{% else %}
29-
{% set checked = subject.can(permissionName) %}
29+
{% set checked = subject.can(permission.key) %}
3030
{% endif %}
3131
{% else %}
3232
{% set checked = false %}
@@ -35,24 +35,24 @@
3535

3636
<li>
3737
{{ checkbox({
38-
label: props.label,
38+
label: permission.label,
3939
name: 'permissions[]',
40-
value: permissionName,
40+
value: permission.key,
4141
checked: checked,
4242
class: isInGroupPermissions ? 'group-permission',
4343
disabled: disabled or isInGroupPermissions,
4444
}) }}
4545

46-
{% if props.info ?? false %}
47-
<div class="info">{{ props.info }}</div>
46+
{% if permission.info ?? false %}
47+
<div class="info">{{ permission.info }}</div>
4848
{% endif %}
4949

50-
{% if props.warning ?? false %}
51-
<div class="info warning">{{ props.warning }}</div>
50+
{% if permission.warning ?? false %}
51+
<div class="info warning">{{ permission.warning }}</div>
5252
{% endif %}
5353

54-
{% if props.nested ?? false %}
55-
{{ permissionList(subject, groupPermissions, props.nested, permissionName~'-nested', disabled or not checked) }}
54+
{% if permission.nested ?? false %}
55+
{{ permissionList(subject, groupPermissions, permission.nested, permission.key~'-nested', disabled or not checked) }}
5656
{% endif %}
5757
</li>
5858
{% endfor %}
@@ -63,18 +63,11 @@
6363

6464
{% for group in permissions %}
6565
{# Include a placeholder for the user group being created? #}
66-
{% if (includeGroupPlaceholder ?? false) and group.permissions.editUsers is defined %}
67-
{% set group = group|merge({
68-
permissions: {
69-
editUsers: {
70-
nested: {
71-
assignNewUserGroup: {
72-
label: 'Assign users to this group'|t('app'),
73-
},
74-
},
75-
},
76-
},
77-
}, recursive=true) %}
66+
{% if (includeGroupPlaceholder ?? false) and group.permissions.has('viewUsers') and group.permissions.viewUsers.nested.has('editUsers') %}
67+
{% do group.permissions.viewUsers.nested.editUsers.nested.add(create('\\CraftCms\\Cms\\User\\Data\\Permission', {
68+
key: 'assignNewUserGroup',
69+
label: 'Assign users to this group'|t('app')
70+
})) %}
7871
{% endif %}
7972

8073
<div class="user-permissions {{ wrapperClass }}">

resources/templates/settings/users/groups/_edit.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
<div id="permissions">
5454
{% include "_includes/permissions" with {
5555
subject: group ?? null,
56-
permissions: craft.app.userPermissions.getAllPermissions(),
56+
permissions: craft.userPermissions.getAllPermissions(),
5757
includeGroupPlaceholder: not group.id,
5858
disabled: readOnly,
5959
} only %}

resources/templates/settings/users/groups/_team.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<div id="permissions">
1616
{% include "_includes/permissions" with {
1717
subject: group ?? null,
18-
permissions: craft.app.userPermissions.getAllPermissions(),
18+
permissions: craft.userPermissions.getAllPermissions(),
1919
includeGroupPlaceholder: not group.id,
2020
disabled: readOnly,
2121
} only %}

resources/templates/users/_permissions.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@
8080

8181
{% include '_includes/permissions' with {
8282
subject: user.admin ? null : user,
83-
permissions: craft.app.userPermissions.getAssignablePermissions(user),
84-
groupPermissions: user.id ? craft.app.userPermissions.getGroupPermissionsByUserId(user.id) : [],
83+
permissions: craft.userPermissions.getAssignablePermissions(user),
84+
groupPermissions: user.id ? craft.userPermissions.getGroupPermissionsByUserId(user.id) : [],
8585
disabled: CraftEdition == CraftTeam,
8686
} only %}
8787
</div>

routes/actions.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
use CraftCms\Cms\Http\Controllers\Updates\UpdaterController;
3636
use CraftCms\Cms\Http\Controllers\Updates\UpdatesController;
3737
use CraftCms\Cms\Http\Controllers\Users\ImpersonationController;
38+
use CraftCms\Cms\Http\Controllers\Users\PermissionsController;
3839
use CraftCms\Cms\Http\Controllers\Utilities\ClearCachesController;
3940
use CraftCms\Cms\Http\Controllers\Utilities\DbBackupController;
4041
use CraftCms\Cms\Http\Controllers\Utilities\DeprecationErrorsController;
@@ -276,6 +277,8 @@
276277
Route::post('users/get-impersonation-url', [ImpersonationController::class, 'getUrl']);
277278
});
278279

280+
Route::post('users/save-permissions', [PermissionsController::class, 'store']);
281+
279282
// User groups
280283
Route::middleware([
281284
RequireAdminChanges::class,

routes/cp.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use CraftCms\Cms\Http\Controllers\Settings\UserGroupsController;
2020
use CraftCms\Cms\Http\Controllers\Settings\UserSettingsController;
2121
use CraftCms\Cms\Http\Controllers\Updates\UpdaterController;
22+
use CraftCms\Cms\Http\Controllers\Users\PermissionsController;
2223
use CraftCms\Cms\Http\Controllers\Utilities\UtilitiesController;
2324
use CraftCms\Cms\Http\Middleware\HandleInertiaRequests;
2425
use CraftCms\Cms\Http\Middleware\RequireAdmin;
@@ -57,6 +58,12 @@
5758
Route::view('content/{page}/{sectionHandle}', 'craftcms::entries.index')->where('page', '[^\/]+');
5859
Route::get('content/{section}/new', CreateEntryController::class);
5960

61+
/**
62+
* Users
63+
*/
64+
Route::get('users/{user}/permissions', [PermissionsController::class, 'index']);
65+
Route::get('myaccount/permissions', [PermissionsController::class, 'index']);
66+
6067
/**
6168
* Routes that require admin, but do not require admin changes
6269
*/

src/Database/Migrations/Install.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
use Illuminate\Support\Facades\Event;
3838
use Illuminate\Support\Facades\Schema;
3939
use ReflectionClass;
40+
use Throwable;
4041

4142
class Install extends Migration
4243
{
@@ -69,7 +70,11 @@ public function up(): void
6970
}
7071

7172
DB::afterCommit(function () {
72-
$this->insertDefaultData();
73+
try {
74+
$this->insertDefaultData();
75+
} catch (Throwable $e) {
76+
$this->components->error("Error inserting default data: {$e->getMessage()}");
77+
}
7378
});
7479

7580
$this->newLine();

src/Database/Queries/ElementQuery.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
*
4343
* @mixin \Illuminate\Database\Query\Builder
4444
*
45+
* @method self addSelect($column)
4546
* @method self orderByDesc($column)
4647
* @method self where($column, $operator = null, $value = null, $boolean = 'and')
4748
* @method self whereIn($column, $values, $boolean = 'and', $not = false)
@@ -412,6 +413,9 @@ public function sole(array|string $columns = ['*']): ElementInterface
412413
}
413414
}
414415

416+
/**
417+
* @return TElement|null
418+
*/
415419
public function first($columns = ['*']): ?ElementInterface
416420
{
417421
// Eagerly?

src/Database/Queries/UserQuery.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
namespace CraftCms\Cms\Database\Queries;
66

77
use Closure;
8-
use craft\elements\User;
98
use CraftCms\Cms\Database\Queries\Concerns\User\QueriesAffiliatedSite;
109
use CraftCms\Cms\Database\Queries\Concerns\User\QueriesAssetUploaders;
1110
use CraftCms\Cms\Database\Queries\Concerns\User\QueriesAuthors;
1211
use CraftCms\Cms\Database\Queries\Concerns\User\QueriesRolesAndPermissions;
1312
use CraftCms\Cms\Database\Queries\Concerns\User\QueriesUserGroups;
1413
use CraftCms\Cms\Database\Queries\Concerns\User\QueriesUserProperties;
1514
use CraftCms\Cms\Database\Table;
15+
use CraftCms\Cms\Element\Elements\User;
1616
use Illuminate\Database\Query\Builder;
1717

1818
/**
@@ -38,7 +38,7 @@ final class UserQuery extends ElementQuery
3838

3939
public function __construct(array $config = [])
4040
{
41-
parent::__construct(\CraftCms\Cms\Element\Elements\User::class, $config);
41+
parent::__construct(User::class, $config);
4242

4343
$this->joinElementTable(Table::USERS);
4444

@@ -53,7 +53,7 @@ public function __construct(array $config = [])
5353
'users.lastName as lastName',
5454
'users.email as email',
5555
'users.unverifiedEmail as unverifiedEmail',
56-
'users.lastLoginDate as lastLo2ginDate',
56+
'users.lastLoginDate as lastLoginDate',
5757
'users.lockoutDate as lockoutDate',
5858
'users.hasDashboard as hasDashboard',
5959
'users.affiliatedSiteId as affiliatedSiteId',

0 commit comments

Comments
 (0)