Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
lbjay committed Nov 18, 2012
2 parents bff7304 + 53d0a7d commit c0b0061
Show file tree
Hide file tree
Showing 10 changed files with 316 additions and 17 deletions.
55 changes: 50 additions & 5 deletions adsabs/modules/search/forms.py
Expand Up @@ -4,18 +4,63 @@
@author: jluker
'''

from flask.ext.wtf import (Form, SubmitField, TextField, SelectField, HiddenField, #@UnresolvedImport
ValidationError, validators, required, equal_to, email, #@UnresolvedImport
from flask.ext.wtf import (Form, SubmitField, TextField, SelectField, HiddenField, IntegerField, BooleanField,#RadioField, #@UnresolvedImport
ValidationError, validators, required, optional, equal_to, email, #@UnresolvedImport
length) #@UnresolvedImport
from werkzeug.datastructures import ImmutableMultiDict, MultiDict
#from flask.ext.wtf.html5 import RangeInput #@UnresolvedImport

from config import config
#from custom_wtform import SelectFieldCssClass

__all__ = ["get_defaults_if_missing", "QueryForm", "ResultsQueryForm", "AdvancedQueryForm"]

def get_defaults_if_missing(req_val_lists, form):
"""Function that given a form object and a set of parameters coming from the request
populate the parameters with the default values of the form if they are not in the request"""

#I convert the ImmutableMultiDict into MultiDict
req_val_lists = MultiDict(req_val_lists)
try:
form_defaults = form.default_if_missing
except AttributeError:
return ImmutableMultiDict(req_val_lists)
for field in form_defaults.keys():
if not req_val_lists.has_key(field):
for elem in form_defaults.getlist(field):
req_val_lists.add(field, elem)
return ImmutableMultiDict(req_val_lists)



class QueryForm(Form):
q = TextField('Query', [required(), length(min=2, max=2048)])
submit = SubmitField('Search')
"""Form for the basic search"""
q = TextField(u'Query', [required(), length(min=2, max=2048)], description=u"Query the ADS database")
#sort_dir = HiddenField(u'Sort direction', default='desc')
db_key = SelectField(u'Database', choices=[('ast', 'Astronomy'), ('phy', 'Physics'), ('all', 'All') ])
sort_type = SelectField(u'Sort', choices=[('recent','Sort by Most recent'),('relevant','Sort by Most relevant'),
('cited','Sort by Most cited'),('popular','Sort by Most popular'),
#('second_order_operator', 'Use Second order operator'),
('hot','Explore What people are reading'),('useful','Explore What experts are citing'),
('instructive','Explore Reviews and introductory papers ')] )
month_from = IntegerField(u'Month From', [optional(), validators.NumberRange(min=1, max=12, message='Month not valid')])
month_to = IntegerField(u'Month To', [optional(), validators.NumberRange(min=1, max=12, message='Month not valid')])
year_from = IntegerField(u'Year From', [optional(), validators.NumberRange(min=1, max=2500, message='Year not valid')])
year_to = IntegerField(u'Year To', [optional(), validators.NumberRange(min=1, max=2500, message='Year not valid')])
journal_abbr = TextField(u'Bibstems', [optional(), length(min=2, max=2048)], description=u'Journal Abbreviation(s)')
refereed = BooleanField(u'Refereed', description=u'Refereed only')
article = BooleanField(u'Articles', description=u'Articles only')

default_if_missing = MultiDict([('db_key', 'ast'), ('sort_type', 'recent')])


#second_order_type = RadioField(u'Explore the field', choices=[('hot','What people are reading'),('useful','What experts are citing'),
# ('instructive','Reviews and introductory papers ')])
#author = TextField('Author', [length(min=1, max=2048)], description="Author field search")
#submit = SubmitField('Search', description="Search")

class ResultsQueryForm(QueryForm):
rows = SelectField('Results Per Page',
rows = SelectField(u'Results Per Page',
default=config.SOLR_DEFAULT_ROWS,
choices=config.SOLR_ROW_OPTIONS)

Expand Down
2 changes: 1 addition & 1 deletion adsabs/modules/search/templates/macros.html
Expand Up @@ -11,4 +11,4 @@
</li>
{% endmacro %}

{# The macro to render rthe search form has been moved in the global template folder to make it available everywhere #}
{# The macro to render the search form has been moved in the global template folder to make it available everywhere #}
9 changes: 7 additions & 2 deletions adsabs/modules/search/views.py
@@ -1,6 +1,7 @@
from flask import Blueprint, request, g, render_template

from flask.ext.login import current_user #@UnresolvedImport
from .forms import QueryForm
from .forms import QueryForm, get_defaults_if_missing
from adsabs.core.solr import query

#I define the blueprint
Expand All @@ -13,10 +14,14 @@ def search():
"""
returns the results of a search
"""
form = QueryForm(request.values, csrf_enabled=False)
#I add the default values if they have not been submitted by the form
form_vals = get_defaults_if_missing(request.values, QueryForm)

form = QueryForm(form_vals, csrf_enabled=False)
if form.validate():
resp = query(form.q.data)
return render_template('search_results.html', resp=resp, form=form)


return render_template('search.html', form=form)

Expand Down
10 changes: 10 additions & 0 deletions adsabs/static/css/bootstrap_custom.css
Expand Up @@ -21,4 +21,14 @@
}
.navbar-small .nav > li > a {
padding: 2px 10px;
}

.drower-handle {
line-height:4px;
color:#AAA;
margin-bottom:10px;
}

.form-search-cust {
margin-bottom:5px;
}
30 changes: 29 additions & 1 deletion adsabs/static/css/styles.css
Expand Up @@ -45,4 +45,32 @@ body {
}
#global_body_container {
margin-top:10px;
}
}

div.centered {
text-align:center;
}

#advanced_options {
display: none;
margin-top:2px;
}

/*css for query forms*/
.link_only_js {
cursor: pointer;
}

.adv_opt_box {
margin-bottom: 5px;
padding: 5px;
}
.adv_opt_box, .label_adv_opt_box {
font-size: .9em;
}

.adv_opt_box_foll {
margin-left:10px;
}


80 changes: 80 additions & 0 deletions adsabs/static/js/misc_functions.js
@@ -0,0 +1,80 @@
/**
*
*/

//###########################################################################################//
//Definition of a new jQuery Method that is an extended version of the $.get
$.getADS = function(url_ads, data_ads, success_ads, error_ads, dataType_ads)
{
$.ajax({
type: "GET",
url: url_ads,
data: data_ads,
success: success_ads,
error: error_ads,
dataType: dataType_ads,
timeout: 600000,
});
};

$.postADS = function(url_ads, data_ads, success_ads, error_ads, dataType_ads)
{
$.ajax({
type: "POST",
url: url_ads,
data: data_ads,
success: success_ads,
error: error_ads,
dataType: dataType_ads,
timeout: 600000,
});
};

//definition of a new jQuery method to set the cursor at a certain point of the textfield
/**** thanks to Mark from StackOverflow ****/
$.fn.selectRange = function(start, end) {
return this.each(function() {
if (this.setSelectionRange) {
this.focus();
this.setSelectionRange(start, end);
} else if (this.createTextRange) {
var range = this.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', start);
range.select();
}
});
};

//definition of an escaping method
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

//###########################################################################################//

var Misc = new Object();

Misc.wrapText = function(elementID, openTag, closeTag)
/* function to wrap text inside other tags */
/****thanks to richleland from StackOverflow****/
{
var textArea = $('#' + elementID);
var len = textArea.val().length;
var start = textArea[0].selectionStart;
var end = textArea[0].selectionEnd;
//if start and end are the same number I take the end of the string
if (start == end)
{
start = textArea.val().length;
end = textArea.val().length;
}
var selectedText = textArea.val().substring(start, end);
var replacement = openTag + selectedText + closeTag;
textArea.val(textArea.val().substring(0, start) + replacement + textArea.val().substring(end, len));

//then I
endrepl = start + replacement.length - closeTag.length;
textArea.selectRange(endrepl, endrepl);
};
77 changes: 77 additions & 0 deletions adsabs/static/js/query_form.js
@@ -0,0 +1,77 @@
/**
*
*/
function search_form_drawer_manager(obj_drower, obj_drawer_handler)
/*function to open and close the drawer*/
{
//I open the drawer
$(obj_drower).slideToggle('fast', function(){
//I check if the drawer is visible or not
if ($(obj_drower).is(":visible"))
$(obj_drawer_handler).html('less options');
else
$(obj_drawer_handler).html('more options');
});
};

//Remove all the disabled input
$(':input').removeAttr("disabled");

//I add a function on the forms
$("form").submit(function()
{
$(this).find(':input[value=""]').attr("disabled", "disabled");
return true; // ensure form still submits
});

//if there are input in the advanced options that are filled in, I show the advanced options
var advanced_params_text = $("#advanced_options :input[type=text]");
var advanced_params_check = $("#advanced_options :input[type=checkbox]");
for (var x=0; x<advanced_params_text.length; x++)
{
if ($(advanced_params_text[x]).val() != '')
{
search_form_drawer_manager($("#advanced_options"), $("#drawer_handler"));
break;
}
}
for (var x=0; x<advanced_params_check.length; x++)
{
if ($(advanced_params_check[x]).attr('checked') == 'checked')
{
search_form_drawer_manager($("#advanced_options"), $("#drawer_handler"));
break;
}
}


//function search_form_second_order(sort_menu, obj_drower, obj_drawer_handler)
///*function that checks if in the drop down menu of the sorting the option */
//{
// //If I have a second order operator
// if($(sort_menu).val() == 'second_order_operator')
// {
// //I preselect the first radio
// $("input:radio[name=second_order_type]:first").attr('checked', 'checked');
// //I open the advanced options if they are not already open
// if ($(obj_drower).is(":hidden"))
// {
// $(obj_drower).slideToggle('fast', function(){
// $(obj_drawer_handler).html('less options');
// });
// }
// }
// //otherwise I need to uncheck all the radios
// else
// {
// $("input:radio[name=second_order_type]").removeAttr('checked');
// }
//};
//
//function radio_second_order_type(sort_menu)
///*Function that set the sort dropdown menu if a radio button of the second order operators is selected*/
//{
// if ($(sort_menu).val() != 'second_order_operator')
// $(sort_menu).val('second_order_operator');
//};

1 change: 0 additions & 1 deletion adsabs/templates/index/main_page.html
Expand Up @@ -16,7 +16,6 @@ <h3>The SAO/NASA Astrophysics Data System</h3>
<div class="tab-content">
<div class="tab-pane active" id="tab1">
{% include 'search/search_form.html' %}
<a href="{{ url_for('search.search') }}">SEARCH</a>
</div>
<div class="tab-pane" id="tab2">
<p>All the personalized info</p>
Expand Down
3 changes: 3 additions & 0 deletions adsabs/templates/layout.html
Expand Up @@ -20,6 +20,8 @@
<link href="{{ url_for('static', filename='css/bootstrap_custom.css') }}" rel="stylesheet">
<link href="{{ url_for('static', filename='css/styles.css') }}" rel="stylesheet">

<script type="text/javascript" src="{{ url_for('static', filename='js/misc_functions.js') }}"></script>

{% block head%}{% endblock %}
</head>
<body>
Expand Down Expand Up @@ -50,6 +52,7 @@
<ul class="nav">
<li class="divider-vertical"></li>
<li><a href="{{ url_for('index.index') }}">Home</a></li>
<li><a href="{{ url_for('search.search') }}">Search</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
Expand Down

0 comments on commit c0b0061

Please sign in to comment.