Browse Source

Merge pull request #634 from kvch/advanced-search

support time range search
Adam Tauber 8 years ago
parent
commit
7d9c898170

+ 2
- 1
searx/engines/__init__.py View File

42
                        'shortcut': '-',
42
                        'shortcut': '-',
43
                        'disabled': False,
43
                        'disabled': False,
44
                        'suspend_end_time': 0,
44
                        'suspend_end_time': 0,
45
-                       'continuous_errors': 0}
45
+                       'continuous_errors': 0,
46
+                       'time_range_support': False}
46
 
47
 
47
 
48
 
48
 def load_module(filename):
49
 def load_module(filename):

+ 8
- 0
searx/engines/deviantart.py View File

21
 # engine dependent config
21
 # engine dependent config
22
 categories = ['images']
22
 categories = ['images']
23
 paging = True
23
 paging = True
24
+time_range_support = True
24
 
25
 
25
 # search-url
26
 # search-url
26
 base_url = 'https://www.deviantart.com/'
27
 base_url = 'https://www.deviantart.com/'
27
 search_url = base_url + 'browse/all/?offset={offset}&{query}'
28
 search_url = base_url + 'browse/all/?offset={offset}&{query}'
29
+time_range_url = '&order={range}'
30
+
31
+time_range_dict = {'day': 11,
32
+                   'week': 14,
33
+                   'month': 15}
28
 
34
 
29
 
35
 
30
 # do search-request
36
 # do search-request
33
 
39
 
34
     params['url'] = search_url.format(offset=offset,
40
     params['url'] = search_url.format(offset=offset,
35
                                       query=urlencode({'q': query}))
41
                                       query=urlencode({'q': query}))
42
+    if params['time_range']:
43
+        params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
36
 
44
 
37
     return params
45
     return params
38
 
46
 

+ 9
- 0
searx/engines/duckduckgo.py View File

22
 categories = ['general']
22
 categories = ['general']
23
 paging = True
23
 paging = True
24
 language_support = True
24
 language_support = True
25
+time_range_support = True
25
 
26
 
26
 # search-url
27
 # search-url
27
 url = 'https://duckduckgo.com/html?{query}&s={offset}'
28
 url = 'https://duckduckgo.com/html?{query}&s={offset}'
29
+time_range_url = '&df={range}'
30
+
31
+time_range_dict = {'day': 'd',
32
+                   'week': 'w',
33
+                   'month': 'm'}
28
 
34
 
29
 # specific xpath variables
35
 # specific xpath variables
30
 result_xpath = '//div[@class="result results_links results_links_deep web-result "]'  # noqa
36
 result_xpath = '//div[@class="result results_links results_links_deep web-result "]'  # noqa
61
         params['url'] = url.format(
67
         params['url'] = url.format(
62
             query=urlencode({'q': query}), offset=offset)
68
             query=urlencode({'q': query}), offset=offset)
63
 
69
 
70
+    if params['time_range']:
71
+        params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
72
+
64
     return params
73
     return params
65
 
74
 
66
 
75
 

+ 8
- 0
searx/engines/google.py View File

24
 paging = True
24
 paging = True
25
 language_support = True
25
 language_support = True
26
 use_locale_domain = True
26
 use_locale_domain = True
27
+time_range_support = True
27
 
28
 
28
 # based on https://en.wikipedia.org/wiki/List_of_Google_domains and tests
29
 # based on https://en.wikipedia.org/wiki/List_of_Google_domains and tests
29
 default_hostname = 'www.google.com'
30
 default_hostname = 'www.google.com'
92
               search_path +
93
               search_path +
93
               '?{query}&start={offset}&gws_rd=cr&gbv=1&lr={lang}&ei=x')
94
               '?{query}&start={offset}&gws_rd=cr&gbv=1&lr={lang}&ei=x')
94
 
95
 
