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) %}