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

Commit 36c5544

Browse files
committed
Merge pull request #369 from codeeu/revert-359-fea_search_get2
Revert "Even more search improvements - 2nd attempt :)"
2 parents 48b8409 + 0739739 commit 36c5544

15 files changed

+230
-201
lines changed

api/processors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def get_filtered_events(search_filter=None, country_filter=None, theme_filter=No
9999
filter_kwargs['theme__in'] = theme_filter
100100

101101
if audience_filter:
102+
audience = EventAudience.objects.filter()
102103
filter_kwargs['audience__in'] = audience_filter
103104

104105
if len(filter_args) > 0:
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
(function ($) {
2+
'use strict';
3+
4+
$.fn.endlessPaginate = function(options) {
5+
var defaults = {
6+
// Twitter-style pagination container selector.
7+
containerSelector: '.endless_container',
8+
// Twitter-style pagination loading selector.
9+
loadingSelector: '.endless_loading',
10+
// Twitter-style pagination link selector.
11+
moreSelector: 'a.endless_more',
12+
// Digg-style pagination page template selector.
13+
pageSelector: '.endless_page_template',
14+
// Digg-style pagination link selector.
15+
pagesSelector: 'a.endless_page_link',
16+
// Callback called when the user clicks to get another page.
17+
onClick: function() {},
18+
// Callback called when the new page is correctly displayed.
19+
onCompleted: function() {},
20+
// Set this to true to use the paginate-on-scroll feature.
21+
paginateOnScroll: false,
22+
// If paginate-on-scroll is on, this margin will be used.
23+
paginateOnScrollMargin : 1,
24+
// If paginate-on-scroll is on, it is possible to define chunks.
25+
paginateOnScrollChunkSize: 0
26+
},
27+
settings = $.extend(defaults, options);
28+
29+
var getContext = function(link) {
30+
return {
31+
key: link.attr('rel').split(' ')[0],
32+
url: link.attr('href')
33+
};
34+
};
35+
36+
return this.each(function() {
37+
var element = $(this),
38+
loadedPages = 1;
39+
40+
// Twitter-style pagination.
41+
element.on('click', settings.moreSelector, function() {
42+
43+
var link = $(this),
44+
html_link = link.get(0),
45+
container = link.closest(settings.containerSelector),
46+
loading = container.find(settings.loadingSelector);
47+
// Avoid multiple Ajax calls.
48+
if (loading.is(':visible')) {
49+
return false;
50+
}
51+
link.hide();
52+
loading.show();
53+
var context = getContext(link);
54+
// Fire onClick callback.
55+
if (settings.onClick.apply(html_link, [context]) !== false) {
56+
var param = '&querystring_key=' + context.key;
57+
var data = $( "#faceted-search-events" ).serialize()
58+
59+
// Send the Ajax request.
60+
$.post(context.url + param, data, function(fragment) {
61+
container.before(fragment);
62+
container.remove();
63+
// Increase the number of loaded pages.
64+
loadedPages += 1;
65+
// Fire onCompleted callback.
66+
settings.onCompleted.apply(
67+
html_link, [context, fragment.trim()]);
68+
});
69+
}
70+
return false;
71+
});
72+
73+
// On scroll pagination.
74+
if (settings.paginateOnScroll) {
75+
var win = $(window),
76+
doc = $(document);
77+
win.scroll(function(){
78+
if (doc.height() - win.height() -
79+
win.scrollTop() <= settings.paginateOnScrollMargin) {
80+
// Do not paginate on scroll if chunks are used and
81+
// the current chunk is complete.
82+
var chunckSize = settings.paginateOnScrollChunkSize;
83+
if (!chunckSize || loadedPages % chunckSize) {
84+
element.find(settings.moreSelector).click();
85+
}
86+
}
87+
});
88+
}
89+
90+
// Digg-style pagination.
91+
element.on('click', settings.pagesSelector, function() {
92+
93+
var link = $(this),
94+
html_link = link.get(0),
95+
context = getContext(link);
96+
// Fire onClick callback.
97+
if (settings.onClick.apply(html_link, [context]) !== false) {
98+
var page_template = link.closest(settings.pageSelector);
99+
var param = '&querystring_key=' + context.key;
100+
var data = $( "#faceted-search-events" ).serialize()
101+
102+
// Send the Ajax request.
103+
page_template.load(context.url + param, data, function(fragment) {
104+
// Fire onCompleted callback.
105+
settings.onCompleted.apply(
106+
html_link, [context, fragment.trim()]);
107+
});
108+
}
109+
return false;
110+
});
111+
});
112+
};
113+
114+
$.endlessPaginate = function(options) {
115+
return $('body').endlessPaginate(options);
116+
};
117+
118+
})(jQuery);

static/js/faceted-search-events.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@ var Codeweek = window.Codeweek || {};
1515

1616
$('.search-form-element').on('change', function (e) {
1717
var container = $('#events-container');
18-
var search_counter_container = $('#search-counter-container');
1918
var data = $('#faceted-search-events').serialize();
2019
var url = $('#faceted-search-events').attr('action');
2120

22-
if (!Modernizr.history) {
23-
document.getElementById('faceted-search-events').submit();
24-
} else {
25-
$("#events-container").html("<img id='loading-gif' src='/static/img/loading.gif'/>");
26-
$('#events-container').load(url + " #events-container", data);
27-
}
21+
$.post(url, data, function(fragment) {
22+
container.empty();
23+
container.html(fragment);
24+
});
2825
});
2926
});
3027
};