96
+time_range_search = "&tbs=qdr:{range}"
97
+time_range_dict = {'day': 'd',
98
+                   'week': 'w',
99
+                   'month': 'm'}
100
+
95
 # other URLs
101
 # other URLs
96
 map_hostname_start = 'maps.google.'
102
 map_hostname_start = 'maps.google.'
97
 maps_path = '/maps'
103
 maps_path = '/maps'
179
                                       query=urlencode({'q': query}),
185
                                       query=urlencode({'q': query}),
180
                                       hostname=google_hostname,
186
                                       hostname=google_hostname,
181
                                       lang=url_lang)
187
                                       lang=url_lang)
188
+    if params['time_range']:
189
+        params['url'] += time_range_search.format(range=time_range_dict[params['time_range']])
182
 
190
 
183
     params['headers']['Accept-Language'] = language
191
     params['headers']['Accept-Language'] = language
184
     params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
192
     params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'

+ 7
- 0
searx/engines/google_images.py View File

19
 categories = ['images']
19
 categories = ['images']
20
 paging = True
20
 paging = True
21
 safesearch = True
21
 safesearch = True
22
+time_range_support = True
22
 
23
 
23
 search_url = 'https://www.google.com/search'\
24
 search_url = 'https://www.google.com/search'\
24
     '?{query}'\
25
     '?{query}'\
25
     '&tbm=isch'\
26
     '&tbm=isch'\
26
     '&ijn=1'\
27
     '&ijn=1'\
27
     '&start={offset}'
28
     '&start={offset}'
29
+time_range_search = "&tbs=qdr:{range}"
30
+time_range_dict = {'day': 'd',
31
+                   'week': 'w',
32
+                   'month': 'm'}
28
 
33
 
29
 
34
 
30
 # do search-request
35
 # do search-request
34
     params['url'] = search_url.format(query=urlencode({'q': query}),
39
     params['url'] = search_url.format(query=urlencode({'q': query}),
35
                                       offset=offset,
40
                                       offset=offset,
36
                                       safesearch=safesearch)
41
                                       safesearch=safesearch)
42
+    if params['time_range']:
43
+        params['url'] += time_range_search.format(range=time_range_dict[params['time_range']])
37
 
44
 
38
     if safesearch and params['safesearch']:
45
     if safesearch and params['safesearch']:
39
         params['url'] += '&' + urlencode({'safe': 'active'})
46
         params['url'] += '&' + urlencode({'safe': 'active'})

+ 26
- 8
searx/engines/yahoo.py View File

20
 categories = ['general']
20
 categories = ['general']
21
 paging = True
21
 paging = True
22
 language_support = True
22
 language_support = True
23
+time_range_support = True
23
 
24
 
24
 # search-url
25
 # search-url
25
 base_url = 'https://search.yahoo.com/'
26
 base_url = 'https://search.yahoo.com/'
26
 search_url = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}'
27
 search_url = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}'
28
+search_url_with_time = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}&age={age}&btf={btf}&fr2=time'
27
 
29
 
28
 # specific xpath variables
30
 # specific xpath variables
29
 results_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' Sr ')]"
31
 results_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' Sr ')]"
32
 content_xpath = './/div[@class="compText aAbs"]'
34
 content_xpath = './/div[@class="compText aAbs"]'
33
 suggestion_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' AlsoTry ')]//a"
35
 suggestion_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' AlsoTry ')]//a"
34
 
36
 
37
+time_range_dict = {'day': ['1d', 'd'],
38
+                   'week': ['1w', 'w'],
39
+                   'month': ['1m', 'm']}
40
+
35
 
41
 
36
 # remove yahoo-specific tracking-url
42
 # remove yahoo-specific tracking-url
37
 def parse_url(url_string):
43
 def parse_url(url_string):
51
         return unquote(url_string[start:end])
57
         return unquote(url_string[start:end])
52
 
58
 
53
 
59
 
