6
6
from django .contrib .auth import get_user_model
7
7
from django .contrib .auth .models import Permission
8
8
from django .contrib .messages .storage .fallback import FallbackStorage
9
- from django .shortcuts import get_object_or_404
10
9
from django .test import TestCase
11
10
from django .test .client import RequestFactory
12
11
from django .test .utils import override_settings
16
15
from simple_history .admin import SimpleHistoryAdmin
17
16
from simple_history .models import HistoricalRecords
18
17
from simple_history .tests .external .models import ExternalModelWithCustomUserIdField
19
- from simple_history .tests .tests .utils import middleware_override_settings
18
+ from simple_history .tests .tests .utils import (
19
+ PermissionAction ,
20
+ middleware_override_settings ,
21
+ )
20
22
21
23
from ..models import (
22
24
Book ,
@@ -737,28 +739,44 @@ def test_history_form_view_accepts_additional_context(self):
737
739
request , admin .object_history_form_template , context
738
740
)
739
741
740
- def test_history_view__title_suggests_revert_by_default (self ):
741
- self .login ()
742
+ def assert_history_view_response_contains (
743
+ self , user = None , * , title_prefix : PermissionAction , choose_date : bool
744
+ ):
745
+ user = user or self .user
746
+ user = User .objects .get (pk = user .pk ) # refresh perms cache
747
+ self .login (user )
742
748
planet = Planet .objects .create (star = "Sun" )
743
749
response = self .client .get (get_history_url (planet ))
744
- self .assertContains (response , "Change history: Sun" )
750
+ self .assertEqual (response .status_code , 200 )
751
+ # `count=None` means at least once
752
+ self .assertContains (
753
+ response ,
754
+ "Change history: Sun" ,
755
+ count = None if title_prefix == PermissionAction .CHANGE else 0 ,
756
+ )
757
+ self .assertContains (
758
+ response ,
759
+ "View history: Sun" ,
760
+ count = None if title_prefix == PermissionAction .VIEW else 0 ,
761
+ )
762
+ self .assertContains (response , "Choose a date" , count = None if choose_date else 0 )
763
+
764
+ def test_history_view__title_suggests_revert_by_default (self ):
765
+ self .assert_history_view_response_contains (
766
+ title_prefix = PermissionAction .CHANGE , choose_date = True
767
+ )
745
768
746
769
@override_settings (SIMPLE_HISTORY_REVERT_DISABLED = False )
747
770
def test_history_view__title_suggests_revert (self ):
748
- self .login ()
749
- planet = Planet .objects .create (star = "Sun" )
750
- response = self .client .get (get_history_url (planet ))
751
- self .assertContains (response , "Change history: Sun" )
752
- self .assertContains (response , "Choose a date" )
771
+ self .assert_history_view_response_contains (
772
+ title_prefix = PermissionAction .CHANGE , choose_date = True
773
+ )
753
774
754
775
@override_settings (SIMPLE_HISTORY_REVERT_DISABLED = True )
755
776
def test_history_view__title_suggests_view_only (self ):
756
- self .login ()
757
- planet = Planet .objects .create (star = "Sun" )
758
- response = self .client .get (get_history_url (planet ))
759
- self .assertNotContains (response , "Change history: Sun" )
760
- self .assertNotContains (response , "Choose a date" )
761
- self .assertContains (response , "View history: Sun" )
777
+ self .assert_history_view_response_contains (
778
+ title_prefix = PermissionAction .VIEW , choose_date = False
779
+ )
762
780
763
781
def test_history_form_view__shows_revert_button_by_default (self ):
764
782
self .login ()
@@ -786,71 +804,51 @@ def test_history_form_view__does_not_show_revert_button(self):
786
804
self .assertContains (response , "View Planet" )
787
805
self .assertContains (response , "View Sun" )
788
806
789
- @override_settings (SIMPLE_HISTORY_REVERT_DISABLED = True )
790
- def test_history_view_with_view_only_permissions_and_norevert (self ):
791
- user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
792
- user .user_permissions .add (Permission .objects .get (codename = "view_planet" ))
793
- user .user_permissions .add (
794
- Permission .objects .get (codename = "view_historicalplanet" )
795
- )
796
- user = get_object_or_404 (User , pk = user .id )
797
- self .client .force_login (user )
798
- planet = Planet .objects .create (star = "Sun" )
799
- response = self .client .get (get_history_url (planet ))
800
- self .assertEqual (200 , response .status_code )
801
- self .assertNotContains (response , "Change history: Sun" )
802
- self .assertNotContains (response , "Choose a date" )
803
- self .assertContains (response , "View history: Sun" )
804
-
805
- def test_history_view___view_only_permissions_and_revert_enabled (self ):
807
+ def _test_history_view_response_text_with_revert_disabled (self , * , disabled ):
806
808
user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
807
809
user .user_permissions .add (
808
810
Permission .objects .get (codename = "view_planet" ),
809
811
Permission .objects .get (codename = "view_historicalplanet" ),
810
812
)
811
- user = get_object_or_404 (User , pk = user .id )
812
- self .client .force_login (user )
813
- planet = Planet .objects .create (star = "Sun" )
814
- response = self .client .get (get_history_url (planet ))
815
- self .assertEqual (200 , response .status_code )
816
- self .assertNotContains (response , "Change history: Sun" )
817
- self .assertNotContains (response , "Choose a date" )
818
- self .assertContains (response , "View history: Sun" )
813
+ self .assert_history_view_response_contains (
814
+ user , title_prefix = PermissionAction .VIEW , choose_date = False
815
+ )
819
816
820
- def test_history_view__view_change_permissions_and_revert_enabled (self ):
821
- user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
817
+ user .user_permissions .clear ()
822
818
user .user_permissions .add (
823
819
Permission .objects .get (codename = "view_planet" ),
824
820
Permission .objects .get (codename = "change_planet" ),
825
821
)
826
- user = get_object_or_404 (User , pk = user .id )
827
- self .client .force_login (user )
828
- planet = Planet .objects .create (star = "Sun" )
829
- response = self .client .get (get_history_url (planet ))
830
- self .assertEqual (200 , response .status_code )
831
- self .assertContains (response , "Change history: Sun" )
832
- self .assertContains (response , "Choose a date" )
833
- self .assertNotContains (response , "View history: Sun" )
822
+ self .assert_history_view_response_contains (
823
+ user ,
824
+ title_prefix = PermissionAction .VIEW if disabled else PermissionAction .CHANGE ,
825
+ choose_date = not disabled ,
826
+ )
827
+
828
+ @override_settings (SIMPLE_HISTORY_REVERT_DISABLED = True )
829
+ def test_history_view_response_text__revert_disabled (self ):
830
+ self ._test_history_view_response_text_with_revert_disabled (disabled = True )
831
+
832
+ def test_history_view_response_text__revert_enabled (self ):
833
+ self ._test_history_view_response_text_with_revert_disabled (disabled = False )
834
834
835
835
@override_settings (SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True )
836
836
def test_history_form_view__no_perms_enforce_history_permissions (self ):
837
837
user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
838
- user = get_object_or_404 ( User , pk = user .id )
838
+ user = User . objects . get ( pk = user .pk ) # refresh perms cache
839
839
self .client .force_login (user )
840
840
planet = Planet .objects .create (star = "Sun" )
841
841
response = self .client .get (get_history_url (planet , 0 ))
842
- self .assertEqual (403 , response .status_code )
842
+ self .assertEqual (response .status_code , 403 )
843
843
844
- @override_settings (
845
- SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True ,
846
- )
844
+ @override_settings (SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True )
847
845
def test_history_view__no_perms_enforce_history_permissions (self ):
848
846
user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
849
- user = get_object_or_404 ( User , pk = user .id )
847
+ user = User . objects . get ( pk = user .pk ) # refresh perms cache
850
848
self .client .force_login (user )
851
849
planet = Planet .objects .create (star = "Sun" )
852
850
resp = self .client .get (get_history_url (planet ))
853
- self .assertEqual (403 , resp .status_code )
851
+ self .assertEqual (resp .status_code , 403 )
854
852
855
853
@override_settings (
856
854
SIMPLE_HISTORY_REVERT_DISABLED = False ,
@@ -861,21 +859,15 @@ def test_history_view__enforce_history_permissions_and_revert_enabled(self):
861
859
user .user_permissions .add (
862
860
Permission .objects .get (codename = "view_historicalplanet" ),
863
861
)
864
- user = get_object_or_404 (User , pk = user .id )
865
- self .client .force_login (user )
866
- planet = Planet .objects .create (star = "Sun" )
867
- resp = self .client .get (get_history_url (planet ))
868
- self .assertEqual (200 , resp .status_code )
869
- self .assertNotContains (resp , "Change history: Sun" )
870
- self .assertNotContains (resp , "Choose a date" )
871
- self .assertContains (resp , "View history: Sun" )
862
+ self .assert_history_view_response_contains (
863
+ user , title_prefix = PermissionAction .VIEW , choose_date = False
864
+ )
872
865
873
- @override_settings (SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True )
874
- def test_permission_combos__enforce_history_permissions (self ):
866
+ def _test_permission_combos_with_enforce_history_permissions (self , * , enforced ):
875
867
user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
876
868
877
869
def get_request (usr ):
878
- usr = get_object_or_404 ( User , pk = usr .id ) # refresh perms cache
870
+ usr = User . objects . get ( pk = usr .pk ) # refresh perms cache
879
871
req = RequestFactory ().post ("/" )
880
872
req .session = "session"
881
873
req ._messages = FallbackStorage (req )
@@ -884,18 +876,19 @@ def get_request(usr):
884
876
885
877
admin_site = AdminSite ()
886
878
admin = SimpleHistoryAdmin (Planet , admin_site )
879
+
887
880
# no perms
888
- self .assertFalse (admin .has_view_history_permission (get_request (user )))
881
+ request = get_request (user )
882
+ self .assertFalse (admin .has_view_history_permission (request ))
889
883
890
884
# has concrete view/change only -> view_historical is false
891
885
user .user_permissions .clear ()
892
886
user .user_permissions .add (
893
887
Permission .objects .get (codename = "view_planet" ),
894
888
Permission .objects .get (codename = "change_planet" ),
895
889
)
896
- admin_site = AdminSite ()
897
- admin = SimpleHistoryAdmin (Planet , admin_site )
898
- self .assertFalse (admin .has_view_history_permission (get_request (user )))
890
+ request = get_request (user )
891
+ self .assertEqual (admin .has_view_history_permission (request ), not enforced )
899
892
900
893
# has concrete view/change and historical change -> view_history is false
901
894
user .user_permissions .clear ()
@@ -904,9 +897,8 @@ def get_request(usr):
904
897
Permission .objects .get (codename = "change_planet" ),
905
898
Permission .objects .get (codename = "change_historicalplanet" ),
906
899
)
907
- admin_site = AdminSite ()
908
- admin = SimpleHistoryAdmin (Planet , admin_site )
909
- self .assertFalse (admin .has_view_history_permission (get_request (user )))
900
+ request = get_request (user )
901
+ self .assertEqual (admin .has_view_history_permission (request ), not enforced )
910
902
911
903
# has concrete view/change and historical view/change -> view_history is true
912
904
user .user_permissions .clear ()
@@ -916,73 +908,20 @@ def get_request(usr):
916
908
Permission .objects .get (codename = "view_historicalplanet" ),
917
909
Permission .objects .get (codename = "change_historicalplanet" ),
918
910
)
919
- admin_site = AdminSite ()
920
- admin = SimpleHistoryAdmin (Planet , admin_site )
921
- self .assertTrue (admin .has_view_history_permission (get_request (user )))
911
+ request = get_request (user )
912
+ self .assertTrue (admin .has_view_history_permission (request ))
922
913
923
914
# has historical view only -> view_history is true
924
915
user .user_permissions .clear ()
925
916
user .user_permissions .add (
926
917
Permission .objects .get (codename = "view_historicalplanet" ),
927
918
)
928
- admin_site = AdminSite ()
929
- admin = SimpleHistoryAdmin (Planet , admin_site )
930
- self .assertTrue (admin .has_view_history_permission (get_request (user )))
931
-
932
- def test_permission_combos__default (self ):
933
- user = User .objects .create (username = "astronomer" , is_staff = True , is_active = True )
934
-
935
- def get_request (usr ):
936
- usr = get_object_or_404 (User , pk = usr .id ) # refresh perms cache
937
- req = RequestFactory ().post ("/" )
938
- req .session = "session"
939
- req ._messages = FallbackStorage (req )
940
- req .user = usr
941
- return req
942
-
943
- admin_site = AdminSite ()
944
- admin = SimpleHistoryAdmin (Planet , admin_site )
945
- # no perms
946
- self .assertFalse (admin .has_view_history_permission (get_request (user )))
947
-
948
- # has concrete view/change only -> view_historical is false
949
- user .user_permissions .clear ()
950
- user .user_permissions .add (
951
- Permission .objects .get (codename = "view_planet" ),
952
- Permission .objects .get (codename = "change_planet" ),
953
- )
954
- admin_site = AdminSite ()
955
- admin = SimpleHistoryAdmin (Planet , admin_site )
956
- self .assertTrue (admin .has_view_history_permission (get_request (user )))
957
-
958
- # has concrete view/change and historical change -> view_history is false
959
- user .user_permissions .clear ()
960
- user .user_permissions .add (
961
- Permission .objects .get (codename = "view_planet" ),
962
- Permission .objects .get (codename = "change_planet" ),
963
- Permission .objects .get (codename = "change_historicalplanet" ),
964
- )
965
- admin_site = AdminSite ()
966
- admin = SimpleHistoryAdmin (Planet , admin_site )
967
- self .assertTrue (admin .has_view_history_permission (get_request (user )))
919
+ request = get_request (user )
920
+ self .assertEqual (admin .has_view_history_permission (request ), enforced )
968
921
969
- # has concrete view/change and historical view/change -> view_history is true
970
- user .user_permissions .clear ()
971
- user .user_permissions .add (
972
- Permission .objects .get (codename = "view_planet" ),
973
- Permission .objects .get (codename = "change_planet" ),
974
- Permission .objects .get (codename = "view_historicalplanet" ),
975
- Permission .objects .get (codename = "change_historicalplanet" ),
976
- )
977
- admin_site = AdminSite ()
978
- admin = SimpleHistoryAdmin (Planet , admin_site )
979
- self .assertTrue (admin .has_view_history_permission (get_request (user )))
922
+ @override_settings (SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS = True )
923
+ def test_permission_combos__enforce_history_permissions (self ):
924
+ self ._test_permission_combos_with_enforce_history_permissions (enforced = True )
980
925
981
- # has historical view only -> view_history is true
982
- user .user_permissions .clear ()
983
- user .user_permissions .add (
984
- Permission .objects .get (codename = "view_historicalplanet" ),
985
- )
986
- admin_site = AdminSite ()
987
- admin = SimpleHistoryAdmin (Planet , admin_site )
988
- self .assertFalse (admin .has_view_history_permission (get_request (user )))
926
+ def test_permission_combos__default (self ):
927
+ self ._test_permission_combos_with_enforce_history_permissions (enforced = False )
0 commit comments