|
| 1 | +from typing import Dict |
| 2 | + |
1 | 3 | from flask import Blueprint, g, jsonify, request |
2 | 4 | from flask_jwt_extended import current_user |
3 | 5 | from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship |
|
7 | 9 | from app.api.events import Event |
8 | 10 | from app.api.helpers.custom_forms import validate_custom_form_constraints_request |
9 | 11 | from app.api.helpers.db import get_count, safe_query, safe_query_kwargs, save_to_db |
10 | | -from app.api.helpers.errors import ForbiddenError |
| 12 | +from app.api.helpers.errors import ForbiddenError, UnprocessableEntityError |
11 | 13 | from app.api.helpers.files import make_frontend_url |
12 | 14 | from app.api.helpers.mail import send_email_new_session, send_email_session_state_change |
13 | 15 | from app.api.helpers.notification import ( |
|
17 | 19 | from app.api.helpers.permission_manager import has_access |
18 | 20 | from app.api.helpers.query import event_query |
19 | 21 | from app.api.helpers.speaker import can_edit_after_cfs_ends |
| 22 | +from app.api.helpers.system_mails import MAILS, SESSION_STATE_CHANGE |
20 | 23 | from app.api.helpers.utilities import require_relationship |
21 | | -from app.api.schema.sessions import SessionSchema |
| 24 | +from app.api.schema.sessions import SessionNotifySchema, SessionSchema |
22 | 25 | from app.models import db |
23 | 26 | from app.models.microlocation import Microlocation |
24 | 27 | from app.models.session import Session |
@@ -221,6 +224,11 @@ def get_session_states(): |
221 | 224 | return jsonify(SESSION_STATE_DICT) |
222 | 225 |
|
223 | 226 |
|
| 227 | +@sessions_blueprint.route('/mails') |
| 228 | +def get_session_state_change_mails(): |
| 229 | + return jsonify(MAILS[SESSION_STATE_CHANGE]) |
| 230 | + |
| 231 | + |
224 | 232 | class SessionDetail(ResourceDetail): |
225 | 233 | """ |
226 | 234 | Session detail by id |
@@ -338,28 +346,44 @@ def after_update_object(self, session, data, view_kwargs): |
338 | 346 | } |
339 | 347 |
|
340 | 348 |
|
341 | | -def notify_for_session(session): |
| 349 | +def notify_for_session(session, mail_override: Dict[str, str] = None): |
342 | 350 | event = session.event |
343 | 351 | frontend_url = get_settings()['frontend_url'] |
344 | 352 | link = "{}/events/{}/sessions/{}".format(frontend_url, event.identifier, session.id) |
345 | 353 | # Email for speaker |
346 | 354 | speakers = session.speakers |
347 | 355 | for speaker in speakers: |
348 | 356 | if not speaker.is_email_overridden: |
349 | | - send_email_session_state_change(speaker.email, session) |
| 357 | + send_email_session_state_change(speaker.email, session, mail_override) |
350 | 358 | send_notif_session_state_change( |
351 | 359 | speaker.user, session.title, session.state, link, session.id |
352 | 360 | ) |
353 | 361 |
|
354 | 362 | # Email for owner |
355 | 363 | if session.event.get_owner(): |
356 | 364 | owner = session.event.get_owner() |
357 | | - send_email_session_state_change(owner.email, session) |
| 365 | + send_email_session_state_change(owner.email, session, mail_override) |
358 | 366 | send_notif_session_state_change( |
359 | 367 | owner, session.title, session.state, link, session.id |
360 | 368 | ) |
361 | 369 |
|
362 | 370 |
|
| 371 | +@sessions_blueprint.route('/<int:id>/notify', methods=['POST']) |
| 372 | +@api.has_permission('is_speaker_for_session', methods="POST") |
| 373 | +def notify_session(id): |
| 374 | + session = Session.query.filter_by(deleted_at=None, id=id).first_or_404() |
| 375 | + |
| 376 | + data, errors = SessionNotifySchema().load(request.json) |
| 377 | + if errors: |
| 378 | + raise UnprocessableEntityError( |
| 379 | + {'pointer': '/data', 'errors': errors}, 'Data in incorrect format' |
| 380 | + ) |
| 381 | + |
| 382 | + notify_for_session(session, data) |
| 383 | + |
| 384 | + return jsonify({'success': True}) |
| 385 | + |
| 386 | + |
363 | 387 | class SessionRelationshipRequired(ResourceRelationship): |
364 | 388 | """ |
365 | 389 | Session Relationship |
|
0 commit comments