mirror of
				https://github.com/dgtlmoon/changedetection.io.git
				synced 2025-11-04 08:34:57 +00:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
			0.45.19
			...
			809-global
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a2fac93548 | ||
| 
						 | 
					09c9239aab | ||
| 
						 | 
					59b3bbf195 | ||
| 
						 | 
					aac59ab806 | ||
| 
						 | 
					7ba8d44677 | ||
| 
						 | 
					620b22932b | ||
| 
						 | 
					03424d3419 | 
@@ -355,6 +355,8 @@ class watchForm(commonSettingsForm):
 | 
			
		||||
    filter_failure_notification_send = BooleanField(
 | 
			
		||||
        '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):
 | 
			
		||||
        if not super().validate():
 | 
			
		||||
            return False
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ class model(dict):
 | 
			
		||||
            'notification_title': default_notification_title,
 | 
			
		||||
            'notification_body': default_notification_body,
 | 
			
		||||
            'notification_format': default_notification_format,
 | 
			
		||||
            'notification_use_default': True, # Use default for new
 | 
			
		||||
            'notification_muted': False,
 | 
			
		||||
            'css_filter': '',
 | 
			
		||||
            'last_error': False,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
$(document).ready(function() {
 | 
			
		||||
    function toggle() {
 | 
			
		||||
$(document).ready(function () {
 | 
			
		||||
    function toggle_fetch_backend() {
 | 
			
		||||
        if ($('input[name="fetch_backend"]:checked').val() == 'html_webdriver') {
 | 
			
		||||
            if(playwright_enabled) {
 | 
			
		||||
            if (playwright_enabled) {
 | 
			
		||||
                // playwright supports headers, so hide everything else
 | 
			
		||||
                // See #664
 | 
			
		||||
                $('#requests-override-options #request-method').hide();
 | 
			
		||||
@@ -13,12 +13,8 @@ $(document).ready(function() {
 | 
			
		||||
                // selenium/webdriver doesnt support anything afaik, hide it all
 | 
			
		||||
                $('#requests-override-options').hide();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            $('#webdriver-override-options').show();
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
            $('#requests-override-options').show();
 | 
			
		||||
            $('#requests-override-options *:hidden').show();
 | 
			
		||||
            $('#webdriver-override-options').hide();
 | 
			
		||||
@@ -26,8 +22,27 @@ $(document).ready(function() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $('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'])
 | 
			
		||||
            except:
 | 
			
		||||
                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
 | 
			
		||||
@@ -135,9 +135,11 @@ User-Agent: wonderbra 1.0") }}
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div class="tab-pane-inner" id="notifications">
 | 
			
		||||
                <strong>Note: <i>These settings override the global settings for this watch.</i></strong>
 | 
			
		||||
                <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) }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                </fieldset>
 | 
			
		||||
 
 | 
			
		||||
@@ -71,6 +71,7 @@ def test_check_notification(client, live_server):
 | 
			
		||||
        "url": test_url,
 | 
			
		||||
        "tag": "my tag",
 | 
			
		||||
        "title": "my title",
 | 
			
		||||
        # No 'notification_use_default' here, so it's effectively False/off
 | 
			
		||||
        "headers": "",
 | 
			
		||||
        "fetch_backend": "html_requests"})
 | 
			
		||||
 | 
			
		||||
@@ -215,3 +216,82 @@ def test_notification_validation(client, live_server):
 | 
			
		||||
        url_for("form_delete", uuid="all"),
 | 
			
		||||
        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?
 | 
			
		||||
        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))
 | 
			
		||||
            n_object['notification_urls'] = watch['notification_urls']
 | 
			
		||||
            n_object['notification_title'] = watch['notification_title']
 | 
			
		||||
@@ -49,7 +49,7 @@ class update_worker(threading.Thread):
 | 
			
		||||
            n_object['notification_format'] = watch['notification_format']
 | 
			
		||||
 | 
			
		||||
        # 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))
 | 
			
		||||
            n_object['notification_urls'] = self.datastore.data['settings']['application']['notification_urls']
 | 
			
		||||
            n_object['notification_title'] = self.datastore.data['settings']['application']['notification_title']
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user