eventcally/views/reference_request_review.py
Daniel Grams 66c8a75c32 Bugfixes
2020-10-14 18:01:20 +02:00

79 lines
3.4 KiB
Python

from app import app, db
from models import Event, EventDate, EventReferenceRequest, EventReferenceRequestReviewStatus, AdminUnitMember, User
from flask import render_template, flash, url_for, redirect, abort
from flask_babelex import gettext
from flask_security import auth_required
from access import has_access, access_or_401, can_reference_event, has_admin_unit_member_permission
from dateutils import today
from forms.reference_request import ReferenceRequestReviewForm
from .utils import flash_errors, send_mail, handleSqlError
from services.reference import create_event_reference_for_request
from sqlalchemy.exc import SQLAlchemyError
@app.route('/reference_request/<int:id>/review', methods=('GET', 'POST'))
def event_reference_request_review(id):
request = EventReferenceRequest.query.get_or_404(id)
access_or_401(request.admin_unit, 'reference_request:verify')
if request.review_status == EventReferenceRequestReviewStatus.verified:
flash(gettext('Request already verified'), 'danger')
return redirect(url_for('manage_admin_unit_reference_requests_incoming', id=request.admin_unit_id))
form = ReferenceRequestReviewForm(obj=request)
if form.validate_on_submit():
form.populate_obj(request)
if request.review_status != EventReferenceRequestReviewStatus.rejected:
request.rejection_reason = None
if request.rejection_reason == 0:
request.rejection_reason = None
try:
if request.review_status == EventReferenceRequestReviewStatus.verified:
reference = create_event_reference_for_request(request)
reference.rating = form.rating.data
msg = gettext('Request successfully updated')
else:
msg = gettext('Reference successfully created')
db.session.commit()
send_reference_request_review_status_mails(request)
flash(msg, 'success')
return redirect(url_for('manage_admin_unit_reference_requests_incoming', id=request.admin_unit_id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')
else:
flash_errors(form)
dates = EventDate.query.with_parent(request.event).filter(EventDate.start >= today).order_by(EventDate.start).all()
return render_template('reference_request/review.html',
form=form,
dates=dates,
request=request,
event=request.event)
@app.route('/reference_request/<int:id>/review_status')
def event_reference_request_review_status(id):
request = EventReferenceRequest.query.get_or_404(id)
if not has_access(request.admin_unit, 'reference_request:verify') and not has_access(request.event.admin_unit, 'reference_request:create'):
abort(401)
return render_template('reference_request/review_status.html',
reference_request=request,
event=request.event)
def send_reference_request_review_status_mails(request):
# Benachrichtige alle Mitglieder der AdminUnit, die diesen Request erstellt hatte
members = AdminUnitMember.query.join(User).filter(AdminUnitMember.admin_unit_id == request.event.admin_unit_id).all()
for member in members:
if has_admin_unit_member_permission(member, 'reference_request:create'):
send_mail(member.user.email,
gettext('Event review status updated'),
'reference_request_review_status_notice',
request=request)