Event-Liste: Veranstalter optional

This commit is contained in:
Daniel Grams 2020-10-05 11:38:58 +02:00
parent 19a4d3b3c3
commit 9e1067952d
10 changed files with 232 additions and 204 deletions

View File

@ -7,7 +7,7 @@ from wtforms.validators import DataRequired, Optional
from wtforms.widgets import html_params, HTMLString
from models import EventContact, EventPlace, EventTargetGroupOrigin, EventAttendanceMode, EventStatus, Location, EventOrganizer, EventRejectionReason, EventReviewStatus, Image
from .common import event_rating_choices, BaseImageForm
from .widgets import CustomDateTimeField
from .widgets import CustomDateTimeField, CustomDateField
class EventPlaceLocationForm(FlaskForm):
street = StringField(lazy_gettext('Street'), validators=[Optional()])
@ -144,6 +144,10 @@ class ReviewEventForm(FlaskForm):
class FindEventForm(FlaskForm):
class Meta:
csrf = False
submit = SubmitField(lazy_gettext("Find events"))
date_from = CustomDateField(lazy_gettext('From'), validators=[Optional()])
date_to = CustomDateField(lazy_gettext('to'), validators=[Optional()])
keyword = StringField(lazy_gettext('Keyword'), validators=[Optional()])
organizer_id = SelectField(lazy_gettext('Organizer'), validators=[DataRequired()], coerce=int)
organizer_id = SelectField(lazy_gettext('Organizer'), validators=[Optional()], coerce=int)
submit = SubmitField(lazy_gettext("Find events"))

View File

@ -1,4 +1,4 @@
from models import EventCategory, Event, EventDate, EventReference, EventPlace, Location
from models import EventReviewStatus, EventCategory, Event, EventDate, EventReference, EventPlace, Location
from dateutils import dates_from_recurrence_rule, today, date_add_time, date_set_end_of_day
from sqlalchemy import and_, or_, not_, func
@ -10,19 +10,7 @@ def upsert_event_category(category_name):
return result
def get_event_dates_query(params):
event_filter = Event.verified
date_filter = (EventDate.start >= today)
if params.admin_unit_id:
event_filter = and_(event_filter, or_(Event.admin_unit_id == params.admin_unit_id, Event.references.any(EventReference.admin_unit_id == params.admin_unit_id)))
if params.date_from:
date_filter = (EventDate.start >= params.date_from)
if params.date_to:
date_filter = and_(date_filter, EventDate.start < params.date_to)
def fill_event_filter(event_filter, params):
if params.keyword:
like_keyword = '%' + params.keyword + '%'
event_filter = and_(event_filter, or_(Event.name.ilike(like_keyword), Event.description.ilike(like_keyword), Event.tags.ilike(like_keyword)))
@ -34,12 +22,50 @@ def get_event_dates_query(params):
category_ids = [params.category_id]
event_filter = and_(event_filter, Event.category_id.in_(category_ids))
if params.organizer_id:
event_filter = and_(event_filter, Event.organizer_id == params.organizer_id)
if params.latitude and params.longitude and params.distance:
point = 'POINT({} {})'.format(params.longitude, params.latitude)
event_filter = and_(event_filter, func.ST_DistanceSphere(Location.coordinate, point) <= params.distance)
return event_filter
def get_event_dates_query(params):
event_filter = Event.verified
date_filter = (EventDate.start >= today)
event_filter = fill_event_filter(event_filter, params)
if params.admin_unit_id:
event_filter = and_(event_filter, or_(Event.admin_unit_id == params.admin_unit_id, Event.references.any(EventReference.admin_unit_id == params.admin_unit_id)))
if params.date_from:
date_filter = (EventDate.start >= params.date_from)
if params.date_to:
date_filter = and_(date_filter, EventDate.start < params.date_to)
return EventDate.query.join(Event).join(EventPlace, isouter=True).join(Location, isouter=True).filter(date_filter).filter(event_filter).order_by(EventDate.start)
def get_events_query(params):
event_filter = Event.review_status != EventReviewStatus.inbox
date_filter = (EventDate.start >= today)
event_filter = fill_event_filter(event_filter, params)
if params.admin_unit_id:
event_filter = and_(event_filter, Event.admin_unit_id == params.admin_unit_id)
if params.date_from:
date_filter = (EventDate.start >= params.date_from)
if params.date_to:
date_filter = and_(date_filter, EventDate.start < params.date_to)
event_filter = and_(event_filter, Event.dates.any(date_filter))
return Event.query.join(EventPlace, isouter=True).join(Location, isouter=True).filter(event_filter).order_by(Event.start)
def update_event_dates_with_recurrence_rule(event, start, end):
event.start = start
event.end = end

