mirror of
https://github.com/dgtlmoon/changedetection.io.git
synced 2025-11-08 18:47:32 +00:00
Compare commits
7 Commits
better-mer
...
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,5 +1,5 @@
|
|||||||
$(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
|
||||||
@@ -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();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -540,3 +540,27 @@ class ChangeDetectionStore:
|
|||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
return
|
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>
|
||||||
|
|
||||||
<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"})
|
||||||
|
|
||||||
@@ -210,6 +211,85 @@ def test_notification_validation(client, live_server):
|
|||||||
|
|
||||||
assert bytes("is not a valid token".encode('utf-8')) in res.data
|
assert bytes("is not a valid token".encode('utf-8')) in res.data
|
||||||
|
|
||||||
|
# cleanup for the next
|
||||||
|
client.get(
|
||||||
|
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
|
# cleanup for the next
|
||||||
client.get(
|
client.get(
|
||||||
url_for("form_delete", uuid="all"),
|
url_for("form_delete", uuid="all"),
|
||||||
|
|||||||
@@ -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