From 9e1067952d698a719c5c74d0f490989a367c7f6b Mon Sep 17 00:00:00 2001 From: Daniel Grams Date: Mon, 5 Oct 2020 11:38:58 +0200 Subject: [PATCH] Event-Liste: Veranstalter optional --- forms/event.py | 10 +- services/event.py | 54 +++-- services/event_search.py | 4 + templates/_macros.html | 13 ++ templates/layout_manage.html | 2 +- templates/manage/events.html | 26 +-- translations/de/LC_MESSAGES/messages.mo | Bin 14170 -> 14287 bytes translations/de/LC_MESSAGES/messages.po | 292 ++++++++++++------------ views/event.py | 2 +- views/manage.py | 33 +-- 10 files changed, 232 insertions(+), 204 deletions(-) diff --git a/forms/event.py b/forms/event.py index 35130eb..382150f 100644 --- a/forms/event.py +++ b/forms/event.py @@ -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) \ No newline at end of file + + organizer_id = SelectField(lazy_gettext('Organizer'), validators=[Optional()], coerce=int) + + submit = SubmitField(lazy_gettext("Find events")) \ No newline at end of file diff --git a/services/event.py b/services/event.py index b5459c5..116a4ea 100644 --- a/services/event.py +++ b/services/event.py @@ -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 diff --git a/services/event_search.py b/services/event_search.py index ececf8e..88380e3 100644 --- a/services/event_search.py +++ b/services/event_search.py @@ -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'] diff --git a/templates/_macros.html b/templates/_macros.html index 6af7c20..8b0ec4d 100644 --- a/templates/_macros.html +++ b/templates/_macros.html @@ -568,6 +568,8 @@ $( function() { {% macro render_event_dates_filter_form(form) %}
+ {{ form.hidden_tag() }} +
{{ form.date_from.label() }} @@ -582,12 +584,23 @@ $( function() { {{ form.date_to(class="form-control datepicker")|safe }}
+ {% if form.category_id %}
{{ form.category_id.label() }}
{{ form.category_id(class="form-control")|safe }}
+ {% endif %} + + {% if form.organizer_id %} +
+
+ {{ form.organizer_id.label() }} +
+ {{ form.organizer_id(class="form-control")|safe }} +
+ {% endif %}
diff --git a/templates/layout_manage.html b/templates/layout_manage.html index 070b309..6938c93 100644 --- a/templates/layout_manage.html +++ b/templates/layout_manage.html @@ -23,7 +23,7 @@ {{ render_submenu_item('reviews', _('Reviews'), url_for('manage_admin_unit_event_reviews', id=admin_unit.id), active_id) }} {% endfor %} diff --git a/translations/de/LC_MESSAGES/messages.mo b/translations/de/LC_MESSAGES/messages.mo index 75b385e457071f0a6cad2e4807276950d7698755..f535a0158b9aa3b15c3355f7e731610a0fa3e6a9 100644 GIT binary patch delta 4019 zcmYM#32@C<6vy!!UJ}_vNPRKuvX zRk4euet&sqTJz*{@BjVpz2}~D|NnRK?b8L`s|`I% z9sln0KZgJ71J(QgUwXK6QFJrV54&R{?1}YpCIuEY@h3WISQ#$h=& zch2k1(+J~2josjB;2cdCj`c7OJ=hW%;4&~C2jKHK5o2)?D)z5Yf$hQwJc6Nk4*9s7 z*8dAVtnd7|O9KN?JE@Nv5M?GHAD6`+1=Tj*Bn|SD-eq4wZq; zsLYgMBi46&Xw=11sGXn147`ph7~asi7T5t(aisMZ;&b$Oq9#0rTDTIm&^1(mcd!{g zLfzkp`pHc6Ds_GBLOwR7KN~e*wO!whne;0$9qUAr4a~w;I0BP#F)F~lW)-Sr4LCqL zTUnTZ1F$g`M3H|*GLH+g1o^lFc0;B0?^@rFlcn#Qq5{l99j5-Mg~p>wxB!*SrZn%P~;T=@1AKUdn!qtFCGagl{bnADrejn8MA*gxtQS%g{ z0-KFGYx7YhFZR;V;aF;}L@l(&EVb+9sHb7S^?yJua2%D1^GJ2v1N%O(iErnj7|->_ zW_wh|hN4R1okl|oevXQ;#QIxMk?uk*bO05=aa6#S*1v!{oY$>ij{~IdBT(~2qe>BL z{bVx}3Eb=2`WkK!YQc%93EoB3YC5Xs3+?(^RKOci6YoUTe!qFie1fWdQx28_Ohjd> zKPprC=&$Gh{o00ev&?zO#}%2I&BLf2T}1^@h04f%)Pzq^8>r7JwL3?hkytYWxy5xx zoJXNq z0^EaoUmQZOZa7Lq1J9v$b`!~-yN61B5HE?A7>C+%A5?&Yup_>S+UYWL6DlL+sGXj$ z{#De%)#l%^p-OlQb@-mz_f6OZZ)fLCrlEnIFc}A88cso_Y#nN%?@*81LG!rz z3o7ud*aE|nd_P)kkdGVAAMJQ9DzHzGW93#MrS`hrG<2%Zpi+7p{qZp>rT>`qn4Pz= zi$ImAB`WY7R3`eOb~+4IvUgBtW+rMQi|zV4RB5)?O8xiIPyj!o7QTiWScM*Zj9Ta! zcEAYIB>Q7m{LnmV*MoRe6i9bephGbb^DzJmP>1|IjA4EEDGkc$N|ExopUi4xO&6Ww z3!pP=codpl!hhsD3T)8yN##~Isk1-9mquvLXQLo@?)VMHi4rhHA zOG7Enz}mxxs%;mHz`>}9$Dk&fhMH&*@^M@F6NZ;jCA@<@@Byk+?OXZY3%RHa=9x3m zs~s<+p@mCPf$X&Y0aPlFph|PnzW?34hpO=tq^vHcwR10FKYRs0!ew|AyWog6yc2K@ z>a5&qL;f4lc)$hiEU>Mw1hHl|>SwbjD&?b4JD-XXxCFJM4VZ%!s6ZcLB8G8M3$;RJ z=4Fh=-lz=^&mkNwkjDk>bQThen~&YF0##eTcFyr}>HN{z7>&JfF6wZeD0^JL$S<^D z(zMCr^2Zj&7v@b}GN-{<&%{yrd1W^mj0>nUA+M}Y;~T+&ZR4}EJGO3DmYon>H>~@A r0|qmoL((Eow{a6jmsKPM`1|)5RhTz!$>G$V0lJnqxhyR0)zE(dWHXc| delta 3937 zcmYM$3v8Cv8Nl&_Efh+z+zJZS7O16H?o_Sdl| z-iCc~HRj_FumoH1@{}^Eor8Xycqwjp4f&)KeD%hUFc<%WJdiG6DHiunX$02eWq30h z`+6LJo3H>MMLy{l(S923?{}ET_~|eQ&fsX=a2)NR3k~d3eV&?O2J2upB?YDjYm8+n$cYXg8uAZbS!e zK?iC>1Kfqf@mJ{mhr?57rY=N#IMHM-U7WDid*i|Z^noMcYsk7w|BCk6XrD)) zFJO8OI2`S#0u8JVU6l1`&F7$NV=mhNS2J<2BrY_ftA0ha*PtD*Lo@J0qzdWhaeW^; z;{#ZVFNN=*nd*H>wiFfUfOF8mz83AwA`Xo3JLo_w(E!$=kv2!W1znU|qrE?_KaY0! zB3go1qJ2Dk0}cGGFtOkquNdh+lgc=-MwLie)70#RG#`z40ow60wB{?q2g4`P3>-lN zd=(w=b2L*!SaI%_s&HIbhr`_eS9c$X?B4&oI573kU}J9S<+fwyV+1%tr%X zjArO2bcVMgRZ6ST5^TXb+=jk6U&b-`MYL-({Dd(^T8gu9173uOu(b#K8J)>DMrD6~ z8_`tXg3j#wXe}Q^OZW)7_@0XEhmp5%I*vZ~9*)K@uo^SvOw$=(k9PEJbh|Z$>%#ld z$Xn4xc@QhH3$MU_d^zKZ$g)Y(&>Am77xQW~lbf+8?nE+~NxQQLX%F%?O}{}SJ%Y~s zALz_JKx>!7=+?478h9Ccell8$S>bi)z>Baa-i|)E7IX1OIMDsSm4mA|@p$+K&ZIq* zJn3Te`eSGy$I!*|9_Ha^*b949WM|wP%|I#o>sOCtJ1q?#K!!+ra3JHSqa4`LDYTt5vB(iEXHEs1s&dfz1Uxf#)(8`l@0_um}t+v55f%=o|t4ovlC^v1`~ z89spq)``yOAhILV-@ADEjqw@^tqOBYh2%ncDx&1Z0&JR}8=YBh zZ8k;4XosV)0LP*oT#c^kn~)uuHpcaK97nqo9q=@E_s2`ak`$u@mZ7DnM7C!p)pEd3 zb!tEt*;4ez_2|IOXa^6W+wW1dhI`SOccQ6$4ju3>Xn^mc`@LXnwj`xkN_$4Q3=7=< z%^bKG9>PL=0x5gihvV@ij>bVuk1C~UXduhcSM7TAxgFsiv;@zffgVCj`v-KFoj?Qr z7>nHhxr|~*!_WaI^VJWRqcyw>XXAZnsSe@AcoKcXoeld;$j*2qI&d8tNPV=gK{GiI z&D0H;@rEW2^j@^an~?IQcASRCa0U*TNc!=5oQ`MkD_AutyH@T%Q+^+sp@*ZrCp?J$ zI{q2W`1_N{zcbI7oK4N;=#0i;9nM7~-GF7d16`EQqM7+U+R__dyb|~O|8w{2N1SNDLe9E67j{$@w)SXyvHy2Ft{kwmSI19=p2*LeR62g* z)Cp5Mnn&j6w9P9kYWwvS_jJ^ipU-WZQawArp=nLiog>nmTUWK+IHtJc@#>m_{{dsX Bds+Yh diff --git a/translations/de/LC_MESSAGES/messages.po b/translations/de/LC_MESSAGES/messages.po index b25ede9..ec87f22 100644 --- a/translations/de/LC_MESSAGES/messages.po +++ b/translations/de/LC_MESSAGES/messages.po @@ -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 \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" diff --git a/views/event.py b/views/event.py index 52cba0b..e506320 100644 --- a/views/event.py +++ b/views/event.py @@ -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') diff --git a/views/manage.py b/views/manage.py index 381ac34..186cbbf 100644 --- a/views/manage.py +++ b/views/manage.py @@ -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//organizers') @auth_required()