Merge pull request #31337 from D0n1elT/fix/issue-31303_irritating-event-reminder-behaviour

Fix #31303: Make reminder notification behaviour selectable..
This commit is contained in:
Christoph Wurst 2022-03-21 20:00:40 +01:00 committed by GitHub
commit 47dce35fa3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 99 additions and 9 deletions

View file

@ -33,6 +33,7 @@ namespace OCA\DAV\CalDAV\Reminder;
use DateTimeImmutable;
use OCA\DAV\CalDAV\CalDavBackend;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IConfig;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
@ -66,6 +67,9 @@ class ReminderService {
/** @var ITimeFactory */
private $timeFactory;
/** @var IConfig */
private $config;
public const REMINDER_TYPE_EMAIL = 'EMAIL';
public const REMINDER_TYPE_DISPLAY = 'DISPLAY';
public const REMINDER_TYPE_AUDIO = 'AUDIO';
@ -90,19 +94,22 @@ class ReminderService {
* @param IGroupManager $groupManager
* @param CalDavBackend $caldavBackend
* @param ITimeFactory $timeFactory
* @param IConfig $config
*/
public function __construct(Backend $backend,
NotificationProviderManager $notificationProviderManager,
IUserManager $userManager,
IGroupManager $groupManager,
CalDavBackend $caldavBackend,
ITimeFactory $timeFactory) {
ITimeFactory $timeFactory,
IConfig $config) {
$this->backend = $backend;
$this->notificationProviderManager = $notificationProviderManager;
$this->userManager = $userManager;
$this->groupManager = $groupManager;
$this->caldavBackend = $caldavBackend;
$this->timeFactory = $timeFactory;
$this->config = $config;
}
/**
@ -145,7 +152,12 @@ class ReminderService {
continue;
}
$users = $this->getAllUsersWithWriteAccessToCalendar($reminder['calendar_id']);
if ($this->config->getAppValue('dav', 'sendEventRemindersToSharedGroupMembers', 'yes') === 'no') {
$users = $this->getAllUsersWithWriteAccessToCalendar($reminder['calendar_id']);
} else {
$users = [];
}
$user = $this->getUserFromPrincipalURI($reminder['principaluri']);
if ($user) {
$users[] = $user;

View file

@ -46,6 +46,7 @@ class CalDAVSettings implements IDelegatedSettings {
'sendInvitations' => 'yes',
'generateBirthdayCalendar' => 'yes',
'sendEventReminders' => 'yes',
'sendEventRemindersToSharedGroupMembers' => 'yes',
'sendEventRemindersPush' => 'no',
];

View file

@ -16,6 +16,10 @@ const CalDavSettingsView = new View({
'generateBirthdayCalendar'
),
sendEventReminders: loadState('dav', 'sendEventReminders'),
sendEventRemindersToSharedGroupMembers: loadState(
'dav',
'sendEventRemindersToSharedGroupMembers'
),
sendEventRemindersPush: loadState('dav', 'sendEventRemindersPush'),
}
},

View file

@ -45,6 +45,7 @@ describe('CalDavSettings', () => {
sendInvitations: true,
generateBirthdayCalendar: true,
sendEventReminders: true,
sendEventRemindersToSharedGroupMembers: true,
sendEventRemindersPush: true,
}
},
@ -66,6 +67,10 @@ describe('CalDavSettings', () => {
'Send notifications for events'
)
expect(sendEventReminders).toBeChecked()
const sendEventRemindersToSharedGroupMembers = TLUtils.getByLabelText(
'Send reminder notifications to calendar sharees as well'
)
expect(sendEventRemindersToSharedGroupMembers).toBeChecked()
const sendEventRemindersPush = TLUtils.getByLabelText(
'Enable notifications for events via push'
)
@ -107,7 +112,10 @@ describe('CalDavSettings', () => {
'sendEventReminders',
'no'
)
expect(sendEventRemindersToSharedGroupMembers).toBeDisabled()
expect(sendEventRemindersPush).toBeDisabled()
OCP.AppConfig.setValue.mockClear()
await userEvent.click(sendEventReminders)
expect(sendEventReminders).toBeChecked()
@ -116,6 +124,8 @@ describe('CalDavSettings', () => {
'sendEventReminders',
'yes'
)
expect(sendEventRemindersToSharedGroupMembers).toBeEnabled()
expect(sendEventRemindersPush).toBeEnabled()
})
})

View file

@ -57,7 +57,21 @@
{{ $t('dav', 'Notifications are sent via background jobs, so these must occur often enough.') }}
</em>
</p>
<p>
<p class="indented">
<input id="caldavSendEventRemindersToSharedGroupMembers"
v-model="sendEventRemindersToSharedGroupMembers"
type="checkbox"
class="checkbox"
:disabled="!sendEventReminders">
<label for="caldavSendEventRemindersToSharedGroupMembers">
{{ $t('dav', 'Send reminder notifications to calendar sharees as well' ) }}
</label>
<br>
<em>
{{ $t('dav', 'Reminders are always sent to organizers and attendees.' ) }}
</em>
</p>
<p class="indented">
<input id="caldavSendEventRemindersPush"
v-model="sendEventRemindersPush"
type="checkbox"
@ -70,6 +84,12 @@
</div>
</template>
<style lang="scss" scoped>
.indented {
padding-left: 28px;
}
</style>
<script>
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
@ -118,6 +138,13 @@ export default {
sendEventReminders(value) {
OCP.AppConfig.setValue('dav', 'sendEventReminders', value ? 'yes' : 'no')
},
sendEventRemindersToSharedGroupMembers(value) {
OCP.AppConfig.setValue(
'dav',
'sendEventRemindersToSharedGroupMembers',
value ? 'yes' : 'no'
)
},
sendEventRemindersPush(value) {
OCP.AppConfig.setValue('dav', 'sendEventRemindersPush', value ? 'yes' : 'no')
},

View file

@ -126,7 +126,35 @@ exports[`CalDavSettings interactions 1`] = `
</em>
</p>
<p>
<p
class="indented"
>
<input
class="checkbox"
id="caldavSendEventRemindersToSharedGroupMembers"
type="checkbox"
/>
<label
for="caldavSendEventRemindersToSharedGroupMembers"
>
Send reminder notifications to calendar sharees as well
</label>
<br />
<em>
Reminders are always sent to organizers and attendees.
</em>
</p>
<p
class="indented"
>
<input
class="checkbox"
id="caldavSendEventRemindersPush"

View file

@ -34,6 +34,7 @@ use OCA\DAV\CalDAV\Reminder\INotificationProvider;
use OCA\DAV\CalDAV\Reminder\NotificationProviderManager;
use OCA\DAV\CalDAV\Reminder\ReminderService;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserManager;
@ -63,6 +64,9 @@ class ReminderServiceTest extends TestCase {
/** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
private $timeFactory;
/** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
private $config;
/** @var ReminderService */
private $reminderService;
@ -194,6 +198,7 @@ EOD;
$this->groupManager = $this->createMock(IGroupManager::class);
$this->caldavBackend = $this->createMock(CalDavBackend::class);
$this->timeFactory = $this->createMock(ITimeFactory::class);
$this->config = $this->createMock(IConfig::class);
$this->caldavBackend->method('getShares')->willReturn([]);
@ -202,7 +207,8 @@ EOD;
$this->userManager,
$this->groupManager,
$this->caldavBackend,
$this->timeFactory);
$this->timeFactory,
$this->config);
}
public function testOnCalendarObjectDelete():void {

View file

@ -62,9 +62,10 @@ class CalDAVSettingsTest extends TestCase {
['dav', 'sendInvitations', 'yes'],
['dav', 'generateBirthdayCalendar', 'yes'],
['dav', 'sendEventReminders', 'yes'],
['dav', 'sendEventRemindersToSharedGroupMembers', 'yes'],
['dav', 'sendEventRemindersPush', 'no'],
)
->will($this->onConsecutiveCalls('yes', 'no', 'yes', 'yes'));
->will($this->onConsecutiveCalls('yes', 'no', 'yes', 'yes', 'yes'));
$this->urlGenerator
->expects($this->once())
->method('linkToDocs')
@ -76,6 +77,7 @@ class CalDAVSettingsTest extends TestCase {
['sendInvitations', true],
['generateBirthdayCalendar', false],
['sendEventReminders', true],
['sendEventRemindersToSharedGroupMembers', true],
['sendEventRemindersPush', true],
);
$result = $this->settings->getForm();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long