View File

@ -15,6 +15,7 @@ class EventSearchParams(object):
self.longitude = None
self.distance = None
self.category_id = None
self.organizer_id = None
@property
def date_from(self):
@ -76,3 +77,6 @@ class EventSearchParams(object):
if "category_id" in request.args:
self.category_id = request.args.getlist('category_id')
if "organizer_id" in request.args:
self.organizer_id = request.args['organizer_id']

View File

@ -568,6 +568,8 @@ $( function() {
{% macro render_event_dates_filter_form(form) %}
<form action="" class="form-inline mb-4" method="GET" autocomplete="off">
{{ form.hidden_tag() }}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_from.label() }}</span>
@ -582,12 +584,23 @@ $( function() {
{{ form.date_to(class="form-control datepicker")|safe }}
</div>
{% if form.category_id %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.category_id.label() }}</span>
</div>
{{ form.category_id(class="form-control")|safe }}
</div>
{% endif %}
{% if form.organizer_id %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.organizer_id.label() }}</span>
</div>
{{ form.organizer_id(class="form-control")|safe }}
</div>
{% endif %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">

View File

@ -23,7 +23,7 @@
{{ render_submenu_item('reviews', _('Reviews'), url_for('manage_admin_unit_event_reviews', id=admin_unit.id), active_id) }}
<li class="nav-item dropdown">
<a class="nav-link pl-0 dropdown-toggle{% if active_id.startswith('reference') %} active{% endif %}" href="#" id="navbarDropdownReferences" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ 'References' }}
{{ _('References') }}
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownReferences">
<a class="dropdown-item" href="{{ url_for('manage_admin_unit_references_incoming', id=admin_unit.id) }}">{{ _('Incoming references') }}</a>

View File