60
+def _get_url(query, offset, language, time_range):
61
+    if time_range:
62
+        return base_url + search_url_with_time.format(offset=offset,
63
+                                                      query=urlencode({'p': query}),
64
+                                                      lang=language,
65
+                                                      age=time_range_dict[time_range][0],
66
+                                                      btf=time_range_dict[time_range][1])
67
+    return base_url + search_url.format(offset=offset,
68
+                                        query=urlencode({'p': query}),
69
+                                        lang=language)
70
+
71
+
72
+def _get_language(params):
73
+    if params['language'] == 'all':
74
+        return 'en'
75
+    return params['language'].split('_')[0]
76
+
77
+
54
 # do search-request
78
 # do search-request
55
 def request(query, params):
79
 def request(query, params):
56
     offset = (params['pageno'] - 1) * 10 + 1
80
     offset = (params['pageno'] - 1) * 10 + 1
81
+    language = _get_language(params)
57
 
82
 
58
-    if params['language'] == 'all':
59
-        language = 'en'
60
-    else:
61
-        language = params['language'].split('_')[0]
62
-
63
-    params['url'] = base_url + search_url.format(offset=offset,
64
-                                                 query=urlencode({'p': query}),
65
-                                                 lang=language)
83
+    params['url'] = _get_url(query, offset, language, params['time_range'])
66
 
84
 
67
     # TODO required?
85
     # TODO required?
68
     params['cookies']['sB'] = 'fl=1&vl=lang_{lang}&sh=1&rw=new&v=1'\
86
     params['cookies']['sB'] = 'fl=1&vl=lang_{lang}&sh=1&rw=new&v=1'\

+ 10
- 2
searx/search.py View File

138
         self.paging = False
138
         self.paging = False
139
         self.pageno = 1
139
         self.pageno = 1
140
         self.lang = 'all'
140
         self.lang = 'all'
141
+        self.time_range = None
142
+        self.is_advanced = None
141
 
143
 
142
         # set blocked engines
144
         # set blocked engines
143
         self.disabled_engines = request.preferences.engines.get_disabled()
145
         self.disabled_engines = request.preferences.engines.get_disabled()
178
         if len(query_obj.languages):
180
         if len(query_obj.languages):
179
             self.lang = query_obj.languages[-1]
181
             self.lang = query_obj.languages[-1]
180
 
182
 
181
-        self.engines = query_obj.engines
183
+        self.time_range = self.request_data.get('time_range')
184
+        self.is_advanced = self.request_data.get('advanced_search')
182
 
185
 
183
-        self.categories = []
186
+        self.engines = query_obj.engines
184
 
187
 
185
         # if engines are calculated from query,
188
         # if engines are calculated from query,
186
         # set categories by using that informations
189
         # set categories by using that informations
279
             if self.lang != 'all' and not engine.language_support:
282
             if self.lang != 'all' and not engine.language_support:
280
                 continue
283
                 continue
281
 
284
 
285
+            if self.time_range and not engine.time_range_support:
286
+                continue
287
+
282
             # set default request parameters
288
             # set default request parameters
283
             request_params = default_request_params()
289
             request_params = default_request_params()
284
             request_params['headers']['User-Agent'] = user_agent
290
             request_params['headers']['User-Agent'] = user_agent
293
 
299
 
294
             # 0 = None, 1 = Moderate, 2 = Strict
300
             # 0 = None, 1 = Moderate, 2 = Strict
295
             request_params['safesearch'] = request.preferences.get_value('safesearch')
301
             request_params['safesearch'] = request.preferences.get_value('safesearch')
302
+            request_params['time_range'] = self.time_range
303
+            request_params['advanced_search'] = self.is_advanced
296
 
304
 
297
             # update request parameters dependent on
305
             # update request parameters dependent on
298
             # search-engine (contained in engines folder)
306
             # search-engine (contained in engines folder)

+ 6
- 3
searx/static/plugins/js/search_on_category_select.js View File