static/js/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,8 @@ var Codeweek = window.Codeweek || {};
232232
// Initialize map on front page
233233
google.maps.event.addDomListener(window, 'load', function () {
234234
var ajaxURL = "/api/event/list/?format=json";
235-
if (past == "on")
236-
ajaxURL = ajaxURL + "&past=on"
235+
if (past == "yes")
236+
ajaxURL = ajaxURL + "&past=yes"
237237

238238
$.ajax({
239239
type: "GET",

web/forms/event_form.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ class SearchEventForm(forms.Form):
164164
if not 'Kosovo' in list(dict(countries._countries).values()):
165165
countries._countries.append((u'XK', u'Kosovo'))
166166

167-
q = forms.CharField(
167+
search = forms.CharField(
168168
required=False,
169169
widget=forms.TextInput(attrs={'placeholder': 'Search for event name or tag', 'class': 'form-control'})
170170
)
171-
past = forms.BooleanField(
171+
past_events = forms.BooleanField(
172172
label='Include past events',
173173
required=False,
174174
widget=forms.CheckboxInput(attrs={'class': 'search-form-element'}),
@@ -197,18 +197,15 @@ class SearchEventForm(forms.Form):
197197
def __init__(self, *args, **kwargs):
198198
country_code = kwargs.pop('country_code', None)
199199
past_events = kwargs.pop('past_events', False)
200-
search_query = kwargs.pop('q', None)
201-
theme = kwargs.pop('theme', None)
202-
audience = kwargs.pop('audience', None)
203-
200+
search_query = kwargs.pop('search', None)
204201
super(SearchEventForm, self).__init__(*args, **kwargs)
205-
206202
if country_code:
207203
self.fields['country'].initial = country_code
208-
self.fields['past'].initial = past_events
204+
self.fields['past_events'].initial = past_events
209205
if search_query:
210-
self.fields['q'].initial = search_query
211-
if theme:
212-
self.fields['theme'].initial = theme
213-
if audience:
214-
self.fields['audience'].initial = audience
206+
self.fields['search'].initial = search_query
207+
208+
209+
210+
211+

web/templates/endless/show_more.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{% load i18n %}
22
{% if querystring %}
3-
<div class="endless_container col-md-6 col-md-offset-3">
4-
<a class="endless_more btn btn-primary btn-lg btn-block" href="{{ path }}{{ querystring }}"
3+
<div class="endless_container">
4+
<a class="endless_more" href="{{ path }}{{ querystring }}"
55
rel="{{ querystring_key }}">{% if label %}{{ label }}{% else %}{% trans "more" %}{% endif %}</a>
66
<div class="endless_loading" style="display: none;">{{ loading|safe }}</div>
77
</div>

web/templates/pages/faceted_search_results.html renamed to web/templates/pages/ajax_faceted_search_events.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{% load endless %}
22

33
{% if events %}
4-
{% lazy_paginate 10 events as pag_events %}
4+
<div class="search-counter">{{ events|length }} {% if events|length > 1 %}events match{% else %}event matches{% endif %} your search criteria:</div>
5+
{% lazy_paginate 6 events as pag_events %}
56
{% for event in pag_events %}
67
{% include 'layout/event_tile_long.html' %}
78
{% endfor %}
@@ -14,3 +15,4 @@ <h3>
1415
</h3>
1516
{% endif %}
1617

18+

web/templates/pages/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@
3333

3434
<div class="container index-content">
3535
<div id="past-events">
36-
{% if past == 'on' %}
36+
{% if past == 'yes' %}
3737
<a id="past-link" href="{% url 'web.index' %}"><i class="fa fa-check-square-o"></i>
3838
{% else %}
39-
<a id="past-link" href="{% url 'web.index' %}?past=on"><i class="fa fa-square-o"></i>
39+
<a id="past-link" href="{% url 'web.index' %}?past=yes"><i class="fa fa-square-o"></i>
4040
{% endif %}
4141
Show past events</a>
4242
</div>
4343
<div class="clearfix">
4444
<div id="search-events-link">
4545
<a class="btn btn-primary btn-lg"
46-
href="{% url 'web.search_events' %}?country={{ country.country_code }}&amp;past={{ past }}">
46+
href="{% url 'web.search_events' %}?country_code={{ country.country_code }}&amp;past={{ past }}">
4747
<i class="fa fa-list"></i> List all events {% if country %}in
4848
<span id="country"> {{ country.country_name }}</span>{% endif %}
4949
</a>

web/templates/pages/scoreboard.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ <h1>#codeEU Events Scoreboard</h1>
1111
<img src="/static/flags/{{ country.country_code|lower }}.png" alt="{{ country.country_name }}" />
1212
<span class="icon-flag">
1313
<span class="country-name">{{ country.country_name }}</span> is participating with
14-
<span class="event-number"><a href="{% url 'web.search_events' %}?country_code={{ country.country_code }}&amp;past=on">{{ country.events }}</span> event{% if country.events != 1 %}s{% endif %}</a>
14+
<span class="event-number"><a href="{% url 'web.search_events' %}?country_code={{ country.country_code }}&amp;past=yes">{{ country.events }}</span> event{% if country.events != 1 %}s{% endif %}</a>
1515
</span>
1616
</div>
1717
{% endfor %}

web/templates/pages/search_events.html

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,41 @@
1111
<div class="container">
1212
<div class="search-page">
1313
<div class="search-options">
14-
<form id="faceted-search-events" method="get" action="{% url 'web.search_events' %}" enctype="multipart/form-data">
14+
<form id="faceted-search-events" method="post" action="{% url 'web.search_events' %}" enctype="multipart/form-data">{% csrf_token %}
1515
{{ form.non_field_errors }}
1616
<div class="row">
17-
<div class="form-group col-md-9">
18-
{{ form.q }}
17+
<div class="form-group col-md-8">
18+
{{ form.search }}
1919
</div>
20-
<div class="col-md-3"><input type="submit" class="btn btn-primary btn-lg" value="Search" /></div>
2120
<div class="col-md-12"><hr></div>
2221
</div>
2322
<div class="row">
2423
<div class="col-md-4">
25-
<label for="{{ form.country.id_for_label }}">{{ form.fields.country.label }}</label>
24+
<label for="id_country">{{ form.fields.country.label }}</label>
2625
{{ form.country }}
26+
2727
<div class="search-checkbox">
2828
<hr>
29-
{{ form.past }}
30-
<label for="{{ form.past.id_for_label }}">{{ form.past.label }}</label>
29+
{{ form.past_events }}
30+
<label for="id_include_past">{{ form.past_events.label }}</label>
3131
</div>
32+
3233
<div class="search-checkbox">
3334
<hr>
3435
<label>{{ form.fields.theme.label }}</label>
3536
{{ form.theme }}
3637
</div>
38+
3739
<div class="search-checkbox">
3840
<hr>
3941
<label>{{ form.fields.audience.label }}</label>
4042
{{ form.audience }}
4143
</div>
4244
<hr>
45+
<input type="submit" class="btn btn-primary btn-lg" value="Search" />
4346
</div>
4447
<div class="col-md-8">
4548
<div id="events-container">
46-
{% if events %}
47-
<div id="search-counter-container" class="search-counter">{{ all_results }} {% if all_results > 1 %}events match{% else %}event matches{% endif %} your search criteria:</span></div>
48-
{% endif %}
4949
{% include page_template %}
5050
</div>
5151
</div>
@@ -58,7 +58,7 @@
5858

5959
{% block custom_js %}
6060
{{ block.super }}
61-
<script type="text/javascript" src="{% static "js/endless_pagination/endless-pagination.js" %}" ></script>
61+
<script type="text/javascript" src="{% static "js/endless_pagination/custom-endless-pagination.js" %}" ></script>
6262
<script type="text/javascript" src="{% static "js/faceted-search-events.js" %}" ></script>
6363
<script type="text/javascript">
6464
Codeweek.FacetedSearch.init();

web/tests/__init__.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class Meta:
1010
model = Event
1111

1212
organizer="Event Organizer"
13-
creator=factory.LazyAttribute(lambda n: User.objects.get_or_create(username='test_user')[0])
13+
creator=factory.LazyAttribute(lambda n: User.objects.get(pk=1))
1414
title="My Coding Event"
1515
description="Some description"
1616
location="Nonexisting location"
@@ -20,9 +20,6 @@ class Meta:
2020
country="SI"
2121
tags=["tag1", "tag2"]
2222

23-
audience=[1]
24-
theme=[1]
25-
2623
start_date=factory.LazyAttribute(lambda n: datetime.datetime.now() + datetime.timedelta(days=1, hours=3) )
2724
end_date=factory.LazyAttribute(lambda n: datetime.datetime.now() + datetime.timedelta(days=3, hours=3) )
2825

0 commit comments

Comments
 (0)