test_users.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. import pytest
  2. from django.contrib.auth import get_user_model
  3. from django.core import mail
  4. from django.urls import reverse
  5. from ....acl.models import Role
  6. from ....admin.test import AdminTestCase
  7. from ....categories.models import Category
  8. from ....legal.models import Agreement
  9. from ....legal.utils import save_user_agreement_acceptance
  10. from ....test import assert_contains
  11. from ....threads.test import post_thread, reply_thread
  12. from ...datadownloads import request_user_data_download
  13. from ...models import Ban, DataDownload, Rank
  14. from ...test import create_test_user
  15. from ...utils import hash_email
  16. User = get_user_model()
  17. def test_link_is_registered_in_admin_nav(admin_client):
  18. response = admin_client.get(reverse("misago:admin:index"))
  19. assert_contains(response, reverse("misago:admin:users:accounts:index"))
  20. def test_list_renders_with_item(admin_client, users_admin_link, superuser):
  21. response = admin_client.get(users_admin_link)
  22. assert_contains(response, superuser.username)
  23. def test_new_user_form_renders(admin_client):
  24. response = admin_client.get(reverse("misago:admin:users:accounts:new"))
  25. assert response.status_code == 200
  26. def test_new_user_can_be_created(admin_client):
  27. default_rank = Rank.objects.get_default()
  28. authenticated_role = Role.objects.get(special_role="authenticated")
  29. admin_client.post(
  30. reverse("misago:admin:users:accounts:new"),
  31. data={
  32. "username": "User",
  33. "rank": str(default_rank.pk),
  34. "roles": str(authenticated_role.pk),
  35. "email": "user@example.com",
  36. "new_password": "pass123",
  37. "staff_level": "0",
  38. },
  39. )
  40. user = User.objects.get_by_email("user@example.com")
  41. assert user.username == "User"
  42. assert user.rank == default_rank
  43. assert authenticated_role in user.roles.all()
  44. assert user.check_password("pass123")
  45. assert not user.is_staff
  46. assert not user.is_superuser
  47. def test_new_user_can_be_created_with_whitespace_around_password(admin_client):
  48. default_rank = Rank.objects.get_default()
  49. authenticated_role = Role.objects.get(special_role="authenticated")
  50. admin_client.post(
  51. reverse("misago:admin:users:accounts:new"),
  52. data={
  53. "username": "User",
  54. "rank": str(default_rank.pk),
  55. "roles": str(authenticated_role.pk),
  56. "email": "user@example.com",
  57. "new_password": " pass123 ",
  58. "staff_level": "0",
  59. },
  60. )
  61. user = User.objects.get_by_email("user@example.com")
  62. assert user.check_password(" pass123 ")
  63. def test_new_user_creation_fails_because_user_was_not_given_authenticated_role(
  64. admin_client
  65. ):
  66. default_rank = Rank.objects.get_default()
  67. guest_role = Role.objects.get(special_role="anonymous")
  68. admin_client.post(
  69. reverse("misago:admin:users:accounts:new"),
  70. data={
  71. "username": "User",
  72. "rank": str(default_rank.pk),
  73. "roles": str(guest_role.pk),
  74. "email": "user@example.com",
  75. "new_password": "pass123",
  76. "staff_level": "0",
  77. },
  78. )
  79. with pytest.raises(User.DoesNotExist):
  80. User.objects.get_by_email("user@example.com")
  81. def test_edit_user_form_renders(admin_client, user):
  82. response = admin_client.get(
  83. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk})
  84. )
  85. assert response.status_code == 200
  86. def test_edit_user_form_renders_for_staff_user(staff_client, user):
  87. response = staff_client.get(
  88. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk})
  89. )
  90. assert response.status_code == 200
  91. def test_edit_staff_form_renders_for_staff_user(staff_client, other_staffuser):
  92. response = staff_client.get(
  93. reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_staffuser.pk})
  94. )
  95. assert response.status_code == 200
  96. def test_edit_superuser_form_renders_for_staff_user(staff_client, superuser):
  97. response = staff_client.get(
  98. reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk})
  99. )
  100. assert response.status_code == 200
  101. def get_default_edit_form_data(user):
  102. default_rank = Rank.objects.get_default()
  103. authenticated_role = Role.objects.get(special_role="authenticated")
  104. data = {
  105. "username": user.username,
  106. "rank": str(user.rank_id),
  107. "roles": str(user.roles.all()[0].id),
  108. "email": user.email,
  109. "new_password": "",
  110. "signature": user.signature,
  111. "is_signature_locked": str(user.is_signature_locked),
  112. "is_hiding_presence": str(user.is_hiding_presence),
  113. "limits_private_thread_invites_to": str(user.limits_private_thread_invites_to),
  114. "signature_lock_staff_message": str(user.signature_lock_staff_message or ""),
  115. "signature_lock_user_message": str(user.signature_lock_user_message or ""),
  116. "subscribe_to_started_threads": str(user.subscribe_to_started_threads),
  117. "subscribe_to_replied_threads": str(user.subscribe_to_replied_threads),
  118. "is_active": "1",
  119. }
  120. if user.is_staff:
  121. data["is_staff"] = "1"
  122. if user.is_superuser:
  123. data["is_superuser"] = "1"
  124. return data
  125. def test_edit_form_changes_user_username(admin_client, user):
  126. form_data = get_default_edit_form_data(user)
  127. form_data["username"] = "NewUsername"
  128. response = admin_client.post(
  129. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  130. data=form_data,
  131. )
  132. user.refresh_from_db()
  133. assert user.username == "NewUsername"
  134. assert user.slug == "newusername"
  135. def test_editing_user_username_creates_entry_in_username_history(admin_client, user):
  136. form_data = get_default_edit_form_data(user)
  137. form_data["username"] = "NewUsername"
  138. response = admin_client.post(
  139. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  140. data=form_data,
  141. )
  142. assert user.namechanges.exists()
  143. def test_edit_form_changes_user_email(admin_client, user):
  144. form_data = get_default_edit_form_data(user)
  145. form_data["email"] = "edited@example.com"
  146. response = admin_client.post(
  147. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  148. data=form_data,
  149. )
  150. user.refresh_from_db()
  151. assert user.email == "edited@example.com"
  152. assert user.email_hash == hash_email("edited@example.com")
  153. def test_staff_user_cannot_degrade_superuser_to_staff_user(staff_client, superuser):
  154. form_data = get_default_edit_form_data(superuser)
  155. form_data["is_staff"] = "1"
  156. form_data.pop("is_superuser")
  157. response = staff_client.post(
  158. reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
  159. data=form_data,
  160. )
  161. superuser.refresh_from_db()
  162. assert superuser.is_staff
  163. assert superuser.is_superuser
  164. def test_staff_user_cannot_degrade_superuser_to_regular_user(staff_client, superuser):
  165. form_data = get_default_edit_form_data(superuser)
  166. form_data.pop("is_staff")
  167. form_data.pop("is_superuser")
  168. response = staff_client.post(
  169. reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
  170. data=form_data,
  171. )
  172. superuser.refresh_from_db()
  173. assert superuser.is_staff
  174. assert superuser.is_superuser
  175. def test_staff_user_cannot_promote_other_staff_user_to_superuser(
  176. staff_client, other_staffuser
  177. ):
  178. form_data = get_default_edit_form_data(other_staffuser)
  179. form_data["is_staff"] = "1"
  180. form_data["is_superuser"] = "1"
  181. response = staff_client.post(
  182. reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_staffuser.pk}),
  183. data=form_data,
  184. )
  185. other_staffuser.refresh_from_db()
  186. assert other_staffuser.is_staff
  187. assert not other_staffuser.is_superuser
  188. def test_staff_user_cannot_promote_regular_user_to_staff(staff_client, user):
  189. form_data = get_default_edit_form_data(user)
  190. form_data["is_staff"] = "1"
  191. response = staff_client.post(
  192. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  193. data=form_data,
  194. )
  195. user.refresh_from_db()
  196. assert not user.is_staff
  197. def test_staff_user_cannot_promote_regular_user_to_superuser(staff_client, user):
  198. form_data = get_default_edit_form_data(user)
  199. form_data["is_superuser"] = "1"
  200. response = staff_client.post(
  201. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  202. data=form_data,
  203. )
  204. user.refresh_from_db()
  205. assert not user.is_superuser
  206. def test_staff_user_cannot_promote_themselves_to_superuser(staff_client, staffuser):
  207. form_data = get_default_edit_form_data(staffuser)
  208. form_data["is_superuser"] = "1"
  209. response = staff_client.post(
  210. reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
  211. data=form_data,
  212. )
  213. staffuser.refresh_from_db()
  214. assert not staffuser.is_superuser
  215. def test_staff_user_cannot_degrade_themselves_to_regular_user(staff_client, staffuser):
  216. form_data = get_default_edit_form_data(staffuser)
  217. form_data.pop("is_staff")
  218. response = staff_client.post(
  219. reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
  220. data=form_data,
  221. )
  222. staffuser.refresh_from_db()
  223. assert staffuser.is_staff
  224. def test_superuser_cannot_degrade_themselves_to_staff_user(admin_client, superuser):
  225. form_data = get_default_edit_form_data(superuser)
  226. form_data.pop("is_superuser")
  227. response = admin_client.post(
  228. reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
  229. data=form_data,
  230. )
  231. superuser.refresh_from_db()
  232. assert superuser.is_superuser
  233. def test_superuser_cannot_degrade_themselves_to_regular_user(admin_client, superuser):
  234. form_data = get_default_edit_form_data(superuser)
  235. form_data.pop("is_staff")
  236. form_data.pop("is_superuser")
  237. response = admin_client.post(
  238. reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
  239. data=form_data,
  240. )
  241. superuser.refresh_from_db()
  242. assert superuser.is_staff
  243. assert superuser.is_superuser
  244. def test_superuser_can_degrade_other_superuser_to_staff_user(
  245. admin_client, other_superuser
  246. ):
  247. form_data = get_default_edit_form_data(other_superuser)
  248. form_data.pop("is_superuser")
  249. response = admin_client.post(
  250. reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_superuser.pk}),
  251. data=form_data,
  252. )
  253. other_superuser.refresh_from_db()
  254. assert other_superuser.is_staff
  255. assert not other_superuser.is_superuser
  256. def test_superuser_can_degrade_other_superuser_to_regular_user(
  257. admin_client, other_superuser
  258. ):
  259. form_data = get_default_edit_form_data(other_superuser)
  260. form_data.pop("is_staff")
  261. form_data.pop("is_superuser")
  262. response = admin_client.post(
  263. reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_superuser.pk}),
  264. data=form_data,
  265. )
  266. other_superuser.refresh_from_db()
  267. assert not other_superuser.is_staff
  268. assert not other_superuser.is_superuser
  269. def test_superuser_can_promote_to_staff_user_to_superuser(admin_client, staffuser):
  270. form_data = get_default_edit_form_data(staffuser)
  271. form_data["is_superuser"] = "1"
  272. response = admin_client.post(
  273. reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
  274. data=form_data,
  275. )
  276. staffuser.refresh_from_db()
  277. assert staffuser.is_staff
  278. assert staffuser.is_superuser
  279. def test_superuser_can_promote_to_regular_user_to_staff_user(admin_client, user):
  280. form_data = get_default_edit_form_data(user)
  281. form_data["is_staff"] = "1"
  282. response = admin_client.post(
  283. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  284. data=form_data,
  285. )
  286. user.refresh_from_db()
  287. assert user.is_staff
  288. assert not user.is_superuser
  289. def test_superuser_can_promote_to_regular_user_to_superuser(admin_client, user):
  290. form_data = get_default_edit_form_data(user)
  291. form_data["is_staff"] = "1"
  292. form_data["is_superuser"] = "1"
  293. response = admin_client.post(
  294. reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
  295. data=form_data,
  296. )
  297. user.refresh_from_db()
  298. assert user.is_staff
  299. assert user.is_superuser
  300. class UserAdminTests(AdminTestCase):
  301. def test_edit_view(self):
  302. """edit user view changes account"""
  303. test_user = create_test_user("User", "user@example.com")
  304. test_link = reverse(
  305. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  306. )
  307. response = self.client.get(test_link)
  308. self.assertEqual(response.status_code, 200)
  309. response = self.client.post(
  310. test_link,
  311. data={
  312. "username": "NewUsername",
  313. "rank": str(test_user.rank_id),
  314. "roles": str(test_user.roles.all()[0].pk),
  315. "email": "edited@example.com",
  316. "new_password": "newpass123",
  317. "staff_level": "0",
  318. "signature": "Hello world!",
  319. "is_signature_locked": "1",
  320. "is_hiding_presence": "0",
  321. "limits_private_thread_invites_to": "0",
  322. "signature_lock_staff_message": "Staff message",
  323. "signature_lock_user_message": "User message",
  324. "subscribe_to_started_threads": "2",
  325. "subscribe_to_replied_threads": "2",
  326. },
  327. )
  328. self.assertEqual(response.status_code, 302)
  329. updated_user = User.objects.get(pk=test_user.pk)
  330. self.assertTrue(updated_user.check_password("newpass123"))
  331. self.assertEqual(updated_user.username, "NewUsername")
  332. self.assertEqual(updated_user.slug, "newusername")
  333. User.objects.get_by_username("NewUsername")
  334. User.objects.get_by_email("edited@example.com")
  335. def test_edit_dont_change_username(self):
  336. """
  337. If username wasn't changed, don't touch user's username, slug or history
  338. This is regression test for issue #640
  339. """
  340. test_user = create_test_user("User", "user@example.com")
  341. test_link = reverse(
  342. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  343. )
  344. response = self.client.get(test_link)
  345. self.assertEqual(response.status_code, 200)
  346. response = self.client.post(
  347. test_link,
  348. data={
  349. "username": "User",
  350. "rank": str(test_user.rank_id),
  351. "roles": str(test_user.roles.all()[0].pk),
  352. "email": "edited@example.com",
  353. "signature": "Hello world!",
  354. "is_signature_locked": "1",
  355. "is_hiding_presence": "0",
  356. "limits_private_thread_invites_to": "0",
  357. "signature_lock_staff_message": "Staff message",
  358. "signature_lock_user_message": "User message",
  359. "subscribe_to_started_threads": "2",
  360. "subscribe_to_replied_threads": "2",
  361. },
  362. )
  363. self.assertEqual(response.status_code, 302)
  364. updated_user = User.objects.get(pk=test_user.pk)
  365. self.assertEqual(updated_user.username, "User")
  366. self.assertEqual(updated_user.slug, "user")
  367. self.assertEqual(updated_user.namechanges.count(), 0)
  368. def test_edit_change_password_whitespaces(self):
  369. """edit user view changes account password to include whitespaces"""
  370. test_user = create_test_user("User", "user@example.com")
  371. test_link = reverse(
  372. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  373. )
  374. response = self.client.get(test_link)
  375. self.assertEqual(response.status_code, 200)
  376. response = self.client.post(
  377. test_link,
  378. data={
  379. "username": "NewUsername",
  380. "rank": str(test_user.rank_id),
  381. "roles": str(test_user.roles.all()[0].pk),
  382. "email": "edited@example.com",
  383. "new_password": " newpass123 ",
  384. "staff_level": "0",
  385. "signature": "Hello world!",
  386. "is_signature_locked": "1",
  387. "is_hiding_presence": "0",
  388. "limits_private_thread_invites_to": "0",
  389. "signature_lock_staff_message": "Staff message",
  390. "signature_lock_user_message": "User message",
  391. "subscribe_to_started_threads": "2",
  392. "subscribe_to_replied_threads": "2",
  393. },
  394. )
  395. self.assertEqual(response.status_code, 302)
  396. updated_user = User.objects.get(pk=test_user.pk)
  397. self.assertTrue(updated_user.check_password(" newpass123 "))
  398. self.assertEqual(updated_user.username, "NewUsername")
  399. self.assertEqual(updated_user.slug, "newusername")
  400. User.objects.get_by_username("NewUsername")
  401. User.objects.get_by_email("edited@example.com")
  402. def test_edit_disable_user(self):
  403. """edit user view allows admin to disable non admin"""
  404. self.user.is_superuser = False
  405. self.user.save()
  406. test_user = create_test_user("User", "user@example.com")
  407. test_link = reverse(
  408. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  409. )
  410. response = self.client.get(test_link)
  411. self.assertContains(response, 'id="id_is_active_1"')
  412. self.assertContains(response, 'id="id_is_active_staff_message"')
  413. response = self.client.post(
  414. test_link,
  415. data={
  416. "username": "NewUsername",
  417. "rank": str(test_user.rank_id),
  418. "roles": str(test_user.roles.all()[0].pk),
  419. "email": "edited@example.com",
  420. "is_staff": "0",
  421. "is_superuser": "0",
  422. "signature": "Hello world!",
  423. "is_signature_locked": "1",
  424. "is_hiding_presence": "0",
  425. "limits_private_thread_invites_to": "0",
  426. "signature_lock_staff_message": "Staff message",
  427. "signature_lock_user_message": "User message",
  428. "subscribe_to_started_threads": "2",
  429. "subscribe_to_replied_threads": "2",
  430. "is_active": "0",
  431. "is_active_staff_message": "Disabled in test!",
  432. },
  433. )
  434. self.assertEqual(response.status_code, 302)
  435. updated_user = User.objects.get(pk=test_user.pk)
  436. self.assertFalse(updated_user.is_active)
  437. self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
  438. def test_edit_superuser_disable_admin(self):
  439. """edit user view allows admin to disable non admin"""
  440. self.user.is_superuser = True
  441. self.user.save()
  442. test_user = create_test_user("User", "user@example.com")
  443. test_user.is_staff = True
  444. test_user.save()
  445. test_link = reverse(
  446. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  447. )
  448. response = self.client.get(test_link)
  449. self.assertContains(response, 'id="id_is_active_1"')
  450. self.assertContains(response, 'id="id_is_active_staff_message"')
  451. response = self.client.post(
  452. test_link,
  453. data={
  454. "username": "NewUsername",
  455. "rank": str(test_user.rank_id),
  456. "roles": str(test_user.roles.all()[0].pk),
  457. "email": "edited@example.com",
  458. "is_staff": "1",
  459. "is_superuser": "0",
  460. "signature": "Hello world!",
  461. "is_signature_locked": "1",
  462. "is_hiding_presence": "0",
  463. "limits_private_thread_invites_to": "0",
  464. "signature_lock_staff_message": "Staff message",
  465. "signature_lock_user_message": "User message",
  466. "subscribe_to_started_threads": "2",
  467. "subscribe_to_replied_threads": "2",
  468. "is_active": "0",
  469. "is_active_staff_message": "Disabled in test!",
  470. },
  471. )
  472. self.assertEqual(response.status_code, 302)
  473. updated_user = User.objects.get(pk=test_user.pk)
  474. self.assertFalse(updated_user.is_active)
  475. self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
  476. def test_edit_admin_cant_disable_admin(self):
  477. """edit user view disallows admin to disable admin"""
  478. self.user.is_superuser = False
  479. self.user.save()
  480. test_user = create_test_user("User", "user@example.com")
  481. test_user.is_staff = True
  482. test_user.save()
  483. test_link = reverse(
  484. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  485. )
  486. response = self.client.get(test_link)
  487. self.assertNotContains(response, 'id="id_is_active_1"')
  488. self.assertNotContains(response, 'id="id_is_active_staff_message"')
  489. response = self.client.post(
  490. test_link,
  491. data={
  492. "username": "NewUsername",
  493. "rank": str(test_user.rank_id),
  494. "roles": str(test_user.roles.all()[0].pk),
  495. "email": "edited@example.com",
  496. "is_staff": "1",
  497. "is_superuser": "0",
  498. "signature": "Hello world!",
  499. "is_signature_locked": "1",
  500. "is_hiding_presence": "0",
  501. "limits_private_thread_invites_to": "0",
  502. "signature_lock_staff_message": "Staff message",
  503. "signature_lock_user_message": "User message",
  504. "subscribe_to_started_threads": "2",
  505. "subscribe_to_replied_threads": "2",
  506. "is_active": "0",
  507. "is_active_staff_message": "Disabled in test!",
  508. },
  509. )
  510. self.assertEqual(response.status_code, 302)
  511. updated_user = User.objects.get(pk=test_user.pk)
  512. self.assertTrue(updated_user.is_active)
  513. self.assertFalse(updated_user.is_active_staff_message)
  514. def test_edit_is_deleting_account_cant_reactivate(self):
  515. """users deleting own accounts can't be reactivated"""
  516. test_user = create_test_user("User", "user@example.com")
  517. test_user.mark_for_delete()
  518. test_link = reverse(
  519. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  520. )
  521. response = self.client.get(test_link)
  522. self.assertNotContains(response, 'id="id_is_active_1"')
  523. self.assertNotContains(response, 'id="id_is_active_staff_message"')
  524. response = self.client.post(
  525. test_link,
  526. data={
  527. "username": "NewUsername",
  528. "rank": str(test_user.rank_id),
  529. "roles": str(test_user.roles.all()[0].pk),
  530. "email": "edited@example.com",
  531. "is_staff": "1",
  532. "is_superuser": "0",
  533. "signature": "Hello world!",
  534. "is_signature_locked": "1",
  535. "is_hiding_presence": "0",
  536. "limits_private_thread_invites_to": "0",
  537. "signature_lock_staff_message": "Staff message",
  538. "signature_lock_user_message": "User message",
  539. "subscribe_to_started_threads": "2",
  540. "subscribe_to_replied_threads": "2",
  541. "is_active": "1",
  542. },
  543. )
  544. self.assertEqual(response.status_code, 302)
  545. updated_user = User.objects.get(pk=test_user.pk)
  546. self.assertFalse(updated_user.is_active)
  547. self.assertTrue(updated_user.is_deleting_account)
  548. def test_edit_unusable_password(self):
  549. """admin edit form handles unusable passwords and lets setting new password"""
  550. test_user = create_test_user("User", "user@example.com")
  551. self.assertFalse(test_user.has_usable_password())
  552. test_link = reverse(
  553. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  554. )
  555. response = self.client.get(test_link)
  556. self.assertContains(response, "alert-has-unusable-password")
  557. response = self.client.post(
  558. test_link,
  559. data={
  560. "username": "NewUsername",
  561. "rank": str(test_user.rank_id),
  562. "roles": str(test_user.roles.all()[0].pk),
  563. "email": "edited@example.com",
  564. "new_password": "pass123",
  565. "is_staff": "1",
  566. "is_superuser": "0",
  567. "signature": "Hello world!",
  568. "is_signature_locked": "1",
  569. "is_hiding_presence": "0",
  570. "limits_private_thread_invites_to": "0",
  571. "signature_lock_staff_message": "Staff message",
  572. "signature_lock_user_message": "User message",
  573. "subscribe_to_started_threads": "2",
  574. "subscribe_to_replied_threads": "2",
  575. "is_active": "1",
  576. },
  577. )
  578. self.assertEqual(response.status_code, 302)
  579. updated_user = User.objects.get(pk=test_user.pk)
  580. self.assertTrue(updated_user.has_usable_password())
  581. def test_edit_keep_unusable_password(self):
  582. """
  583. admin edit form handles unusable passwords and lets admin leave them unchanged
  584. """
  585. test_user = create_test_user("User", "user@example.com")
  586. self.assertFalse(test_user.has_usable_password())
  587. test_link = reverse(
  588. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  589. )
  590. response = self.client.get(test_link)
  591. self.assertContains(response, "alert-has-unusable-password")
  592. response = self.client.post(
  593. test_link,
  594. data={
  595. "username": "NewUsername",
  596. "rank": str(test_user.rank_id),
  597. "roles": str(test_user.roles.all()[0].pk),
  598. "email": "edited@example.com",
  599. "is_staff": "1",
  600. "is_superuser": "0",
  601. "signature": "Hello world!",
  602. "is_signature_locked": "1",
  603. "is_hiding_presence": "0",
  604. "limits_private_thread_invites_to": "0",
  605. "signature_lock_staff_message": "Staff message",
  606. "signature_lock_user_message": "User message",
  607. "subscribe_to_started_threads": "2",
  608. "subscribe_to_replied_threads": "2",
  609. "is_active": "1",
  610. },
  611. )
  612. self.assertEqual(response.status_code, 302)
  613. updated_user = User.objects.get(pk=test_user.pk)
  614. self.assertFalse(updated_user.has_usable_password())
  615. def test_edit_agreements_list(self):
  616. """edit view displays list of user's agreements"""
  617. test_user = create_test_user("User", "user@example.com")
  618. test_link = reverse(
  619. "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
  620. )
  621. agreement = Agreement.objects.create(
  622. type=Agreement.TYPE_TOS,
  623. title="Test agreement!",
  624. text="Lorem ipsum!",
  625. is_active=True,
  626. )
  627. response = self.client.get(test_link)
  628. self.assertEqual(response.status_code, 200)
  629. self.assertNotContains(response, agreement.title)
  630. save_user_agreement_acceptance(test_user, agreement, commit=True)
  631. response = self.client.get(test_link)
  632. self.assertEqual(response.status_code, 200)
  633. self.assertContains(response, agreement.title)