4
             $('#categories input[type="checkbox"]').each(function(i, checkbox) {
4
             $('#categories input[type="checkbox"]').each(function(i, checkbox) {
5
                 $(checkbox).prop('checked', false);
5
                 $(checkbox).prop('checked', false);
6
             });
6
             });
7
-            $('#categories label').removeClass('btn-primary').removeClass('active').addClass('btn-default');
8
-            $(this).removeClass('btn-default').addClass('btn-primary').addClass('active');
9
-            $($(this).children()[0]).prop('checked', 'checked');
7
+            $(document.getElementById($(this).attr("for"))).prop('checked', true);
10
             if($('#q').val()) {
8
             if($('#q').val()) {
11
                 $('#search_form').submit();
9
                 $('#search_form').submit();
12
             }
10
             }
13
             return false;
11
             return false;
14
         });
12
         });
13
+        $('#time-range > option').click(function(e) {
14
+            if($('#q').val()) {
15
+                $('#search_form').submit();
16
+            }
17
+        });
15
     }
18
     }
16
 });
19
 });

+ 1
- 1
searx/static/themes/oscar/css/logicodev.min.css
File diff suppressed because it is too large
View File


+ 1
- 1
searx/static/themes/oscar/css/pointhi.min.css
File diff suppressed because it is too large
View File


+ 68
- 0
searx/static/themes/oscar/less/logicodev/advanced.less View File

1
+#advanced-search-container {
2
+    display:none;
3
+    text-align:left;
4
+    margin-bottom:1rem;
5
+
6
+    label, .input-group-addon {
7
+        font-size: 1.2rem;
8
+        font-weight:normal;
9
+        background-color: white;
10
+        border: @mild-gray 1px solid;
11
+        border-right: none;
12
+        color: @dark-gray;
13
+        padding-bottom: 0.4rem;
14
+        padding-top: 0.4rem;
15
+        padding-left: 0.5rem;
16
+        padding-right: 0.5rem;
17
+    }
18
+
19
+    label:last-child, .input-group-addon:last-child {
20
+        border-right: @mild-gray 1px solid;
21
+    }
22
+
23
+    input[type="radio"] {
24
+        display: none;
25
+    }
26
+
27
+    input[type="radio"]:checked + label{
28
+        color: @black;
29
+        font-weight:bold;
30
+        border-bottom: @light-green 5px solid;
31
+    }
32
+    select {
33
+        appearance: none;
34
+        -webkit-appearance: none;
35
+        -moz-appearance: none;
36
+        font-size: 1.2rem;
37
+        font-weight:normal;
38
+        background-color: white;
39
+        border: @mild-gray 1px solid;
40
+        color: @dark-gray;
41
+        padding-bottom: 0.4rem;
42
+        padding-top: 0.4rem;
43
+        padding-left: 1rem;
44
+        padding-right: 5rem;
45
+        margin-right: 0.5rem;
46
+        background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
47
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ
48
+cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn
49
+sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8
50
+6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0
51
+ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w
52
+Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb
53
+7jwaAAAAAElFTkSuQmCC) 96% no-repeat;
54
+    }
55
+}
56
+
57
+#check-advanced {
58
+    display: none;
59
+}
60
+
61
+#check-advanced:checked ~ #advanced-search-container {
62
+    display:block;
63
+}
64
+
65
+.advanced {
66
+    margin-top:1rem;
67
+    text-align:right;
68
+}

+ 2
- 0
searx/static/themes/oscar/less/logicodev/oscar.less View File

12
 
12
 
13
 @import "search.less";
13
 @import "search.less";
14
 
14
 
15
+@import "advanced.less";
16
+
15
 @import "cursor.less";
17
 @import "cursor.less";
16
 
18
 
17
 @import "code.less";
19
 @import "code.less";

+ 18
- 26
searx/static/themes/oscar/less/logicodev/search.less View File

