Skip to content

Commit 301993c

Browse files
committed
add “must change password”; prepare #33
Signed-off-by: Chris Warrick <[email protected]>
1 parent e437ec2 commit 301993c

12 files changed

+309
-183
lines changed

Diff for: coil/data/coil_assets/css/coil.css

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ table.users .uid {
9090
text-align: center;
9191
}
9292

93+
.perm-descr {
94+
font-size: x-small;
95+
}
96+
9397
/* login (copied from Bootstrap example) */
9498

9599
.form-signin {

Diff for: coil/data/templates/jinja/coil_users.tmpl

+43-41
Original file line numberDiff line numberDiff line change
@@ -41,57 +41,59 @@ $('#deleteModal').on('show.bs.modal', function (event) {
4141

4242
<table class="table table-hover users" style="table-layout: fixed;">
4343
<thead><tr>
44-
<th class="uid">#</th>
45-
<th class="username">Username</th>
46-
<th class="realname">Real name</th>
47-
<th class="email">E-mail address</th>
48-
<th class="is_admin">Admin</th>
49-
<th class="actions">Actions</th>
44+
<th class="uid">#</th>
45+
<th class="username">Username</th>
46+
<th class="realname">Real name</th>
47+
<th class="email">E-mail address</th>
48+
<th class="is_admin">Admin</th>
49+
<th class="actions">Actions</th>
5050
</tr></thead>
5151
{% for uid, user in USERS %}
5252
{% if user.active %}
5353
<tr>
5454
{% else %}
5555
<tr class="danger inactive-user">
5656
{% endif %}
57-
<td class="uid">{{ uid }}</td>
58-
<td class="username">{{ user.username }}</td>
59-
<td class="realname">{{ user.realname }}</td>
60-
<td class="email">{{ user.email }}</td>
61-
<td class="actions">
62-
{% if user.is_admin %}
63-
<i class="fa fa-check"></i>
64-
{% else %}
65-
<i class="fa fa-times"></i>
66-
{% endif %}
67-
</td>
68-
<td class="actions">
69-
<form action="{{ url_for('acp_users_edit') }}" method="POST">{{ editform.csrf_token }}
70-
<input type="hidden" name="uid" value="{{ uid }}">
71-
<input type="hidden" name="action" value="edit">
72-
<div class="btn-group" role="group">
73-
{% if user.active %}
74-
<button type="submit" class="btn btn-sm btn-info" title="Edit"><i class="fa fa-pencil fa-fw"></i> Edit</button>
75-
{% if user.uid == current_user.uid %}
76-
<button type="button" class="btn btn-sm btn-danger" title="Delete" disabled><i class="fa fa-trash fa-fw"></i> Delete</button>
77-
{% else %}
78-
<button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#deleteModal" data-username="{{ user.username }}" data-uid="{{ uid }}" data-direction="del" title="Delete"><i class="fa fa-trash fa-fw"></i> Delete</button>
79-
{% endif %}
80-
{% else %}
81-
<button type="button" class="btn btn-sm btn-info" title="Edit" disabled><i class="fa fa-pencil fa-fw"></i> Edit</button>
82-
<button type="button" class="btn btn-sm btn-success" data-toggle="modal" data-target="#deleteModal" data-username="{{ user.username }}" data-uid="{{ uid }}" data-direction="undel" title="Undelete"><i class="fa fa-trash-o fa-fw"></i> Undelete</button>
83-
{% endif %}
84-
</div>
85-
</form>
57+
<td class="uid">{{ uid }}</td>
58+
<td class="username">{{ user.username }}</td>
59+
<td class="realname">{{ user.realname }}</td>
60+
<td class="email">{{ user.email }}</td>
61+
<td class="actions">
62+
{% if user.is_admin %}
63+
<i class="fa fa-check"></i>
64+
{% else %}
65+
<i class="fa fa-times"></i>
66+
{% endif %}
67+
</td>
68+
<td class="actions">
69+
<form action="{{ url_for('acp_users_edit') }}" method="POST">{{ editform.csrf_token }}
70+
<input type="hidden" name="uid" value="{{ uid }}">
71+
<input type="hidden" name="action" value="edit">
72+
<div class="btn-group" role="group">
73+
{% if user.active %}
74+
<button type="submit" class="btn btn-sm btn-info" title="Edit"><i class="fa fa-pencil fa-fw"></i> Edit</button>
75+
{% if user.uid == current_user.uid %}
76+
<button type="button" class="btn btn-sm btn-danger" title="Delete" disabled><i class="fa fa-trash fa-fw"></i> Delete</button>
77+
{% else %}
78+
<button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#deleteModal" data-username="{{ user.username }}" data-uid="{{ uid }}" data-direction="del" title="Delete"><i class="fa fa-trash fa-fw"></i> Delete</button>
79+
{% endif %}
80+
{% else %}
81+
<button type="button" class="btn btn-sm btn-info" title="Edit" disabled><i class="fa fa-pencil fa-fw"></i> Edit</button>
82+
<button type="button" class="btn btn-sm btn-success" data-toggle="modal" data-target="#deleteModal" data-username="{{ user.username }}" data-uid="{{ uid }}" data-direction="undel" title="Undelete"><i class="fa fa-trash-o fa-fw"></i> Undelete</button>
83+
{% endif %}
84+
</div>
85+
</form>
8686
</tr>
8787
{% endfor %}
8888
<tr><form action="{{ url_for('acp_users_edit') }}" method="POST">{{ editform.csrf_token }}
89-
<td></td>
90-
<td><input name="username" placeholder="New user" class="form-control"></td>
91-
<td><input name="action" value="new" type="hidden"></td>
92-
<td></td>
93-
<td></td>
94-
<td><button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-plus-square fa-fw"></i> Create</button></td>
89+
<td class="uid"><strong>Create:</strong></td>
90+
<td colspan="4"><input name="username" placeholder="New user" class="form-control input-sm"></td>
91+
<td><button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-plus-square fa-fw"></i> Create</button></td>
92+
</form></tr>
93+
<tr><form action="{{ url_for('acp_users_import') }}" method="POST" enctype="multipart/form-data">{{ importform.csrf_token }}
94+
<td class="uid"><strong>Import:</strong></td>
95+
<td colspan="4"><input name="tsv" type="file" required></td>
96+
<td><button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-file-text-o fa-fw"></i> Import TSV</button></td>
9597
</form></tr>
9698
</table>
9799

Diff for: coil/data/templates/jinja/coil_users_edit.tmpl

+9
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@
9595
{% endif %}
9696
> User is an administrator
9797
</label></div>
98+
<div class="checkbox"><label><input type="checkbox" name="must_change_password"
99+
{% if user.must_change_password %}
100+
checked
101+
{% endif %}
102+
{% if user.uid == current_user.uid %}
103+
disabled
104+
{% endif %}
105+
> User must change password on next login
106+
</label></div>
98107
<div class="checkbox"><label><input type="checkbox" name="can_edit_all_posts"
99108
{% if user.can_edit_all_posts %}
100109
checked

Diff for: coil/data/templates/jinja/coil_users_permissions.tmpl

+15-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{% extends 'base.tmpl' %}
33
{% block extra_js %}
44
<script>
5-
var PERMISSIONS = {{ json.dumps(PERMISSIONS) }};
5+
var PERMISSIONS = {{ json.dumps(PERMISSIONS_E) }};
66
var UIDS = {{ json.dumps(UIDS) }};
77
var current_uid = {{ current_user.uid }};
88
$(document).ready(function() {
@@ -54,35 +54,39 @@ $(document).ready(function() {
5454
{% endif %}
5555

5656
<form action="{{ url_for('acp_users_permissions') }}" method="POST">
57-
<table class="table table-hover users" style="table-layout: fixed;">
57+
<table class="table table-hover users">
5858
<thead><tr>
5959
<th class="uid">#</th>
6060
<th class="username">Username</th>
61-
<th class="perm is_active">Active<br>
61+
<th class="perm is_active"><div class="perm-descr">Active</div>
6262
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="is_active"><i class="fa fa-check-square-o fa-fw"></i></button>
6363
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="is_active"><i class="fa fa-square-o fa-fw"></i></button>
6464
</th>
65-
<th class="perm is_admin">Admin<br>
65+
<th class="perm is_admin"><div class="perm-descr">Admin</div>
6666
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="is_admin"><i class="fa fa-check-square-o fa-fw"></i></button>
6767
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="is_admin"><i class="fa fa-square-o fa-fw"></i></button>
6868
</th>
69-
<th class="perm can_edit_all_posts">Can all posts<br>
69+
<th class="perm must_change_password"><div class="perm-descr">Must change password</div>
70+
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="must_change_password"><i class="fa fa-check-square-o fa-fw"></i></button>
71+
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="must_change_password"><i class="fa fa-square-o fa-fw"></i></button>
72+
</th>
73+
<th class="perm can_edit_all_posts"><div class="perm-descr">Can all posts</div>
7074
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="can_edit_all_posts"><i class="fa fa-check-square-o fa-fw"></i></button>
7175
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="can_edit_all_posts"><i class="fa fa-square-o fa-fw"></i></button>
7276
</th>
73-
<th class="perm wants_all_posts">Wants all posts<br>
77+
<th class="perm wants_all_posts"><div class="perm-descr">Wants all posts</div>
7478
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="wants_all_posts"><i class="fa fa-check-square-o fa-fw"></i></button>
7579
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="wants_all_posts"><i class="fa fa-square-o fa-fw"></i></button>
7680
</th>
77-
<th class="perm can_upload_attachments">Attachments<br>
81+
<th class="perm can_upload_attachments"><div class="perm-descr">Attachments</div>
7882
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="can_upload_attachments"><i class="fa fa-check-square-o fa-fw"></i></button>
7983
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="can_upload_attachments"><i class="fa fa-square-o fa-fw"></i></button>
8084
</th>
81-
<th class="perm can_rebuild_site">Rebuild<br>
85+
<th class="perm can_rebuild_site"><div class="perm-descr">Rebuild</div>
8286
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="can_rebuild_site"><i class="fa fa-check-square-o fa-fw"></i></button>
8387
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="can_rebuild_site"><i class="fa fa-square-o fa-fw"></i></button>
8488
</th>
85-
<th class="perm can_transfer_post_authorship">Transfer authorship<br>
89+
<th class="perm can_transfer_post_authorship"><div class="perm-descr">Transfer authorship</div>
8690
<button type="button" class="btn btn-info btn-xs select_all-perm" data-perm="can_transfer_post_authorship"><i class="fa fa-check-square-o fa-fw"></i></button>
8791
<button type="button" class="btn btn-info btn-xs select_none-perm" data-perm="can_transfer_post_authorship"><i class="fa fa-square-o fa-fw"></i></button>
8892
</th>
@@ -93,7 +97,7 @@ $(document).ready(function() {
9397
<tr class="u{{ uid }}">
9498
<td class="uid">{{ uid }}</td>
9599
<td class="username">{{ user.username }}</td>
96-
{% for p in PERMISSIONS %}
100+
{% for p in PERMISSIONS_E %}
97101
<td class="perm
98102
{% if p == 'active' %}
99103
is_active
@@ -102,7 +106,7 @@ is_active
102106
{% endif %}
103107
">{{ display_permission(user, p) }}</td>
104108
{% endfor %}
105-
<td class="select_all"><button type="button" class="btn btn-info select_all-user" data-uid="{{ uid }}"><i class="fa fa-check-square-o fa-fw"></i></button> <button type="button" class="btn btn-info select_none-user" data-uid="{{ uid }}"><i class="fa fa-square-o fa-fw"></i></button></td>
109+
<td class="select_all"><button type="button" class="btn btn-sm btn-info select_all-user" data-uid="{{ uid }}"><i class="fa fa-check-square-o fa-fw"></i></button> <button type="button" class="btn btn-sm btn-info select_none-user" data-uid="{{ uid }}"><i class="fa fa-square-o fa-fw"></i></button></td>
106110
</tr>
107111
{% endif %}
108112
{% endfor %}

Diff for: coil/data/templates/mako/coil_users.tmpl

+43-41
Original file line numberDiff line numberDiff line change
@@ -41,57 +41,59 @@ $('#deleteModal').on('show.bs.modal', function (event) {
4141

4242
<table class="table table-hover users" style="table-layout: fixed;">
4343
<thead><tr>
44-
<th class="uid">#</th>
45-
<th class="username">Username</th>
46-
<th class="realname">Real name</th>
47-
<th class="email">E-mail address</th>
48-
<th class="is_admin">Admin</th>
49-
<th class="actions">Actions</th>
44+
<th class="uid">#</th>
45+
<th class="username">Username</th>
46+
<th class="realname">Real name</th>
47+
<th class="email">E-mail address</th>
48+
<th class="is_admin">Admin</th>
49+
<th class="actions">Actions</th>
5050
</tr></thead>
5151
% for uid, user in USERS:
5252
% if user.active:
5353
<tr>
5454
% else:
5555
<tr class="danger inactive-user">
5656
% endif
57-
<td class="uid">${uid}</td>
58-
<td class="username">${user.username}</td>
59-
<td class="realname">${user.realname}</td>
60-
<td class="email">${user.email}</td>
61-
<td class="actions">
62-
% if user.is_admin:
63-
<i class="fa fa-check"></i>
64-
% else:
65-
<i class="fa fa-times"></i>
66-
% endif
67-
</td>
68-
<td class="actions">
69-
<form action="${url_for('acp_users_edit')}" method="POST">${editform.csrf_token}
70-
<input type="hidden" name="uid" value="${uid}">
71-
<input type="hidden" name="action" value="edit">
72-
<div class="btn-group" role="group">
73-
% if user.active:
74-
<button type="submit" class="btn btn-sm btn-info" title="Edit"><i class="fa fa-pencil fa-fw"></i> Edit</button>
75-
% if user.uid == current_user.uid:
76-
<button type="button" class="btn btn-sm btn-danger" title="Delete" disabled><i class="fa fa-trash fa-fw"></i> Delete</button>
77-
% else:
78-
<button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#deleteModal" data-username="${user.username}" data-uid="${uid}" data-direction="del" title="Delete"><i class="fa fa-trash fa-fw"></i> Delete</button>
79-
% endif
80-
% else:
81-
<button type="button" class="btn btn-sm btn-info" title="Edit" disabled><i class="fa fa-pencil fa-fw"></i> Edit</button>
82-
<button type="button" class="btn btn-sm btn-success" data-toggle="modal" data-target="#deleteModal" data-username="${user.username}" data-uid="${uid}" data-direction="undel" title="Undelete"><i class="fa fa-trash-o fa-fw"></i> Undelete</button>
83-
% endif
84-
</div>
85-
</form>
57+
<td class="uid">${uid}</td>
58+
<td class="username">${user.username}</td>
59+
<td class="realname">${user.realname}</td>
60+
<td class="email">${user.email}</td>
61+
<td class="actions">
62+
% if user.is_admin:
63+
<i class="fa fa-check"></i>
64+
% else:
65+
<i class="fa fa-times"></i>
66+
% endif
67+
</td>
68+
<td class="actions">
69+
<form action="${url_for('acp_users_edit')}" method="POST">${editform.csrf_token}
70+
<input type="hidden" name="uid" value="${uid}">
71+
<input type="hidden" name="action" value="edit">
72+
<div class="btn-group" role="group">
73+
% if user.active:
74+
<button type="submit" class="btn btn-sm btn-info" title="Edit"><i class="fa fa-pencil fa-fw"></i> Edit</button>
75+
% if user.uid == current_user.uid:
76+
<button type="button" class="btn btn-sm btn-danger" title="Delete" disabled><i class="fa fa-trash fa-fw"></i> Delete</button>
77+
% else:
78+
<button type="button" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#deleteModal" data-username="${user.username}" data-uid="${uid}" data-direction="del" title="Delete"><i class="fa fa-trash fa-fw"></i> Delete</button>
79+
% endif
80+
% else:
81+
<button type="button" class="btn btn-sm btn-info" title="Edit" disabled><i class="fa fa-pencil fa-fw"></i> Edit</button>
82+
<button type="button" class="btn btn-sm btn-success" data-toggle="modal" data-target="#deleteModal" data-username="${user.username}" data-uid="${uid}" data-direction="undel" title="Undelete"><i class="fa fa-trash-o fa-fw"></i> Undelete</button>
83+
% endif
84+
</div>
85+
</form>
8686
</tr>
8787
% endfor
8888
<tr><form action="${url_for('acp_users_edit')}" method="POST">${editform.csrf_token}
89-
<td></td>
90-
<td><input name="username" placeholder="New user" class="form-control"></td>
91-
<td><input name="action" value="new" type="hidden"></td>
92-
<td></td>
93-
<td></td>
94-
<td><button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-plus-square fa-fw"></i> Create</button></td>
89+
<td class="uid"><strong>Create:</strong></td>
90+
<td colspan="4"><input name="username" placeholder="New user" class="form-control input-sm"></td>
91+
<td><button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-plus-square fa-fw"></i> Create</button></td>
92+
</form></tr>
93+
<tr><form action="${url_for('acp_users_import')}" method="POST" enctype="multipart/form-data">${importform.csrf_token}
94+
<td class="uid"><strong>Import:</strong></td>
95+
<td colspan="4"><input name="tsv" type="file" required></td>
96+
<td><button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-file-text-o fa-fw"></i> Import TSV</button></td>
9597
</form></tr>
9698
</table>
9799

Diff for: coil/data/templates/mako/coil_users_edit.tmpl

+9
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@
9595
% endif
9696
> User is an administrator
9797
</label></div>
98+
<div class="checkbox"><label><input type="checkbox" name="must_change_password"
99+
% if user.must_change_password:
100+
checked
101+
% endif
102+
% if user.uid == current_user.uid:
103+
disabled
104+
% endif
105+
> User must change password on next login
106+
</label></div>
98107
<div class="checkbox"><label><input type="checkbox" name="can_edit_all_posts"
99108
% if user.can_edit_all_posts:
100109
checked

0 commit comments

Comments
 (0)