Update reference

This commit is contained in:
Daniel Grams 2020-09-30 20:31:08 +02:00
parent 917ff0b84f
commit 3291431518
10 changed files with 166 additions and 120 deletions

79
app.py
View File

@ -69,7 +69,7 @@ app.json_encoder = DateTimeEncoder
# Setup Flask-Security
# Define models
from models import AdminUnitMemberInvitation, Analytics, EventRejectionReason, EventReviewStatus, EventPlace, EventOrganizer, EventCategory, Image, OrgOrAdminUnit, Actor, Place, Location, User, Role, AdminUnit, AdminUnitMember, AdminUnitMemberRole, OrgMember, OrgMemberRole, Organization, AdminUnitOrg, AdminUnitOrgRole, Event, EventDate, EventReference, EventReferenceRequestRejectionReason, EventReferenceRequestReviewStatus
from models import AdminUnitMemberInvitation, Analytics, EventRejectionReason, EventReviewStatus, EventPlace, EventOrganizer, EventCategory, Image, OrgOrAdminUnit, Actor, Place, Location, User, Role, AdminUnit, AdminUnitMember, AdminUnitMemberRole, OrgMember, OrgMemberRole, Organization, AdminUnitOrg, AdminUnitOrgRole, Event, EventDate, EventReference
user_datastore = SQLAlchemySessionUserDatastore(db.session, User, Role)
security = Security(app, user_datastore)
from oauth import blueprint
@ -734,6 +734,9 @@ def can_delete_event(event):
def can_reference_event(event):
return len(get_admin_units_for_event_reference(event)) > 0
def can_update_reference(reference):
return has_current_user_permission_for_admin_unit(reference.admin_unit, 'reference:update')
def can_delete_reference(reference):
return has_current_user_permission_for_admin_unit(reference.admin_unit, 'reference:delete')
@ -809,6 +812,7 @@ def create_initial_data():
"event:delete",
"event:reference",
"event_suggestion:read",
"reference:update",
"reference:delete"]
upsert_admin_unit_member_role('admin', 'Administrator', admin_permissions)
@ -1248,76 +1252,7 @@ def event_review(event_id):
dates=dates,
event=event)
@app.route('/event/<int:event_id>/reference', methods=('GET', 'POST'))
def event_reference(event_id):
event = Event.query.get_or_404(event_id)
user_can_reference_event = can_reference_event(event)
if not user_can_reference_event:
abort(401)
form = ReferenceEventForm()
form.admin_unit_id.choices = sorted([(admin_unit.id, admin_unit.name) for admin_unit in get_admin_units_for_event_reference(event)], key=lambda admin_unit: admin_unit[1])
if form.validate_on_submit():
reference = EventReference()
form.populate_obj(reference)
reference.event = event
reference.review_status = EventReferenceRequestReviewStatus.verified
try:
db.session.add(reference)
db.session.commit()
flash(gettext('Event successfully referenced'), 'success')
return redirect(url_for('event', event_id=event.id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')
else:
flash_errors(form)
return render_template('event/reference.html',
form=form,
event=event)
@app.route('/manage/admin_unit/<int:id>/references')
@auth_required()
def manage_admin_unit_references(id):
admin_unit = get_admin_unit_for_manage_or_404(id)
references = EventReference.query.filter(EventReference.admin_unit_id == admin_unit.id).order_by(EventReference.created_at).paginate()
return render_template('manage/references.html',
admin_unit=admin_unit,
references=references.items,
pagination=get_pagination_urls(references, id=id))
@app.route('/reference/<int:id>/delete', methods=('GET', 'POST'))
def reference_delete(id):
reference = EventReference.query.get_or_404(id)
if not can_delete_reference(reference):
abort(401)
form = DeleteReferenceForm()
if form.validate_on_submit():
if form.name.data != reference.event.name:
flash(gettext('Entered name does not match event name'), 'danger')
else:
try:
db.session.delete(reference)
db.session.commit()
flash(gettext('Reference successfully deleted'), 'success')
return redirect(url_for('manage_admin_unit_references', id=reference.admin_unit_id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')
else:
flash_errors(form)
return render_template('reference/delete.html',
form=form,
reference=reference)
from views import reference
@app.route("/eventdates")
def event_dates():
@ -1416,7 +1351,7 @@ def api_event_places(id):
return jsonify(result)
from forms.event import CreateEventForm, UpdateEventForm, DeleteEventForm, DeleteReferenceForm, EventContactForm, ReviewEventForm, ReferenceEventForm
from forms.event import CreateEventForm, UpdateEventForm, DeleteEventForm, EventContactForm, ReviewEventForm
from forms.place import CreatePlaceForm, UpdatePlaceForm
from forms.organization import CreateOrganizationForm, UpdateOrganizationForm
from forms.organizer import CreateOrganizerForm, UpdateOrganizerForm, DeleteOrganizerForm

15
forms/common.py Normal file
View File

@ -0,0 +1,15 @@
from flask_babelex import lazy_gettext
event_rating_choices = [
(0,lazy_gettext('0 (Little relevant)')),
(10,'1'),
(20,'2'),
(30,'3'),
(40,'4'),
(50,'5'),
(60,'6'),
(70,'7'),
(80,'8'),
(90,'9'),
(100,lazy_gettext('10 (Highlight)'))
]

View File

@ -6,6 +6,7 @@ from wtforms.fields.html5 import DateTimeLocalField, EmailField
from wtforms.validators import DataRequired, Optional
from wtforms.widgets import html_params, HTMLString
from models import EventContact, EventPlace, EventTargetGroupOrigin, EventAttendanceMode, EventStatus, Location, Place, EventOrganizer, EventRejectionReason, EventReviewStatus
from .common import event_rating_choices
from .widgets import CustomDateTimeField
class EventPlaceLocationForm(FlaskForm):
@ -67,19 +68,7 @@ class BaseEventForm(FlaskForm):
(int(EventAttendanceMode.mixed), lazy_gettext('EventAttendanceMode.mixed'))])
photo_file = FileField(lazy_gettext('Photo'), validators=[FileAllowed(['jpg', 'jpeg', 'png'], lazy_gettext('Images only!'))])
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=[
(0,lazy_gettext('0 (Little relevant)')),
(10,'1'),
(20,'2'),
(30,'3'),
(40,'4'),
(50,'5'),
(60,'6'),
(70,'7'),
(80,'8'),
(90,'9'),
(100,lazy_gettext('10 (Highlight)'))
])
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=event_rating_choices)
class CreateEventForm(BaseEventForm):
event_place_choice = RadioField(lazy_gettext('Place'), choices=[(1,lazy_gettext('Select existing place')), (2,lazy_gettext('Enter new place'))], default=1, coerce=int)
@ -141,44 +130,10 @@ class ReviewEventForm(FlaskForm):
(int(EventRejectionReason.untrustworthy), lazy_gettext('EventRejectionReason.untrustworthy')),
(int(EventRejectionReason.illegal), lazy_gettext('EventRejectionReason.illegal'))])
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=[
(0,lazy_gettext('0 (Little relevant)')),
(10,'1'),
(20,'2'),
(30,'3'),
(40,'4'),
(50,'5'),
(60,'6'),
(70,'7'),
(80,'8'),
(90,'9'),
(100,lazy_gettext('10 (Highlight)'))
])
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=event_rating_choices)
submit = SubmitField(lazy_gettext("Save review"))
class ReferenceEventForm(FlaskForm):
admin_unit_id = SelectField(lazy_gettext('Admin unit'), validators=[DataRequired()], coerce=int)
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=[
(0,lazy_gettext('0 (Little relevant)')),
(10,'1'),
(20,'2'),
(30,'3'),
(40,'4'),
(50,'5'),
(60,'6'),
(70,'7'),
(80,'8'),
(90,'9'),
(100,lazy_gettext('10 (Highlight)'))
])
submit = SubmitField(lazy_gettext("Save reference"))
class DeleteReferenceForm(FlaskForm):
submit = SubmitField(lazy_gettext("Delete reference"))
name = StringField(lazy_gettext('Name'), validators=[DataRequired()])
class FindEventForm(FlaskForm):
class Meta:
csrf = False