1
 .search_categories, #categories {
1
 .search_categories, #categories {
2
-  margin: 10px 0 4px 0;
3
   text-transform: capitalize;
2
   text-transform: capitalize;
4
-  
5
-  label{
6
-    border: none;
7
-    box-shadow: none;
8
-    font-size: 13px;
9
-    padding-bottom: 2px;
10
-    color: @gray;
11
-    margin-bottom: 5px;
12
-
13
-    &:hover{
14
-        color: @black;
15
-        background-color: transparent;
16
-    }
3
+  margin-bottom: 0.5rem;
17
 
4
 
18
-      &:active{
19
-        box-shadow: none;
20
-      }
5
+  label, .input-group-addon {
6
+    font-size: 1.2rem;
7
+    font-weight:normal;
8
+    background-color: white;
9
+    border: @mild-gray 1px solid;
10
+    border-right: none;
11
+    color: @dark-gray;
12
+    padding-bottom: 0.4rem;
13
+    padding-top: 0.4rem;
14
+    padding-left: 0.5rem;
15
+    padding-right: 0.5rem;
16
+  }
17
+  label:last-child, .input-group-addon:last-child {
18
+      border-right: @mild-gray 1px solid;
21
   }
19
   }
22
 
20
 
23
-  .active, .btn-primary{
21
+  input[type="checkbox"]:checked + label {
24
     color: @black;
22
     color: @black;
25
-    font-weight: 700;
26
-    border-bottom: 5px solid @light-green;
27
-    background-color: transparent;
23
+    font-weight:bold;
24
+    border-bottom: @light-green 5px solid;
28
   }
25
   }
29
-
30
-}
31
-
32
-#categories{
33
-    margin: 0;
34
 }
26
 }
35
 
27
 
36
 #main-logo{
28
 #main-logo{

+ 2
- 0
searx/static/themes/oscar/less/logicodev/variables.less View File

2
 @gray: #A4A4A4;
2
 @gray: #A4A4A4;
3
 @dim-gray: #F6F9FA;
3
 @dim-gray: #F6F9FA;
4
 @dark-gray: #666;
4
 @dark-gray: #666;
5
+@middle-gray: #F5F5F5;
6
+@mild-gray: #DDD;
5
 @blue: #0088CC; 
7
 @blue: #0088CC; 
6
 @red: #F35E77;
8
 @red: #F35E77;
7
 @violet: #684898;
9
 @violet: #684898;

+ 45
- 0
searx/static/themes/oscar/less/pointhi/advanced.less View File

1
+#advanced-search-container {
2
+    display:none;
3
+    text-align:center;
4
+    margin-bottom:1rem;
5
+
6
+    label, .input-group-addon {
7
+        font-size: 1.3rem;
8
+        font-weight:normal;
9
+        background-color: white;
10
+        border: #DDD 1px solid;
11
+        border-right: none;
12
+        color: #333;
13
+        padding-bottom: 0.8rem;
14
+        padding-top: 0.8rem;
15
+        padding-left: 1.2rem;
16
+        padding-right: 1.2rem;
17
+    }
18
+
19
+    label:last-child, .input-group-addon:last-child {
20
+        border-right: #DDD 1px solid;
21
+    }
22
+    
23
+    input[type="radio"] {
24
+        display: none;
25
+    }
26
+    
27
+    input[type="radio"]:checked + label{
28
+        color: black;
29
+        font-weight:bold;
30
+        background-color: #EEE;
31
+    }
32
+}
33
+
34
+#check-advanced {
35
+    display: none;
36
+}
37
+
38
+#check-advanced:checked ~ #advanced-search-container {
39
+    display:block;
40
+}
41
+
42
+.advanced {
43
+    margin-top:1rem;
44
+    text-align:right;
45
+}

+ 2
- 0
searx/static/themes/oscar/less/pointhi/oscar.less View File

8
 
8
 
