Skip to content
This repository was archived by the owner on Sep 19, 2018. It is now read-only.

Commit 4c8e7e3

Browse files
committed
Merge pull request #260 from sparkica/paginated_search
Paginated search
2 parents 47bb493 + af9739c commit 4c8e7e3

File tree

5 files changed

+109
-4
lines changed

5 files changed

+109
-4
lines changed

api/processors.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,18 @@ def get_next_or_previous (event, country_code=None, past=False, direction=True):
7575
return next_event
7676

7777

78-
def get_filtered_events(search_filter=None, country_filter=None, theme_filter=None, audience_filter=None):
78+
def get_filtered_events(search_filter=None, country_filter=None, theme_filter=None, audience_filter=None, past_events=None):
7979

8080
"""
8181
Filter events by given filter
8282
"""
8383
filter_args = ()
8484

8585
# default
86-
filter_kwargs = {'status': 'APPROVED', 'end_date__gte': datetime.datetime.now()}
86+
filter_kwargs = {'status': 'APPROVED'}
87+
88+
if not past_events:
89+
filter_kwargs['end_date__gte']= datetime.datetime.now()
8790

8891
if search_filter:
8992
filter_args = (Q(title__icontains=search_filter) | Q(description__icontains=search_filter) | Q(tags__name__icontains=search_filter)

api/tests.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,89 @@ def test_get_filtered_events_with_theme_filter_and_audience_filter_with_more_app
370370
events = get_filtered_events(theme_filter=theme_filter, audience_filter=audience_filter)
371371
self.assertEquals(2, events.count())
372372

373+
def test_get_filtered_events_with_theme_filter_and_audience_filter_with_past_approved_events(self):
374+
event = Event.objects.create(
375+
organizer='CodeCatz',
376+
creator=User.objects.filter(pk=1)[0],
377+
title='Programming for dummies',
378+
description='Learn basics about programming in python',
379+
location='Ljubljana',
380+
start_date=datetime.datetime.now() - datetime.timedelta(days=2, hours=3),
381+
end_date=datetime.datetime.now() - datetime.timedelta(days=1, hours=3),
382+
event_url='http://example.com',
383+
contact_person='[email protected]',
384+
country='SI',
385+
pub_date=datetime.datetime.now() - datetime.timedelta(days=2, hours=1))
386+
theme = EventTheme.objects.filter(pk=1)
387+
audience = EventAudience.objects.filter(pk=1)
388+
event.theme.add(*theme)
389+
event.audience.add(*audience)
390+
event.status = 'APPROVED'
391+
event.save()
392+
393+
test_event = Event.objects.get(title='asdasd')
394+
test_event.status = 'APPROVED'
395+
test_event.save()
396+
theme_filter = EventTheme.objects.filter(pk=1)
397+
audience_filter = EventAudience.objects.filter(pk=1)
398+
events = get_filtered_events(theme_filter=theme_filter, audience_filter=audience_filter, past_events=True)
399+
self.assertEquals(2, events.count())
400+
401+
def test_get_filtered_events_with_search_filter_searching_description_and_past_events(self):
402+
event = Event.objects.create(
403+
organizer='CodeCatz',
404+
creator=User.objects.filter(pk=1)[0],
405+
title='Programming for dummies',
406+
description='Learn basics about programming in python',
407+
location='Ljubljana',
408+
start_date=datetime.datetime.now() - datetime.timedelta(days=4,hours=3),
409+
end_date=datetime.datetime.now() - datetime.timedelta(days=3, hours=3),
410+
event_url='http://example.com',
411+
contact_person='[email protected]',
412+
country='SI',
413+
pub_date=datetime.datetime.now() - datetime.timedelta(days=4, hours=2))
414+
theme = EventTheme.objects.filter(pk=1)
415+
audience = EventAudience.objects.filter(pk=1)
416+
event.theme.add(*theme)
417+
event.audience.add(*audience)
418+
event.status = 'APPROVED'
419+
event.save()
420+
421+
search_filter = "python"
422+
events = get_filtered_events(search_filter=search_filter, past_events=True)
423+
self.assertEquals(1, events.count())
424+
self.assertEquals(2, events[0].pk)
425+
426+
427+
def test_get_filtered_events_with_search_filter_and_more_past_approved_events(self):
428+
event = Event.objects.create(
429+
organizer='CodeCatz',
430+
creator=User.objects.filter(pk=1)[0],
431+
title='Programming for dummies asdasd',
432+
description='Learn basics about programming in python',
433+
location='Ljubljana',
434+
start_date=datetime.datetime.now() - datetime.timedelta(days=2, hours=3),
435+
end_date=datetime.datetime.now() - datetime.timedelta(days=1, hours=1),
436+
event_url='http://example.com',
437+
contact_person='[email protected]',
438+
country='SI',
439+
pub_date=datetime.datetime.now() - datetime.timedelta(days=2, hours=1))
440+
theme = EventTheme.objects.filter(pk=1)
441+
audience = EventAudience.objects.filter(pk=1)
442+
event.theme.add(*theme)
443+
event.audience.add(*audience)
444+
event.status = 'APPROVED'
445+
event.save()
446+
447+
test_event = Event.objects.get(title='asdasd')
448+
test_event.status = 'APPROVED'
449+
test_event.save()
450+
search_filter = "asdasd"
451+
events = get_filtered_events(search_filter=search_filter, past_events=True)
452+
self.assertEquals(2, events.count())
453+
454+
455+
373456
def test_event_without_creator_returns_exception(self):
374457
with self.assertRaises(IntegrityError):
375458
event = Event.objects.create(

web/forms/event_form.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ class SearchEventForm(forms.Form):
162162
required=False,
163163
widget=forms.TextInput(attrs={'placeholder': 'Search for event name or tag', 'class': 'form-control'})
164164
)
165+
past_events = forms.BooleanField(
166+
label='Include past events',
167+
required=False,
168+
widget=forms.CheckboxInput(attrs={'class': 'search-form-element'}),
169+
#choices=countries
170+
)
165171
country = forms.ChoiceField(
166172
label='Select country',
167173
required=False,

web/templates/pages/search_events.html

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{% extends 'base.html' %}
2+
{% load endless %}
23
{% load static %}
34

45
{% block title %}- Search Events{% endblock title %}
@@ -21,6 +22,12 @@
2122
<label for="id_country">{{ form.fields.country.label }}</label>
2223
{{ form.country }}
2324

25+
<div class="search-checkbox">
26+
<hr>
27+
{{ form.past_events }}
28+
<label for="id_include_past">{{ form.past_events.label }}</label>
29+
</div>
30+
2431
<div class="search-checkbox">
2532
<hr>
2633
<label>{{ form.fields.theme.label }}</label>
@@ -38,9 +45,14 @@
3845
<div class="col-md-8">
3946
<div id="events-container">
4047
{% if events %}
41-
{% for event in events %}
48+
{% paginate 6 events as pag_events %}
49+
50+
{% for event in pag_events %}
4251
{% include 'layout/event_tile_long.html' %}
4352
{% endfor %}
53+
54+
{% show_pages %}
55+
4456
{% else %}
4557
<h3>
4658
Sorry, no events matching your search criteria. Try expanding your search.

web/views/events.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,9 @@ def search_events(request):
269269
country_filter = form.cleaned_data.get('country', None)
270270
theme_filter = form.cleaned_data.get('theme', None)
271271
audience_filter = form.cleaned_data.get('audience', None)
272+
past_events = form.cleaned_data.get('past_events',None)
272273

273-
events = get_filtered_events(search_filter, country_filter, theme_filter, audience_filter)
274+
events = get_filtered_events(search_filter, country_filter, theme_filter, audience_filter, past_events)
274275
country = {'country_code': country_filter}
275276
else:
276277
form = SearchEventForm(country_code=country['country_code'])

0 commit comments

Comments
 (0)