18
forms/reference.py Normal file
View File

@ -0,0 +1,18 @@
from flask_babelex import lazy_gettext, gettext
from flask_wtf import FlaskForm
from wtforms import SelectField, StringField, SubmitField
from wtforms.validators import DataRequired
from .common import event_rating_choices
class CreateEventReferenceForm(FlaskForm):
admin_unit_id = SelectField(lazy_gettext('Admin unit'), validators=[DataRequired()], coerce=int)
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=event_rating_choices)
submit = SubmitField(lazy_gettext("Save reference"))
class UpdateEventReferenceForm(FlaskForm):
rating = SelectField(lazy_gettext('Rating'), default=50, coerce=int, choices=event_rating_choices)
submit = SubmitField(lazy_gettext("Update reference"))
class DeleteReferenceForm(FlaskForm):
submit = SubmitField(lazy_gettext("Delete reference"))
name = StringField(lazy_gettext('Name'), validators=[DataRequired()])

0
rights.py Normal file
View File

View File

@ -17,6 +17,7 @@
<button class="btn btn-link dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ reference.event.name }}</button>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{ url_for('event', event_id=reference.event.id) }}">{{ _('View') }}</a>
<a class="dropdown-item" href="{{ url_for('event_reference_update', id=reference.id) }}">{{ _('Edit') }}</a>
<a class="dropdown-item" href="{{ url_for('reference_delete', id=reference.id) }}">{{ _('Delete') }}...</a>
</div>
</div>