9
 @import "search.less";
9
 @import "search.less";
10
 
10
 
11
+@import "advanced.less";
12
+
11
 @import "cursor.less";
13
 @import "cursor.less";
12
 
14
 
13
 @import "code.less";
15
 @import "code.less";

+ 27
- 3
searx/static/themes/oscar/less/pointhi/search.less View File

1
-.search_categories {
2
-  margin:10px 0;
3
-  text-transform: capitalize;
1
+.search_categories, #categories {
2
+    text-transform: capitalize;
3
+    margin-bottom:1.5rem;
4
+    margin-top:1.5rem;
5
+
6
+    label, .input-group-addon {
7
+        font-size: 1.3rem;
8
+        font-weight:normal;
9
+        background-color: white;
10
+        border: #DDD 1px solid;
11
+        border-right: none;
12
+        color: #333;
13
+        padding-bottom: 0.8rem;
14
+        padding-top: 0.8rem;
15
+        padding-left: 1.2rem;
16
+        padding-right: 1.2rem;
17
+    }
18
+
19
+    label:last-child, .input-group-addon:last-child {
20
+        border-right: #DDD 1px solid;
21
+    }
22
+
23
+    input[type="checkbox"]:checked + label{
24
+        color: black;
25
+        font-weight:bold;
26
+        background-color: #EEE;
27
+    }
4
 }
28
 }

+ 11
- 0
searx/templates/oscar/advanced.html View File

1
+<div class="input-group col-sm-12 advanced">
2
+    <input type="checkbox" name="advanced_search" id="check-advanced" {% if advanced_search %} checked="checked"{% endif %}>
3
+    <label for="check-advanced">
4
+        <span class="glyphicon glyphicon-cog"></span>
5
+        {{ _('Advanced settings') }}
6
+    </label>
7
+    <div id="advanced-search-container">
8
+        {% include 'oscar/categories.html' %}
9
+        {% include 'oscar/time-range.html' %}
10
+    </div>
11
+</div>

+ 10
- 38
searx/templates/oscar/categories.html View File

1
-<!-- used if scripts are disabled -->
2
-<noscript>
3
-<div id="categories" class="btn-group btn-toggle">
1
+<div id="categories">
4
 {% if rtl %}
2
 {% if rtl %}
5
-{% for category in categories | reverse %}
6
-    <!--<div class="checkbox">-->
7
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_nojs" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
8
-        <label class="btn btn-sm btn-primary active label_hide_if_not_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
9
-        <label class="btn btn-sm btn-default label_hide_if_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
10
-    <!--</div>-->
11
-    {% if category in selected_categories %}<input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_dis_activation" name="category_{{ category }}" value="off" checked="checked"/>{% endif %}
12
-{% endfor %}
3
+    {% for category in categories | reverse %}
4
+        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
5
+        <label class="input-group-addon" for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
6
+        </label>
7
+    {% endfor %}
13
 {% else %}
8
 {% else %}
14
-{% for category in categories %}
15
-    <!--<div class="checkbox">-->
16
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_nojs" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
17
-        <label class="btn btn-sm btn-primary active label_hide_if_not_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
18
-        <label class="btn btn-sm btn-default label_hide_if_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
19
-    <!--</div>-->
20
-    {% if category in selected_categories %}<input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_dis_activation" name="category_{{ category }}" value="off" checked="checked"/>{% endif %}
21
-{% endfor %}
9
+    {% for category in categories %}
10
+        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
11
+        <label class="input-group-addon" for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
12
+    {% endfor %}
22
 {% endif %}
13
 {% endif %}
23
 </div>
14
 </div>
