mirror of
				https://github.com/dgtlmoon/changedetection.io.git
				synced 2025-10-31 06:37:41 +00:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
			with-error
			...
			809-global
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | a2fac93548 | ||
|   | 09c9239aab | ||
|   | 59b3bbf195 | ||
|   | aac59ab806 | ||
|   | 7ba8d44677 | ||
|   | 620b22932b | ||
|   | 03424d3419 | 
| @@ -355,6 +355,8 @@ class watchForm(commonSettingsForm): | |||||||
|     filter_failure_notification_send = BooleanField( |     filter_failure_notification_send = BooleanField( | ||||||
|         'Send a notification when the filter can no longer be found on the page', default=False) |         'Send a notification when the filter can no longer be found on the page', default=False) | ||||||
|  |  | ||||||
|  |     notification_use_default = BooleanField('Use default/system notification settings', default=True) | ||||||
|  |  | ||||||
|     def validate(self, **kwargs): |     def validate(self, **kwargs): | ||||||
|         if not super().validate(): |         if not super().validate(): | ||||||
|             return False |             return False | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ class model(dict): | |||||||
|             'notification_title': default_notification_title, |             'notification_title': default_notification_title, | ||||||
|             'notification_body': default_notification_body, |             'notification_body': default_notification_body, | ||||||
|             'notification_format': default_notification_format, |             'notification_format': default_notification_format, | ||||||
|  |             'notification_use_default': True, # Use default for new | ||||||
|             'notification_muted': False, |             'notification_muted': False, | ||||||
|             'css_filter': '', |             'css_filter': '', | ||||||
|             'last_error': False, |             'last_error': False, | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| $(document).ready(function() { | $(document).ready(function () { | ||||||
|     function toggle() { |     function toggle_fetch_backend() { | ||||||
|         if ($('input[name="fetch_backend"]:checked').val() == 'html_webdriver') { |         if ($('input[name="fetch_backend"]:checked').val() == 'html_webdriver') { | ||||||
|             if(playwright_enabled) { |             if (playwright_enabled) { | ||||||
|                 // playwright supports headers, so hide everything else |                 // playwright supports headers, so hide everything else | ||||||
|                 // See #664 |                 // See #664 | ||||||
|                 $('#requests-override-options #request-method').hide(); |                 $('#requests-override-options #request-method').hide(); | ||||||
| @@ -13,12 +13,8 @@ $(document).ready(function() { | |||||||
|                 // selenium/webdriver doesnt support anything afaik, hide it all |                 // selenium/webdriver doesnt support anything afaik, hide it all | ||||||
|                 $('#requests-override-options').hide(); |                 $('#requests-override-options').hide(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|             $('#webdriver-override-options').show(); |             $('#webdriver-override-options').show(); | ||||||
|  |  | ||||||
|         } else { |         } else { | ||||||
|  |  | ||||||
|             $('#requests-override-options').show(); |             $('#requests-override-options').show(); | ||||||
|             $('#requests-override-options *:hidden').show(); |             $('#requests-override-options *:hidden').show(); | ||||||
|             $('#webdriver-override-options').hide(); |             $('#webdriver-override-options').hide(); | ||||||
| @@ -26,8 +22,27 @@ $(document).ready(function() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     $('input[name="fetch_backend"]').click(function (e) { |     $('input[name="fetch_backend"]').click(function (e) { | ||||||
|         toggle(); |         toggle_fetch_backend(); | ||||||
|     }); |     }); | ||||||
|     toggle(); |     toggle_fetch_backend(); | ||||||
|  |  | ||||||
|  |     function toggle_default_notifications() { | ||||||
|  |         var n=$('#notification_urls, #notification_title, #notification_body, #notification_format'); | ||||||
|  |         if ($('#notification_use_default').is(':checked')) { | ||||||
|  |             $('#notification-field-group').fadeOut(); | ||||||
|  |             $(n).each(function (e) { | ||||||
|  |                 $(this).attr('readonly', true); | ||||||
|  |             }); | ||||||
|  |         } else { | ||||||
|  |             $('#notification-field-group').show(); | ||||||
|  |             $(n).each(function (e) { | ||||||
|  |                 $(this).attr('readonly', false); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $('#notification_use_default').click(function (e) { | ||||||
|  |         toggle_default_notifications(); | ||||||
|  |     }); | ||||||
|  |     toggle_default_notifications(); | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -539,4 +539,28 @@ class ChangeDetectionStore: | |||||||
|                 del(watch['last_changed']) |                 del(watch['last_changed']) | ||||||
|             except: |             except: | ||||||
|                 continue |                 continue | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def update_5(self): | ||||||
|  |  | ||||||
|  |         from changedetectionio.notification import ( | ||||||
|  |             default_notification_body, | ||||||
|  |             default_notification_format, | ||||||
|  |             default_notification_title, | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         for uuid, watch in self.data['watching'].items(): | ||||||
|  |             try: | ||||||
|  |                 # If it's all the same to the system settings, then prefer system notification settings | ||||||
|  |                 # include \r\n -> \n incase they already hit submit and the browser put \r in | ||||||
|  |                 if watch.get('notification_body').replace('\r\n', '\n') == default_notification_body.replace('\r\n', '\n') and \ | ||||||
|  |                         watch.get('notification_format') == default_notification_format and \ | ||||||
|  |                         watch.get('notification_title').replace('\r\n', '\n') == default_notification_title.replace('\r\n', '\n') and \ | ||||||
|  |                         watch.get('notification_urls') == self.__data['settings']['application']['notification_urls']: | ||||||
|  |                         watch['notification_use_default'] = True | ||||||
|  |                 else: | ||||||
|  |                     watch['notification_use_default'] = False | ||||||
|  |             except: | ||||||
|  |                 continue | ||||||
|         return |         return | ||||||
| @@ -135,9 +135,11 @@ User-Agent: wonderbra 1.0") }} | |||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
|             <div class="tab-pane-inner" id="notifications"> |             <div class="tab-pane-inner" id="notifications"> | ||||||
|                 <strong>Note: <i>These settings override the global settings for this watch.</i></strong> |  | ||||||
|                 <fieldset> |                 <fieldset> | ||||||
|                     <div class="field-group"> |                     <div  class="pure-control-group inline-radio"> | ||||||
|  |                       {{ render_checkbox_field(form.notification_use_default) }} | ||||||
|  |                     </div> | ||||||
|  |                     <div class="field-group" id="notification-field-group"> | ||||||
|                         {{ render_common_settings_form(form, current_base_url, emailprefix) }} |                         {{ render_common_settings_form(form, current_base_url, emailprefix) }} | ||||||
|                     </div> |                     </div> | ||||||
|                 </fieldset> |                 </fieldset> | ||||||
|   | |||||||
| @@ -71,6 +71,7 @@ def test_check_notification(client, live_server): | |||||||
|         "url": test_url, |         "url": test_url, | ||||||
|         "tag": "my tag", |         "tag": "my tag", | ||||||
|         "title": "my title", |         "title": "my title", | ||||||
|  |         # No 'notification_use_default' here, so it's effectively False/off | ||||||
|         "headers": "", |         "headers": "", | ||||||
|         "fetch_backend": "html_requests"}) |         "fetch_backend": "html_requests"}) | ||||||
|  |  | ||||||
| @@ -215,3 +216,82 @@ def test_notification_validation(client, live_server): | |||||||
|         url_for("form_delete", uuid="all"), |         url_for("form_delete", uuid="all"), | ||||||
|         follow_redirects=True |         follow_redirects=True | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|  | # Check that the default VS watch specific notification is hit | ||||||
|  | def test_check_notification_use_default(client, live_server): | ||||||
|  |     set_original_response() | ||||||
|  |     notification_url = url_for('test_notification_endpoint', _external=True).replace('http', 'json') | ||||||
|  |     test_url = url_for('test_endpoint', _external=True) | ||||||
|  |  | ||||||
|  |     res = client.post( | ||||||
|  |         url_for("form_quick_watch_add"), | ||||||
|  |         data={"url": test_url, "tag": ''}, | ||||||
|  |         follow_redirects=True | ||||||
|  |     ) | ||||||
|  |     assert b"Watch added" in res.data | ||||||
|  |  | ||||||
|  |     ## Setup the local one and enable it | ||||||
|  |     res = client.post( | ||||||
|  |         url_for("edit_page", uuid="first"), | ||||||
|  |         data={"notification_urls": notification_url, | ||||||
|  |               "notification_title": "watch-notification", | ||||||
|  |               "notification_body": "watch-body", | ||||||
|  |               'notification_use_default': "True", | ||||||
|  |               "notification_format": "Text", | ||||||
|  |               "url": test_url, | ||||||
|  |               "tag": "my tag", | ||||||
|  |               "title": "my title", | ||||||
|  |               "headers": "", | ||||||
|  |               "fetch_backend": "html_requests"}, | ||||||
|  |         follow_redirects=True | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     res = client.post( | ||||||
|  |         url_for("settings_page"), | ||||||
|  |         data={"application-notification_title": "global-notifications-title", | ||||||
|  |               "application-notification_body": "global-notifications-body\n", | ||||||
|  |               "application-notification_format": "Text", | ||||||
|  |               "application-notification_urls": notification_url, | ||||||
|  |               "requests-time_between_check-minutes": 180, | ||||||
|  |               "fetch_backend": "html_requests" | ||||||
|  |               }, | ||||||
|  |         follow_redirects=True | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     # A change should by default trigger a notification of the global-notifications | ||||||
|  |     time.sleep(1) | ||||||
|  |     set_modified_response() | ||||||
|  |     client.get(url_for("form_watch_checknow"), follow_redirects=True) | ||||||
|  |     time.sleep(2) | ||||||
|  |     with open("test-datastore/notification.txt", "r") as f: | ||||||
|  |         assert 'global-notifications-title' in f.read() | ||||||
|  |  | ||||||
|  |     ## Setup the local one and enable it | ||||||
|  |     res = client.post( | ||||||
|  |         url_for("edit_page", uuid="first"), | ||||||
|  |         data={"notification_urls": notification_url, | ||||||
|  |               "notification_title": "watch-notification", | ||||||
|  |               "notification_body": "watch-body", | ||||||
|  |               # No 'notification_use_default' here, so it's effectively False/off = "dont use default, use this one" | ||||||
|  |               "notification_format": "Text", | ||||||
|  |               "url": test_url, | ||||||
|  |               "tag": "my tag", | ||||||
|  |               "title": "my title", | ||||||
|  |               "headers": "", | ||||||
|  |               "fetch_backend": "html_requests"}, | ||||||
|  |         follow_redirects=True | ||||||
|  |     ) | ||||||
|  |     set_original_response() | ||||||
|  |  | ||||||
|  |     client.get(url_for("form_watch_checknow"), follow_redirects=True) | ||||||
|  |     time.sleep(2) | ||||||
|  |     assert os.path.isfile("test-datastore/notification.txt") | ||||||
|  |     with open("test-datastore/notification.txt", "r") as f: | ||||||
|  |         assert 'watch-notification' in f.read() | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     # cleanup for the next | ||||||
|  |     client.get( | ||||||
|  |         url_for("form_delete", uuid="all"), | ||||||
|  |         follow_redirects=True | ||||||
|  |     ) | ||||||
| @@ -41,7 +41,7 @@ class update_worker(threading.Thread): | |||||||
|             ) |             ) | ||||||
|  |  | ||||||
|         # Did it have any notification alerts to hit? |         # Did it have any notification alerts to hit? | ||||||
|         if len(watch['notification_urls']): |         if not watch.get('notification_use_default') and len(watch['notification_urls']): | ||||||
|             print(">>> Notifications queued for UUID from watch {}".format(watch_uuid)) |             print(">>> Notifications queued for UUID from watch {}".format(watch_uuid)) | ||||||
|             n_object['notification_urls'] = watch['notification_urls'] |             n_object['notification_urls'] = watch['notification_urls'] | ||||||
|             n_object['notification_title'] = watch['notification_title'] |             n_object['notification_title'] = watch['notification_title'] | ||||||
| @@ -49,7 +49,7 @@ class update_worker(threading.Thread): | |||||||
|             n_object['notification_format'] = watch['notification_format'] |             n_object['notification_format'] = watch['notification_format'] | ||||||
|  |  | ||||||
|         # No? maybe theres a global setting, queue them all |         # No? maybe theres a global setting, queue them all | ||||||
|         elif len(self.datastore.data['settings']['application']['notification_urls']): |         elif watch.get('notification_use_default') and len(self.datastore.data['settings']['application']['notification_urls']): | ||||||
|             print(">>> Watch notification URLs were empty, using GLOBAL notifications for UUID: {}".format(watch_uuid)) |             print(">>> Watch notification URLs were empty, using GLOBAL notifications for UUID: {}".format(watch_uuid)) | ||||||
|             n_object['notification_urls'] = self.datastore.data['settings']['application']['notification_urls'] |             n_object['notification_urls'] = self.datastore.data['settings']['application']['notification_urls'] | ||||||
|             n_object['notification_title'] = self.datastore.data['settings']['application']['notification_title'] |             n_object['notification_title'] = self.datastore.data['settings']['application']['notification_title'] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user