View File

@ -0,0 +1,20 @@
{% extends "layout.html" %}
{% from "_macros.html" import render_field_with_errors, render_field %}
{% block title %}
{{ _('Update reference to event "%(name)s"', name=reference.event.name) }}
{% endblock %}
{% block content %}
<h1>{{ _('Update reference to event "%(name)s"', name=reference.event.name) }}</h1>
<form action="" method="POST">
{{ form.hidden_tag() }}
{% if form.rating.choices|length > 1 %}
{{ render_field_with_errors(form.rating) }}
{% endif %}
{{ render_field(form.submit) }}
</form>
{% endblock %}

0
user.py Normal file
View File

0
views/__init__.py Normal file
View File

102
views/reference.py Normal file
View File

@ -0,0 +1,102 @@
from app import app, db, can_update_reference, get_admin_unit_for_manage_or_404, get_pagination_urls, can_reference_event, get_admin_units_for_event_reference, flash_errors, handleSqlError, can_delete_reference
from forms.reference import CreateEventReferenceForm, UpdateEventReferenceForm, DeleteReferenceForm
from flask import render_template, flash, redirect, url_for
from flask_babelex import gettext
from flask_security import auth_required
from models import EventReference, Event
@app.route('/event/<int:event_id>/reference', methods=('GET', 'POST'))
def event_reference(event_id):
event = Event.query.get_or_404(event_id)
user_can_reference_event = can_reference_event(event)
if not user_can_reference_event:
abort(401)
form = CreateEventReferenceForm()
form.admin_unit_id.choices = sorted([(admin_unit.id, admin_unit.name) for admin_unit in get_admin_units_for_event_reference(event)], key=lambda admin_unit: admin_unit[1])
if form.validate_on_submit():
reference = EventReference()
form.populate_obj(reference)
reference.event = event
try:
db.session.add(reference)
db.session.commit()
flash(gettext('Event successfully referenced'), 'success')
return redirect(url_for('event', event_id=event.id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')
else:
flash_errors(form)
return render_template('event/reference.html',
form=form,
event=event)
@app.route('/reference/<int:id>/update', methods=('GET', 'POST'))
def event_reference_update(id):
reference = EventReference.query.get_or_404(id)
if not can_update_reference(reference):
abort(401)
form = UpdateEventReferenceForm(obj=reference)
if form.validate_on_submit():
form.populate_obj(reference)
try:
db.session.commit()
flash(gettext('Reference successfully updated'), 'success')
return redirect(url_for('manage_admin_unit_references', id=reference.admin_unit_id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')
else:
flash_errors(form)
return render_template('reference/update.html',
form=form,
reference=reference)
@app.route('/manage/admin_unit/<int:id>/references')
@auth_required()
def manage_admin_unit_references(id):
admin_unit = get_admin_unit_for_manage_or_404(id)
references = EventReference.query.filter(EventReference.admin_unit_id == admin_unit.id).order_by(EventReference.created_at).paginate()
return render_template('manage/references.html',
admin_unit=admin_unit,
references=references.items,
pagination=get_pagination_urls(references, id=id))
@app.route('/reference/<int:id>/delete', methods=('GET', 'POST'))
def reference_delete(id):
reference = EventReference.query.get_or_404(id)
if not can_delete_reference(reference):
abort(401)
form = DeleteReferenceForm()
if form.validate_on_submit():
if form.name.data != reference.event.name:
flash(gettext('Entered name does not match event name'), 'danger')
else:
try:
db.session.delete(reference)
db.session.commit()
flash(gettext('Reference successfully deleted'), 'success')
return redirect(url_for('manage_admin_unit_references', id=reference.admin_unit_id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')
else:
flash_errors(form)
return render_template('reference/delete.html',
form=form,
reference=reference)