24
-</noscript>
25
-
26
-<div id="categories" class="btn-group btn-toggle hide_if_nojs" data-toggle="buttons">
27
-{% if rtl %}
28
-{% for category in categories | reverse %}
29
-	<label class="btn btn-sm {% if category in selected_categories %}btn-primary active{% else %}btn-default{% endif %}" data-btn-class="primary">
30
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />{{ _(category) }}
31
-    </label>
32
-{% endfor %}
33
-{% else %}
34
-{% for category in categories %}
35
-    <label class="btn btn-sm {% if category in selected_categories %}btn-primary active{% else %}btn-default{% endif %}" data-btn-class="primary">
36
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />{{ _(category) }}
37
-    </label>
38
-{% endfor %}
39
-{% endif %}
40
-</div>
41
-
42
-

+ 1
- 1
searx/templates/oscar/preferences.html View File

36
                         <label class="col-sm-3 col-md-2">{{ _('Default categories') }}</label>
36
                         <label class="col-sm-3 col-md-2">{{ _('Default categories') }}</label>
37
                         {% else %}
37
                         {% else %}
38
                         <label class="col-sm-3 col-md-2">{{ _('Default categories') }}</label>
38
                         <label class="col-sm-3 col-md-2">{{ _('Default categories') }}</label>
39
-                        <div class="col-sm-11 col-md-10">
39
+                        <div class="col-sm-11 col-md-10 search-categories">
40
                             {% include 'oscar/categories.html' %}
40
                             {% include 'oscar/categories.html' %}
41
                         </div>
41
                         </div>
42
                         {% endif %}
42
                         {% endif %}

+ 7
- 2
searx/templates/oscar/results.html View File

1
 {% extends "oscar/base.html" %}
1
 {% extends "oscar/base.html" %}
2
 {% block title %}{{ q }} - {% endblock %}
2
 {% block title %}{{ q }} - {% endblock %}
3
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}">{% endblock %}
3
+{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}&amp;time_range={{ time_range }}">{% endblock %}
4
 {% block content %}
4
 {% block content %}
5
     <div class="row">
5
     <div class="row">
6
         <div class="col-sm-8" id="main_results">
6
         <div class="col-sm-8" id="main_results">
41
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
41
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
42
                         <input type="hidden" name="q" value="{{ q }}" />
42
                         <input type="hidden" name="q" value="{{ q }}" />
43
                         <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
43
                         <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
44
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
44
                         <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>
45
                         <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>
45
                     </form>
46
                     </form>
46
                 </div>
47
                 </div>
48
                     <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"  class="pull-left">
49
                     <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"  class="pull-left">
49
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
50
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
50
                         <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
51
                         <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
52
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
51
                         <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-forward"></span> {{ _('previous page') }}</button>
53
                         <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-forward"></span> {{ _('previous page') }}</button>
52
                     </form>
54
                     </form>
53
                 </div>
55
                 </div>
60
                         <input type="hidden" name="q" value="{{ q }}" />
62
                         <input type="hidden" name="q" value="{{ q }}" />
61
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
63
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
62
                         <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
64
                         <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
65
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
63
                         <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-backward"></span> {{ _('previous page') }}</button>
66
                         <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-backward"></span> {{ _('previous page') }}</button>
64
                     </form>
67
                     </form>
65
                 </div>
68
                 </div>
68
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
71
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
69
                         <input type="hidden" name="q" value="{{ q }}" />
72
                         <input type="hidden" name="q" value="{{ q }}" />
70
                         <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
73
                         <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
74
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
71
                         <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>
75
                         <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>
72
                     </form>
76
                     </form>
73
                 </div>
77
                 </div>
118
                     <form role="form">
122
                     <form role="form">
119
                         <div class="form-group">
123
                         <div class="form-group">
120
                             <label for="search_url">{{ _('Search URL') }}</label>
124
                             <label for="search_url">{{ _('Search URL') }}</label>
121
-                            <input id="search_url" type="url" class="form-control select-all-on-click cursor-text" name="search_url" value="{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}" readonly>
125
+                            <input id="search_url" type="url" class="form-control select-all-on-click cursor-text" name="search_url" value="{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if time_range %}&amp;time_range={{ time_range }}{% endif %}" readonly>
122
                         </div>
