eventcally/project/views/reference_request_review.py
Daniel Grams 273b3fb072 Internal/analysis (#4)
* Codestyle Black

* Flake8

* Test coverage
2020-11-13 23:05:39 +01:00

118 lines
3.8 KiB
Python

from project import app, db
from project.models import (
EventDate,
EventReferenceRequest,
EventReferenceRequestReviewStatus,
AdminUnitMember,
User,
)
from flask import render_template, flash, url_for, redirect, abort
from flask_babelex import gettext
from project.access import (
has_access,
access_or_401,
has_admin_unit_member_permission,
)
from project.dateutils import today
from project.forms.reference_request import ReferenceRequestReviewForm
from project.views.utils import flash_errors, send_mail, handleSqlError
from project.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,
)