@ -1,6 +1,6 @@
{% extends "layout_manage.html" %}
{% set active_id = "events" %}
{% from "_macros.html" import render_event_review_status_pill, render_event_status_pill, render_pagination, render_event_date, render_field_with_errors, render_event_organizer %}
{% from "_macros.html" import render_event_dates_filter_form, render_event_review_status_pill, render_event_status_pill, render_pagination, render_event_date, render_field_with_errors, render_event_organizer %}
{% block title %}
{{ _('Events') }}
{% endblock %}
@ -9,30 +9,11 @@
<h1>{{ _('Events') }}</h1>
<div class="my-4">
<form action="" class="form-inline" method="GET">
{{ form.hidden_tag() }}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ _('Organizer') }}</span>
</div>
{{ form.organizer_id(class="form-control", onchange="javascript:this.form.submit()")|safe }}
</div>
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ _('Keyword') }}</span>
</div>
{{ form.keyword(class="form-control")|safe }}
</div>
<button type="submit" class="btn btn-secondary mb-2">{{ _('Find') }}</button>
</form>
{{ render_event_dates_filter_form(form) }}
</div>
<div class="my-4">
<a class="btn btn-outline-secondary my-1" href="{{ url_for('event_create_for_admin_unit_id', id=admin_unit.id, organizer_id=organizer.id) }}" role="button"><i class="fa fa-plus"></i> {{ _('Create event') }}</a>
<a class="btn btn-outline-secondary my-1" href="{{ url_for('event_create_for_admin_unit_id', id=admin_unit.id) }}" role="button"><i class="fa fa-plus"></i> {{ _('Create event') }}</a>
</div>
<ul class="list-group">
@ -49,6 +30,7 @@
</div>
{{ render_event_status_pill(event) }}
{{ render_event_review_status_pill(event) }}
<small>{{ event.organizer.name }}</small>
</li>
{% endfor %}
</ul>

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-10-04 13:28+0200\n"
"POT-Creation-Date: 2020-10-05 11:37+0200\n"
"PO-Revision-Date: 2020-06-07 18:51+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
@ -114,94 +114,89 @@ msgstr "Event_"
msgid "."
msgstr "."
#: forms/admin_unit.py:11 forms/event.py:13 forms/event_place.py:12
#: forms/organizer.py:11
#: forms/admin_unit.py:12 forms/event.py:13 forms/event_place.py:13
#: forms/organizer.py:12
msgid "Street"
msgstr "Straße"
#: forms/admin_unit.py:12 forms/event.py:14 forms/event_place.py:13
#: forms/organizer.py:12
#: forms/admin_unit.py:13 forms/event.py:14 forms/event_place.py:14
#: forms/organizer.py:13
msgid "Postal code"
msgstr "Postleitzahl"
#: forms/admin_unit.py:13 forms/event.py:15 forms/event_place.py:14
#: forms/organizer.py:13
#: forms/admin_unit.py:14 forms/event.py:15 forms/event_place.py:15
#: forms/organizer.py:14
msgid "City"
msgstr "Stadt/Ort"
#: forms/admin_unit.py:14 forms/event_place.py:15 forms/organizer.py:14
#: forms/admin_unit.py:15 forms/event_place.py:16 forms/organizer.py:15
msgid "State"
msgstr "Bundesland"
#: forms/admin_unit.py:15 forms/event_place.py:16 forms/organizer.py:15
#: forms/admin_unit.py:16 forms/event_place.py:17 forms/organizer.py:16
msgid "Latitude"
msgstr "Breitengrad"
#: forms/admin_unit.py:16 forms/event_place.py:17 forms/organizer.py:16
#: forms/admin_unit.py:17 forms/event_place.py:18 forms/organizer.py:17
msgid "Longitude"
msgstr "Längengrad"
#: forms/admin_unit.py:19 forms/event.py:18 forms/event.py:36 forms/event.py:41
#: forms/event.py:118 forms/event_place.py:20 forms/event_place.py:42
#: forms/organizer.py:19 forms/organizer.py:41 forms/reference.py:18
#: forms/admin_unit.py:20 forms/event.py:18 forms/event.py:36 forms/event.py:41
#: forms/event.py:126 forms/event_place.py:21 forms/event_place.py:45
#: forms/organizer.py:20 forms/organizer.py:44 forms/reference.py:18
#: forms/reference_request.py:14 templates/_macros.html:97
#: templates/admin/admin_units.html:18 templates/event_place/list.html:19
#: templates/profile.html:16 templates/profile.html:36
msgid "Name"
msgstr "Name"
#: forms/admin_unit.py:20
#: forms/admin_unit.py:21
msgid "Short name"
msgstr "Kurzname"
#: forms/admin_unit.py:20
#: forms/admin_unit.py:21
msgid "The short name is used to create a unique identifier for your events"
msgstr ""
"Der Kurzname wird verwendet, um Ihre Veranstaltungen eindeutig zu "
"identifizieren. Der Kurzname darf nur Buchstaben, Nummern und "
"Unterstriche enthalten."
#: forms/admin_unit.py:20
#: forms/admin_unit.py:21
msgid "Short name must contain only letters numbers or underscore"
msgstr "Der Kurzname darf nur Buchstaben, Nummern und Unterstriche enthalten"
#: forms/admin_unit.py:21 forms/event.py:30 forms/event.py:42
#: forms/event_place.py:21 forms/organizer.py:20
#: forms/admin_unit.py:22 forms/event.py:30 forms/event.py:42
#: forms/event_place.py:22 forms/organizer.py:21
msgid "Link URL"
msgstr "Link URL"
#: forms/admin_unit.py:22 forms/admin_unit_member.py:12
#: forms/admin_unit.py:23 forms/admin_unit_member.py:12
#: forms/admin_unit_member.py:22 forms/admin_unit_member.py:26
#: forms/event.py:31 forms/event.py:37 forms/organizer.py:21
#: forms/event.py:31 forms/event.py:37 forms/organizer.py:22
#: templates/_macros.html:203
msgid "Email"
msgstr "Email"
#: forms/admin_unit.py:23 forms/event.py:32 forms/event.py:38
#: forms/organizer.py:22 templates/_macros.html:230
#: forms/admin_unit.py:24 forms/event.py:32 forms/event.py:38
#: forms/organizer.py:23 templates/_macros.html:230
msgid "Phone"
msgstr "Telefon"
#: forms/admin_unit.py:24 forms/event.py:33 forms/organizer.py:23
#: forms/admin_unit.py:25 forms/event.py:33 forms/organizer.py:24
#: templates/_macros.html:238
msgid "Fax"
msgstr "Fax"
#: forms/admin_unit.py:25 forms/organizer.py:24
#: forms/admin_unit.py:26 forms/organizer.py:25
msgid "Logo"
msgstr "Logo"
#: forms/admin_unit.py:25 forms/event.py:69 forms/event_place.py:22
#: forms/organizer.py:24
msgid "Images only!"
msgstr "Nur Fotos!"
#: forms/admin_unit.py:35 templates/admin_unit/create.html:10
#: forms/admin_unit.py:38 templates/admin_unit/create.html:10
#: templates/manage/admin_units.html:18
msgid "Create admin unit"
msgstr "Verwaltungseinheit erstellen"
#: forms/admin_unit.py:38
#: forms/admin_unit.py:41
msgid "Update settings"
msgstr "Einstellungen speichern"
@ -234,15 +229,31 @@ msgstr "Mitglied löschen"
msgid "Update member"
msgstr "Mitglied aktualisieren"
#: forms/common.py:4
#: forms/common.py:8
msgid "File"
msgstr "Datei"
#: forms/common.py:8
msgid "Images only!"
msgstr "Nur Bilder!"
#: forms/common.py:9
msgid "Copyright text"
msgstr "Copyright Text"
#: forms/common.py:10
msgid "Delete image"
msgstr "Bild löschen"
#: forms/common.py:23
msgid "0 (Little relevant)"
msgstr "0 (Wenig relevant)"
#: forms/common.py:14
#: forms/common.py:33
msgid "10 (Highlight)"
msgstr "10 (Highlight)"
#: forms/event.py:20 forms/event_place.py:33 forms/event_place.py:37
#: forms/event.py:20 forms/event_place.py:36 forms/event_place.py:40
msgid "Other organizers can use this location"
msgstr "Andere Veranstalter können diesen Ort verwenden"
@ -254,7 +265,7 @@ msgstr "Organisator"
msgid "Ticket Link URL"
msgstr "Ticket Link"
#: forms/event.py:44 forms/event_place.py:23
#: forms/event.py:44 forms/event_place.py:24
msgid "Description"
msgstr "Beschreibung"
@ -270,7 +281,7 @@ msgstr "Beginn"
msgid "End"
msgstr "Ende"
#: forms/event.py:48 templates/_macros.html:297
#: forms/event.py:48 templates/_macros.html:309
msgid "Previous start date"
msgstr "Vorheriges Startdatum"
@ -278,15 +289,15 @@ msgstr "Vorheriges Startdatum"
msgid "Tags"
msgstr "Stichworte"
#: forms/event.py:51 forms/event.py:141 forms/event_place.py:48
#: templates/_macros.html:363 templates/event/create.html:59
#: templates/event/update.html:46 templates/manage/events.html:17
#: templates/manage/places.html:17 templates/organizer/create.html:16
#: templates/organizer/delete.html:13 templates/organizer/update.html:16
#: forms/event.py:51 forms/event.py:151 forms/event_place.py:51
#: templates/_macros.html:375 templates/event/create.html:59
#: templates/event/update.html:46 templates/manage/places.html:17
#: templates/organizer/create.html:16 templates/organizer/delete.html:13
#: templates/organizer/update.html:16
msgid "Organizer"
msgstr "Veranstalter"
#: forms/event.py:52 forms/event_date.py:20 templates/_macros.html:319
#: forms/event.py:52 forms/event_date.py:20 templates/_macros.html:331
msgid "Category"
msgstr "Kategorie"
@ -338,18 +349,18 @@ msgstr "Online"
msgid "EventAttendanceMode.mixed"
msgstr "Online und offline"
#: forms/event.py:69 forms/event_place.py:22
#: forms/event.py:69 forms/event_place.py:23
msgid "Photo"
msgstr "Foto"
#: forms/event.py:70 forms/event.py:132 forms/reference.py:9
#: forms/event.py:70 forms/event.py:140 forms/reference.py:9
#: forms/reference.py:13 forms/reference_request.py:29
#: templates/event/create.html:139 templates/event/update.html:92
#: templates/event/create.html:140 templates/event/update.html:93
msgid "Rating"
msgstr "Bewertung"
#: forms/event.py:73 forms/event.py:74 forms/event.py:105
#: templates/_macros.html:333 templates/event/create.html:84
#: forms/event.py:73 forms/event.py:74 forms/event.py:107
#: templates/_macros.html:345 templates/event/create.html:84
#: templates/event/update.html:55 templates/event_place/create.html:20
#: templates/event_place/delete.html:13 templates/event_place/update.html:20
msgid "Place"
@ -364,139 +375,138 @@ msgid "Enter new place"
msgstr "Neuen Ort eingeben"
#: forms/event.py:79 templates/event/create.html:31 templates/example.html:10
#: templates/manage/events.html:35 templates/manage/organizers.html:21
#: templates/manage/events.html:16 templates/manage/organizers.html:21
#: templates/manage/widgets.html:19 templates/manage/widgets.html:22
msgid "Create event"
msgstr "Veranstaltung erstellen"
#: forms/event.py:98
#: forms/event.py:100
msgid "Select existing place or enter new place"
msgstr "Existierenden Ort wählen oder neuen Ort eingeben"
#: forms/event.py:107 templates/event/update.html:36
#: forms/event.py:109 templates/event/update.html:36
msgid "Status"
msgstr "Status"
#: forms/event.py:108
#: forms/event.py:110
msgid "EventStatus.scheduled"
msgstr "Geplant"
#: forms/event.py:109
#: forms/event.py:111
msgid "EventStatus.cancelled"
msgstr "Abgesagt"
#: forms/event.py:110
#: forms/event.py:112
msgid "EventStatus.movedOnline"
msgstr "Online verschoben"
#: forms/event.py:111
#: forms/event.py:113
msgid "EventStatus.postponed"
msgstr "Verschoben"
#: forms/event.py:112
#: forms/event.py:114
msgid "EventStatus.rescheduled"
msgstr "Neu angesetzt"
#: forms/event.py:114 templates/event/update.html:8
#: forms/event.py:116 templates/event/update.html:8
msgid "Update event"
msgstr "Veranstaltung aktualisieren"
#: forms/event.py:117 templates/event/delete.html:6
#: forms/event.py:125 templates/event/delete.html:6
#: templates/event/read.html:15
msgid "Delete event"
msgstr "Veranstaltung löschen"
#: forms/event.py:121 forms/reference_request.py:17
#: forms/event.py:129 forms/reference_request.py:17
#: templates/event/review_status.html:16
#: templates/reference_request/review_status.html:12
msgid "Review status"
msgstr "Prüfungsstatus"
#: forms/event.py:122
#: forms/event.py:130
msgid "EventReviewStatus.inbox"
msgstr "Ungeprüft"
#: forms/event.py:123
#: forms/event.py:131
msgid "EventReviewStatus.verified"
msgstr "Verifiziert"
#: forms/event.py:124
#: forms/event.py:132
msgid "EventReviewStatus.rejected"
msgstr "Abgelehnt"
#: forms/event.py:126 forms/reference_request.py:22
#: forms/event.py:134 forms/reference_request.py:22
msgid "Rejection reason"
msgstr "Ablehnungsgrund"
#: forms/event.py:128
#: forms/event.py:136
msgid "EventRejectionReason.duplicate"
msgstr "Duplikat"
#: forms/event.py:129
#: forms/event.py:137
msgid "EventRejectionReason.untrustworthy"
msgstr "Unseriös"
#: forms/event.py:130
#: forms/event.py:138
msgid "EventRejectionReason.illegal"
msgstr "Unzulässig"
#: forms/event.py:134 forms/reference_request.py:30
#: forms/event.py:142 forms/reference_request.py:30
msgid "Save review"
msgstr "Prüfung speichern"
#: forms/event.py:139
msgid "Find events"
msgstr "Veranstaltungen finden"
#: forms/event.py:140 forms/event_date.py:18 templates/manage/events.html:24
msgid "Keyword"
msgstr "Stichwort"
#: forms/event_date.py:16
#: forms/event.py:147 forms/event_date.py:16
msgid "From"
msgstr "Von"
#: forms/event_date.py:17
#: forms/event.py:148 forms/event_date.py:17
msgid "to"
msgstr "bis"
#: forms/event_date.py:22 templates/_macros.html:587
#: templates/manage/events.html:29
#: forms/event.py:149 forms/event_date.py:18
msgid "Keyword"
msgstr "Stichwort"
#: forms/event.py:153
msgid "Find events"
msgstr "Veranstaltungen finden"
#: forms/event_date.py:22 templates/_macros.html:612
msgid "Find"
msgstr "Finden"
#: forms/event_place.py:34 templates/event_place/create.html:10
#: forms/event_place.py:37 templates/event_place/create.html:10
#: templates/event_place/list.html:11 templates/manage/places.html:25
msgid "Create place"
msgstr "Ort hinzufügen"
#: forms/event_place.py:38 templates/event_place/read.html:12
#: forms/event_place.py:41 templates/event_place/read.html:12
#: templates/event_place/update.html:10
msgid "Update place"
msgstr "Ort aktualisieren"
#: forms/event_place.py:41 templates/event_place/delete.html:6
#: forms/event_place.py:44 templates/event_place/delete.html:6
msgid "Delete place"
msgstr "Ort löschen"
#: forms/event_place.py:47
#: forms/event_place.py:50
msgid "Find places"
msgstr "Orte finden"
#: forms/organizer.py:34 templates/manage/organizers.html:12
#: forms/organizer.py:37 templates/manage/organizers.html:12
#: templates/organizer/create.html:10
msgid "Create organizer"
msgstr "Veranstalter hinzufügen"
#: forms/organizer.py:37 templates/organizer/update.html:10
#: forms/organizer.py:40 templates/organizer/update.html:10
msgid "Update organizer"
msgstr "Veranstalter aktualisieren"
#: forms/organizer.py:40 templates/organizer/delete.html:6
#: forms/organizer.py:43 templates/organizer/delete.html:6
msgid "Delete organizer"
msgstr "Veranstalter löschen"
#: forms/reference.py:8 forms/reference_request.py:9 templates/_macros.html:378
#: forms/reference.py:8 forms/reference_request.py:9 templates/_macros.html:390
#: templates/admin_unit/create.html:16 templates/admin_unit/update.html:17
msgid "Admin unit"
msgstr "Verwaltungseinheit"
@ -549,8 +559,8 @@ msgstr "Nicht relevant"
msgid "EventReferenceRequestRejectionReason.illegal"
msgstr "Unzulässig"
#: templates/_macros.html:96 templates/_macros.html:283
#: templates/_macros.html:290
#: templates/_macros.html:96 templates/_macros.html:295
#: templates/_macros.html:302
msgid "Date"
msgstr "Datum"
@ -565,7 +575,7 @@ msgstr "Veranstalter"
msgid "Location"
msgstr "Standort"
#: templates/_macros.html:110 templates/_macros.html:300
#: templates/_macros.html:110 templates/_macros.html:312
msgid "Verified"
msgstr "Verifiziert"
@ -581,34 +591,34 @@ msgstr "Auf Google Maps anzeigen"
msgid "Link"
msgstr "Link"
#: templates/_macros.html:276 templates/event/create.html:38
#: templates/_macros.html:288 templates/event/create.html:38
#: templates/event/delete.html:13 templates/event/update.html:15
#: templates/reference/delete.html:13
msgid "Event"
msgstr "Veranstaltung"
#: templates/_macros.html:286
#: templates/_macros.html:298
#, python-format
msgid "%(count)d event dates"
msgstr "%(count)d Termine"
#: templates/_macros.html:353
#: templates/_macros.html:365
msgid "Show directions"
msgstr "Anreise planen"
#: templates/_macros.html:402
#: templates/_macros.html:414
msgid "Sign in with Google"
msgstr "Mit Google anmelden"
#: templates/_macros.html:462
#: templates/_macros.html:474
msgid "Search location on Google"
msgstr "Ort bei Google suchen"
#: templates/_macros.html:510 templates/_macros.html:512
#: templates/_macros.html:522 templates/_macros.html:524
msgid "Previous"
msgstr "Zurück"
#: templates/_macros.html:515 templates/_macros.html:517
#: templates/_macros.html:527 templates/_macros.html:529
msgid "Next"
msgstr "Weiter"
@ -626,7 +636,7 @@ msgid "Manage"
msgstr "Verwaltung"
#: templates/event_place/read.html:22 templates/layout.html:55
#: templates/layout_manage.html:21 templates/manage/events.html:5
#: templates/layout_manage.html:20 templates/manage/events.html:5
#: templates/manage/events.html:9
msgid "Events"
msgstr "Veranstaltungen"
@ -652,51 +662,56 @@ msgstr "Administration"
msgid "Logout"
msgstr "Ausloggen"
#: templates/layout_manage.html:20 templates/manage/reviews.html:5
#: templates/manage/reviews.html:9
msgid "Reviews"
msgstr "Prüfungen"
#: templates/layout_manage.html:22 templates/manage/references_incoming.html:9
msgid "Incoming references"
msgstr "Eingehende Empfehlungen"
#: templates/layout_manage.html:23 templates/manage/references_outgoing.html:9
msgid "Outgoing references"
msgstr "Ausgehende Empfehlungen"
#: templates/layout_manage.html:24
#: templates/manage/reference_requests_incoming.html:9
msgid "Incoming reference requests"
msgstr "Eingehende Empfehlungsanfragen"
#: templates/layout_manage.html:25
#: templates/manage/reference_requests_outgoing.html:9
msgid "Outgoing reference requests"
msgstr "Ausgehende Empfehlungsanfragen"
#: templates/layout_manage.html:26 templates/manage/organizers.html:5
#: templates/layout_manage.html:21 templates/manage/organizers.html:5
#: templates/manage/organizers.html:9
msgid "Organizers"
msgstr "Veranstalter"
#: templates/event_place/list.html:3 templates/event_place/list.html:7
#: templates/layout_manage.html:27 templates/manage/places.html:5
#: templates/layout_manage.html:22 templates/manage/places.html:5
#: templates/manage/places.html:9
msgid "Places"
msgstr "Orte"
#: templates/layout_manage.html:28 templates/manage/members.html:5
#: templates/layout_manage.html:23 templates/manage/reviews.html:5
#: templates/manage/reviews.html:9
msgid "Reviews"
msgstr "Prüfungen"
#: templates/layout_manage.html:26 templates/manage/references_incoming.html:5
#: templates/manage/references_outgoing.html:5
msgid "References"
msgstr "Empfehlungen"
#: templates/layout_manage.html:29 templates/manage/references_incoming.html:9
msgid "Incoming references"
msgstr "Eingehende Empfehlungen"
#: templates/layout_manage.html:30 templates/manage/references_outgoing.html:9
msgid "Outgoing references"
msgstr "Ausgehende Empfehlungen"
#: templates/layout_manage.html:31
#: templates/manage/reference_requests_incoming.html:9
msgid "Incoming reference requests"
msgstr "Eingehende Empfehlungsanfragen"
#: templates/layout_manage.html:32
#: templates/manage/reference_requests_outgoing.html:9
msgid "Outgoing reference requests"
msgstr "Ausgehende Empfehlungsanfragen"
#: templates/layout_manage.html:35 templates/manage/members.html:5
#: templates/manage/members.html:28
msgid "Members"
msgstr "Mitglieder"
#: templates/layout_manage.html:29 templates/manage/widgets.html:5
#: templates/layout_manage.html:36 templates/manage/widgets.html:5
#: templates/manage/widgets.html:9
msgid "Widgets"
msgstr "Widgets"
#: templates/admin_unit/update.html:11 templates/layout_manage.html:30
#: templates/admin_unit/update.html:11 templates/layout_manage.html:37
msgid "Settings"
msgstr "Einstellungen"
@ -711,10 +726,10 @@ msgstr "Einladungen"
msgid "Admin Units"
msgstr "Verwaltungseinheiten"
#: templates/admin_unit/create.html:44 templates/admin_unit/update.html:45
#: templates/event/create.html:123 templates/event/update.html:76
#: templates/event_place/create.html:44 templates/event_place/update.html:44
#: templates/organizer/create.html:43 templates/organizer/update.html:43
#: templates/admin_unit/create.html:46 templates/admin_unit/update.html:47
#: templates/event/create.html:125 templates/event/update.html:78
#: templates/event_place/create.html:46 templates/event_place/update.html:46
#: templates/organizer/create.html:45 templates/organizer/update.html:45
msgid "Additional information"
msgstr "Zusätzliche Informationen"
@ -817,7 +832,7 @@ msgstr "Empfehlung anfragen für Veranstaltung \"%(name)s\""
msgid "You can visit this page again to check the status."
msgstr "Sie können diese Seite erneut besuchen, um den Status zu prüfen."
#: templates/event/review_status.html:21 templates/manage/events.html:45
#: templates/event/review_status.html:21 templates/manage/events.html:26
#: templates/manage/references_incoming.html:18
#: templates/manage/references_outgoing.html:18
msgid "View"
@ -841,13 +856,13 @@ msgstr "Möchtest du die Einladung von %(name)s akzeptieren?"
msgid "Member"
msgstr "Mitglied"
#: templates/manage/events.html:46 templates/manage/members.html:35
#: templates/manage/events.html:27 templates/manage/members.html:35
#: templates/manage/organizers.html:22 templates/manage/places.html:34
#: templates/manage/references_incoming.html:19
msgid "Edit"
msgstr "Bearbeiten"
#: templates/manage/events.html:47 templates/manage/members.html:21
#: templates/manage/events.html:28 templates/manage/members.html:21
#: templates/manage/members.html:36 templates/manage/organizers.html:23
#: templates/manage/places.html:35 templates/manage/references_incoming.html:20
msgid "Delete"
@ -870,11 +885,6 @@ msgstr "Anfrage prüfen"
msgid "Show review status"
msgstr "Prüfungsstatus anzeigen"
#: templates/manage/references_incoming.html:5
#: templates/manage/references_outgoing.html:5
msgid "References"
msgstr "Empfehlungen"
#: templates/manage/widgets.html:11
msgid "Veranstaltungen als iFrame einbetten"
msgstr "Veranstaltungen als iFrame einbetten"
@ -908,11 +918,11 @@ msgstr "Du hast noch keinen Account? Kein Problem!"
msgid "Widget"
msgstr "Widget"
#: views/admin_unit.py:53
#: views/admin_unit.py:49
msgid "Admin unit successfully created"
msgstr "Verwaltungseinheit erfolgreich erstellt"
#: views/admin_unit.py:75
#: views/admin_unit.py:74
msgid "AdminUnit successfully updated"
msgstr "Verwaltungseinheit erfolgreich aktualisiert"
@ -972,7 +982,7 @@ msgstr "Veranstaltung erfolgreich erstellt"
msgid "Thank you so much! The event is being verified."
msgstr "Vielen Dank! Die Veranstaltung wird geprüft."
#: views/event.py:192
#: views/event.py:188
msgid "New event review"
msgstr "Neue Veranstaltung zu prüfen"
@ -988,7 +998,7 @@ msgstr "Ort erfolgreich aktualisiert"
msgid "Entered name does not match place name"
msgstr "Der eingegebene Name entspricht nicht dem Namen des Ortes"
#: views/event_place.py:75
#: views/event_place.py:76
msgid "Place successfully deleted"
msgstr "Ort erfolgreich gelöscht"