126
                         </div>
123
                     </form>
127
                     </form>
124
 
128
 
130
                         <input type="hidden" name="format" value="{{ output_type }}">
134
                         <input type="hidden" name="format" value="{{ output_type }}">
131
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1">{% endfor %}
135
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1">{% endfor %}
132
                         <input type="hidden" name="pageno" value="{{ pageno }}">
136
                         <input type="hidden" name="pageno" value="{{ pageno }}">
137
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
133
                         <button type="submit" class="btn btn-default">{{ output_type }}</button>
138
                         <button type="submit" class="btn btn-default">{{ output_type }}</button>
134
                     </form>
139
                     </form>
135
                     {% endfor %}
140
                     {% endfor %}

+ 1
- 3
searx/templates/oscar/search.html View File

6
             <button type="submit" class="btn btn-default"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
6
             <button type="submit" class="btn btn-default"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
7
         </span>
7
         </span>
8
     </div>
8
     </div>
9
-    <div class="search_categories">
10
-            {% include 'oscar/categories.html' %}
11
-    </div><!-- / #search_categories -->
9
+    {% include 'oscar/advanced.html' %}
12
 </form><!-- / #search_form_full -->
10
 </form><!-- / #search_form_full -->

+ 3
- 6
searx/templates/oscar/search_full.html View File

11
             <button type="submit" class="btn btn-default input-lg"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
11
             <button type="submit" class="btn btn-default input-lg"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
12
         </span>
12
         </span>
13
     </div>
13
     </div>
14
+    <div class="input-group col-md-8 col-md-offset-2">
15
+        {% include 'oscar/advanced.html' %}
16
+    </div>
14
 
17
 
15
-    <button type="button" class="btn btn-link btn-collapse center-block collapsed hide_if_nojs" data-toggle="collapse" data-target="#search_categories" data-btn-text-collapsed="{{ _('Show search filters') }}" data-btn-text-not-collapsed="{{ _('Hide search filters') }}">{{ _('Show search filters') }}</button>
16
-    <div class="row collapse active_if_nojs margin_top_if_nojs" id="search_categories">
17
-        <div class="col-md-12 text-center">
18
-            {% include 'oscar/categories.html' %}
19
-        </div>
20
-    </div><!-- / #search_categories -->
21
 </form><!-- / #search_form_full -->
18
 </form><!-- / #search_form_full -->

+ 14
- 0
searx/templates/oscar/time-range.html View File

1
+<select name="time_range" id="time-range">
2
+    <option id="time-range-anytime" value="" {{ "selected" if time_range=="" or not time_range  else ""}}>
3
+        {{ _('Anytime') }}
4
+    </option>
5
+    <option id="time-range-day" value="day" {{ "selected" if time_range=="day" else ""}}>
6
+        {{ _('Last day') }}
7
+    </option>
8
+    <option id="time-range-week" value="week" {{ "selected" if time_range=="week" else ""}}>
9
+        {{ _('Last week') }}
10
+    </option>
11
+    <option id="time-range-month" value="month" {{ "selected" if time_range=="month" else ""}}>
12
+        {{ _('Last month') }}
13
+    </option>
14
+</select>

+ 2
- 0
searx/webapp.py View File

459
         paging=search.paging,
459
         paging=search.paging,
460
         number_of_results=format_decimal(number_of_results),
460
         number_of_results=format_decimal(number_of_results),
461
         pageno=search.pageno,
461
         pageno=search.pageno,
462
+        advanced_search=search.is_advanced,
463
+        time_range=search.time_range,
462
         base_url=get_base_url(),
464
         base_url=get_base_url(),
463
         suggestions=search.result_container.suggestions,
465
         suggestions=search.result_container.suggestions,
464
         answers=search.result_container.answers,
466
         answers=search.result_container.answers,