This blog post will showcase an option which can be used by organizers to lock/unlock a session in Open Event Frontend. Let’s start by understanding what this feature means and why is it important for organizers. If a session is locked by an organizer, it cannot be edited by the session creator.
Suppose an event organizer wants final session submission by a particular date so that he/she can shortlist the sessions based on final submission, but the user goes on editing the session event after final date of submission. This is a situation where this feature will help the organizer to prohibit the user from further modification of session.
If a session is unlocked, then unlock icon is shown:
However, if a session is locked, lock icon is shown:
Snippet to toggle locked/unlocked icon:
{{#if record.isLocked}} {{#ui-popup content=(t 'Unlock Session') class='ui basic Button' click=(action unlockSession record) position='left center'}} <i class="lock icon"></i> {{/ui-popup}} {{else}} {{#ui-popup content=(t 'Lock Session') class='ui basic Button' click=(action lockSession record) position='left center'}} <i class="unlock icon"></i> {{/ui-popup}} {{/if}}
On clicking these icon buttons, corresponding action is triggered which updates the status of is-locked attribute of the session. When an organizer clicks on lock icon button, unlockSession action is triggered which sets is-locked property of session to false. However if unlock icon button is clicked, lockSession action is triggered which sets the is-locked property of session to true.
Snippet to lock a session:
lockSession(session) { session.set('isLocked', true); this.set('isLoading', true); session.save() .then(() => { this.notify.success(this.l10n.t('Session has been locked successfully.')); this.send('refreshRoute'); }) .catch(() => { this.notify.error(this.l10n.t('An unexpected error has occurred.')); }) .finally(() => { this.set('isLoading', false); }); }
Snippet to unlock a session:
unlockSession(session) { session.set('isLocked', false); this.set('isLoading', true); session.save() .then(() => { this.notify.success(this.l10n.t('Session has been unlocked successfully.')); this.send('refreshRoute'); }) .catch(() => { this.notify.error(this.l10n.t('An unexpected error has occurred.')); }) .finally(() => { this.set('isLoading', false); }); }
These changes required few server checks so that only a person with admin or organizer access can update the value of is-locked attribute of session. Also, any try to edit a locked session via API call must be rejected.
Server checks related to locking/unlocking a session:
def before_update_object(self, session, data, view_kwargs): """ before update method to verify if session is locked before updating session object :param event: :param data: :param view_kwargs: :return: """ if data.get('is_locked') != session.is_locked: if not (has_access('is_admin') or has_access('is_organizer')): raise ForbiddenException({'source': '/data/attributes/is-locked'}, "You don't have enough permissions to change this property") if session.is_locked and data.get('is_locked') == session.is_locked: raise ForbiddenException({'source': '/data/attributes/is-locked'}, "Locked sessions cannot be edited")
Resources:
Related work and code repo: