1010from requests import HTTPError
1111from time import sleep
1212
13+ from .api .system_properties import get_sys_property , set_sys_property
1314from .api .ui_themes import get_workarena_theme_variants
1415from .api .user import create_user
1516from .api .utils import table_api_call , table_column_info
3839 EXPECTED_USER_FORM_FIELDS_PATH ,
3940 # Patch flag for reports
4041 REPORT_PATCH_FLAG ,
41- REPORT_DATE_FILTER ,
42- REPORT_TIME_FILTER ,
43- REPORT_FILTER_CONFIG_PATH ,
42+ REPORT_FILTER_PROPERTY ,
4443 # Supported ServiceNow releases
4544 SNOW_SUPPORTED_RELEASES ,
4645 # For workflows setup
@@ -71,53 +70,6 @@ def _is_dev_portal_instance() -> bool:
7170 return False
7271
7372
74- def _set_sys_property (property_name : str , value : str ):
75- """
76- Set a sys_property in the instance.
77-
78- """
79- instance = SNowInstance ()
80-
81- property = table_api_call (
82- instance = instance ,
83- table = "sys_properties" ,
84- params = {"sysparm_query" : f"name={ property_name } " , "sysparm_fields" : "sys_id" },
85- )["result" ]
86-
87- if not property :
88- property_sysid = ""
89- method = "POST"
90- else :
91- property_sysid = "/" + property [0 ]["sys_id" ]
92- method = "PUT"
93-
94- property = table_api_call (
95- instance = instance ,
96- table = f"sys_properties{ property_sysid } " ,
97- method = method ,
98- json = {"name" : property_name , "value" : value },
99- )
100-
101- # Verify that the property was updated
102- assert property ["result" ]["value" ] == value , f"Error setting { property_name } ."
103-
104-
105- def _get_sys_property (property_name : str ) -> str :
106- """
107- Get a sys_property from the instance.
108-
109- """
110- instance = SNowInstance ()
111-
112- property_value = table_api_call (
113- instance = instance ,
114- table = "sys_properties" ,
115- params = {"sysparm_query" : f"name={ property_name } " , "sysparm_fields" : "value" },
116- )["result" ][0 ]["value" ]
117-
118- return property_value
119-
120-
12173def _install_update_set (path : str , name : str ):
12274 """
12375 Install a ServiceNow update set
@@ -817,7 +769,9 @@ def enable_url_login():
817769 Configure the instance to allow login via URL.
818770
819771 """
820- _set_sys_property (property_name = "glide.security.restrict.get.login" , value = "false" )
772+ set_sys_property (
773+ instance = SNowInstance (), property_name = "glide.security.restrict.get.login" , value = "false"
774+ )
821775 logging .info ("URL login enabled." )
822776
823777
@@ -828,12 +782,20 @@ def disable_password_policies():
828782 Notes: this is required to allow the creation of users with weak passwords.
829783
830784 """
831- _set_sys_property (property_name = "glide.security.password.policy.enabled" , value = "false" )
832- _set_sys_property (property_name = "glide.apply.password_policy.on_login" , value = "false" )
785+ set_sys_property (
786+ instance = SNowInstance (),
787+ property_name = "glide.security.password.policy.enabled" ,
788+ value = "false" ,
789+ )
790+ set_sys_property (
791+ instance = SNowInstance (), property_name = "glide.apply.password_policy.on_login" , value = "false"
792+ )
833793 # The following is not supported on developer portal instances
834794 if not _is_dev_portal_instance ():
835- _set_sys_property (
836- property_name = "glide.authenticate.api.user.reset_password.mandatory" , value = "false"
795+ set_sys_property (
796+ instance = SNowInstance (),
797+ property_name = "glide.authenticate.api.user.reset_password.mandatory" ,
798+ value = "false" ,
837799 )
838800 logging .info ("Password policies disabled." )
839801
@@ -843,8 +805,14 @@ def disable_guided_tours():
843805 Hide guided tour popups
844806
845807 """
846- _set_sys_property (property_name = "com.snc.guided_tours.sp.enable" , value = "false" )
847- _set_sys_property (property_name = "com.snc.guided_tours.standard_ui.enable" , value = "false" )
808+ set_sys_property (
809+ instance = SNowInstance (), property_name = "com.snc.guided_tours.sp.enable" , value = "false"
810+ )
811+ set_sys_property (
812+ instance = SNowInstance (),
813+ property_name = "com.snc.guided_tours.standard_ui.enable" ,
814+ value = "false" ,
815+ )
848816 logging .info ("Guided tours disabled." )
849817
850818
@@ -862,7 +830,9 @@ def disable_analytics_popups():
862830 Disable analytics popups (needs to be done through UI since Vancouver release)
863831
864832 """
865- _set_sys_property (property_name = "glide.analytics.enabled" , value = "false" )
833+ set_sys_property (
834+ instance = SNowInstance (), property_name = "glide.analytics.enabled" , value = "false"
835+ )
866836 logging .info ("Analytics popups disabled." )
867837
868838
@@ -876,7 +846,8 @@ def setup_ui_themes():
876846 check_ui_themes_installed ()
877847
878848 logging .info ("Setting default UI theme" )
879- _set_sys_property (
849+ set_sys_property (
850+ instance = SNowInstance (),
880851 property_name = "glide.ui.polaris.theme.custom" ,
881852 value = get_workarena_theme_variants (SNowInstance ())[0 ]["theme.sys_id" ],
882853 )
@@ -920,7 +891,9 @@ def check_ui_themes_installed():
920891
921892def set_home_page ():
922893 logging .info ("Setting default home page" )
923- _set_sys_property (property_name = "glide.login.home" , value = "/now/nav/ui/home" )
894+ set_sys_property (
895+ instance = SNowInstance (), property_name = "glide.login.home" , value = "/now/nav/ui/home"
896+ )
924897
925898
926899def wipe_system_admin_preferences ():
@@ -964,24 +937,32 @@ def patch_report_filters():
964937 logging .info ("Patching reports with date filter..." )
965938
966939 instance = SNowInstance ()
940+ filter_config = instance .report_filter_config
967941
968942 # If the report date filter is already set, we use the existing values (would be the case on reinstall)
969- global REPORT_DATE_FILTER
970- global REPORT_TIME_FILTER
971- if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None :
943+ if not filter_config :
972944 # Set the report date filter to current date as YYYY-MM-DD and time filter to current time as HH:MM:SS
973945 now = datetime .now ()
974- REPORT_DATE_FILTER = now .strftime ("%Y-%m-%d" )
975- REPORT_TIME_FILTER = now .strftime ("%H:%M:%S" )
946+ report_date_filter = now .strftime ("%Y-%m-%d" )
947+ report_time_filter = now .strftime ("%H:%M:%S" )
976948 # ... save the filter config
977- with open (REPORT_FILTER_CONFIG_PATH , "w" ) as f :
978- json .dump (
979- {
980- "report_date_filter" : REPORT_DATE_FILTER ,
981- "report_time_filter" : REPORT_TIME_FILTER ,
982- },
983- f ,
984- )
949+ logging .info (
950+ f"Setting report date filter to { report_date_filter } and time filter to { report_time_filter } via { REPORT_FILTER_PROPERTY } "
951+ )
952+ set_sys_property (
953+ instance = instance ,
954+ property_name = REPORT_FILTER_PROPERTY ,
955+ value = json .dumps (
956+ {"report_date_filter" : report_date_filter , "report_time_filter" : report_time_filter }
957+ ),
958+ )
959+ else :
960+ # Use the existing configuration
961+ logging .info (
962+ f"Using existing report date filter { filter_config ['report_date_filter' ]} and time filter { filter_config ['report_time_filter' ]} "
963+ )
964+ report_date_filter = filter_config ["report_date_filter" ]
965+ report_time_filter = filter_config ["report_time_filter" ]
985966
986967 # Get all reports that are not already patched
987968 reports = table_api_call (
@@ -1005,8 +986,8 @@ def patch_report_filters():
1005986
1006987 if not is_report_filter_using_relative_time (report ["filter" ]):
1007988 # That's a report we want to keep (use date cutoff filter)
1008- filter_date = REPORT_DATE_FILTER
1009- filter_time = REPORT_TIME_FILTER
989+ filter_date = report_date_filter
990+ filter_time = report_time_filter
1010991 logging .info (
1011992 f"Keeping report { report ['title' ]} { report ['sys_id' ]} (columns: { sys_created_on_cols } )..."
1012993 )
@@ -1103,7 +1084,11 @@ def setup():
11031084
11041085 # Save installation date
11051086 logging .info ("Saving installation date" )
1106- _set_sys_property (property_name = "workarena.installation.date" , value = datetime .now ().isoformat ())
1087+ set_sys_property (
1088+ instance = SNowInstance (),
1089+ property_name = "workarena.installation.date" ,
1090+ value = datetime .now ().isoformat (),
1091+ )
11071092
11081093 logging .info ("WorkArena setup complete." )
11091094
@@ -1116,7 +1101,9 @@ def main():
11161101 logging .basicConfig (level = logging .INFO )
11171102
11181103 try :
1119- past_install_date = _get_sys_property ("workarena.installation.date" )
1104+ past_install_date = get_sys_property (
1105+ instance = SNowInstance (), property_name = "workarena.installation.date"
1106+ )
11201107 logging .info (f"Detected previous installation on { past_install_date } . Reinstalling..." )
11211108 except :
11221109 past_install_date = "never"
0 commit comments