View File

@ -84,7 +84,7 @@ def event_delete(event_id):
db.session.delete(event)
db.session.commit()
flash(gettext('Event successfully deleted'), 'success')
return redirect(url_for('manage_organizer_events', organizer_id=event.organizer_id))
return redirect(url_for('manage_admin_unit_events', id=admin_unit, organizer_id=event.organizer_id))
except SQLAlchemyError as e:
db.session.rollback()
flash(handleSqlError(e), 'danger')

View File

@ -9,6 +9,8 @@ from sqlalchemy import and_, or_, not_
from .utils import get_pagination_urls, permission_missing
from forms.event_place import FindEventPlaceForm
from forms.event import FindEventForm
from services.event_search import EventSearchParams
from services.event import get_events_query
@app.route("/manage")
@auth_required()
@ -65,39 +67,26 @@ def manage_admin_unit_event_reviews(id):
@auth_required()
def manage_admin_unit_events(id):
admin_unit = get_admin_unit_for_manage_or_404(id)
organizer = EventOrganizer.query.filter(EventOrganizer.admin_unit_id == admin_unit.id).order_by(func.lower(EventOrganizer.name)).first()
if organizer:
return redirect(url_for('manage_organizer_events', organizer_id=organizer.id))
params = EventSearchParams()
params.set_default_date_range()
flash('Please create an organizer before you create an event', 'danger')
return redirect(url_for('manage_admin_unit_organizers', id=id))
form = FindEventForm(formdata=request.args, obj=params)
@app.route('/manage/events')
@auth_required()
def manage_organizer_events():
organizer = EventOrganizer.query.get_or_404(request.args.get('organizer_id'))
admin_unit = get_admin_unit_for_manage_or_404(organizer.admin_unit_id)
organizers = EventOrganizer.query.filter(EventOrganizer.admin_unit_id == admin_unit.id).order_by(func.lower(EventOrganizer.name)).all()
keyword = request.args.get('keyword') if 'keyword' in request.args else ""
form = FindEventForm(**request.args)
form.organizer_id.choices = [(o.id, o.name) for o in organizers]
form.organizer_id.choices.insert(0, (0, ''))
if keyword:
like_keyword = '%' + keyword + '%'
event_filter = and_(Event.organizer_id == organizer.id, Event.review_status != EventReviewStatus.inbox, Event.name.ilike(like_keyword))
else:
event_filter = and_(Event.organizer_id == organizer.id, Event.review_status != EventReviewStatus.inbox)
if form.validate():
form.populate_obj(params)
events = Event.query.filter(event_filter).order_by(Event.start).paginate()
params.admin_unit_id = admin_unit.id
events = get_events_query(params).paginate()
return render_template('manage/events.html',
admin_unit=admin_unit,
organizer=organizer,
form=form,
events=events.items,
pagination=get_pagination_urls(events))
pagination=get_pagination_urls(events, id=id))
@app.route('/manage/admin_unit/<int:id>/organizers')
@auth_required()