Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
If no search query was entered, browser dataset (bug 571241)
Browse files Browse the repository at this point in the history
  • Loading branch information
Fred Wenzel committed Jun 17, 2010
1 parent 7e96f3d commit 361d8f9
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 27 deletions.
1 change: 1 addition & 0 deletions apps/dashboard/templates/dashboard/dashboard.html
Expand Up @@ -30,6 +30,7 @@ <h2>Demographics</h2>
</div>

<div id="messages" class="container">
<a href="{{ search_url() }}" class="more">Show more</a>
<h2>Last 10 Messages</h2>
<!-- Show More -->
<div class="ajaxy"></div>
Expand Down
2 changes: 1 addition & 1 deletion apps/dashboard/templates/dashboard/demographics.html
@@ -1,4 +1,4 @@
{% with defaults = form.cleaned_data if form else None %}
{% with defaults = form.data if form else None %}
<dl class="oses">
<dt>OS</dt>
{% for item in demo.os %}
Expand Down
10 changes: 6 additions & 4 deletions apps/dashboard/templates/dashboard/sentiments.html
Expand Up @@ -16,11 +16,13 @@
{% endwith %}
{% endmacro %}

{% with defaults = form.cleaned_data if form else None %}
{% with defaults = form.data if form else None %}
<div class="emotion {{ sent.sentiment }}">{{ smiley(sent.sentiment) }}</div>
{{ bar('total', sent.total, sent.total) }}
{{ bar('total', sent.total, sent.total, search_url(defaults=defaults)) }}
{% if sent.total > 0 %}
{{ bar('happy', sent.happy, sent.total, search_url(sentiment='happy')) }}
{{ bar('sad', sent.sad, sent.total, search_url(sentiment='sad')) }}
{{ bar('happy', sent.happy, sent.total,
search_url(defaults=defaults, sentiment='happy')) }}
{{ bar('sad', sent.sad, sent.total,
search_url(defaults=defaults, sentiment='sad')) }}
{% endif %}
{% endwith %}
2 changes: 1 addition & 1 deletion apps/dashboard/templates/dashboard/trends.html
@@ -1,4 +1,4 @@
{% with defaults = form.cleaned_data if form else None %}
{% with defaults = form.data if form else None %}
{% for item in terms %}
<a href="{{ search_url(defaults=defaults, q=item.term) }}"
class="term w{{ item.weight }}">{{ item.term }}</a>
Expand Down
18 changes: 18 additions & 0 deletions apps/feedback/models.py
Expand Up @@ -3,11 +3,29 @@
from django.db import models
from django.db.models import Count

from search.forms import ReporterSearchForm

from . import APP_IDS, OSES
from .utils import ua_parse, extract_terms, smart_truncate


class OpinionManager(models.Manager):
def browse(self, **kwargs):
"""Browse all opinions, restricted by search criteria."""
opt = lambda x: kwargs.get(x, None)
# apply complex filters first
qs = self.between(date_start=opt('date_start'),
date_end=opt('date_end'))
if opt('positive'):
qs = qs.filter(positive=opt('positive'))

# apply other filters verbatim
for field in ('product', 'version', 'locale', 'os'):
if opt(field):
qs = qs.filter(**{field: opt(field)})

return qs

def between(self, date_start=None, date_end=None):
ret = self.get_query_set()
if date_start:
Expand Down
45 changes: 28 additions & 17 deletions apps/search/forms.py
Expand Up @@ -30,7 +30,7 @@ def add_empty(choices):


class ReporterSearchForm(SearchForm):
q = forms.CharField(label='', widget=forms.TextInput(
q = forms.CharField(required=False, label='', widget=forms.TextInput(
attrs={'placeholder': 'Search Terms'}))
product = forms.ChoiceField(choices=PROD_CHOICES,
label='Product:')
Expand All @@ -48,30 +48,41 @@ class ReporterSearchForm(SearchForm):
date_end = forms.DateField(required=False, widget=forms.DateInput(
attrs={'class': 'datepicker'}), label='to')

def clean(self):
cleaned = super(ReporterSearchForm, self).clean()

# Set "positive" value according to sentiment choice.
if cleaned['sentiment'] in SENTIMENTS:
cleaned['positive'] = (cleaned['sentiment'] == 'happy')
else:
cleaned['positive'] = None

# Sane default dates to avoid fetching huge amounts of data by default
if not cleaned['date_end']:
cleaned['date_end'] = date.today()
if not cleaned['date_start']:
cleaned['date_start'] = (cleaned['date_end'] - timedelta(days=30))
return cleaned

def clean_product(self):
"""Map product short names to id."""
data = self.cleaned_data['product']
return APPS[data].id

def search(self):
sqs = super(ReporterSearchForm, self).search()

# Sane default dates to avoid fetching huge amounts of data by default
if not self.cleaned_data['date_end']:
self.cleaned_data['date_end'] = date.today()
if not self.cleaned_data['date_start']:
self.cleaned_data['date_start'] = (self.cleaned_data['date_end'] -
timedelta(days=30))
sqs = sqs.filter(created__gte=self.cleaned_data['date_start']).filter(
# Always restrict by date.
sqs = sqs.filter(
created__gte=self.cleaned_data['date_start']).filter(
created__lte=self.cleaned_data['date_end'])

if self.cleaned_data['product']:
prod = self.cleaned_data['product']
if prod in APPS:
sqs = sqs.filter(product=APPS[prod].id)

# happy/sad
if self.cleaned_data['sentiment'] in SENTIMENTS:
sqs = sqs.filter(
positive=(self.cleaned_data['sentiment'] == 'happy'))
if self.cleaned_data['positive'] is not None:
sqs = sqs.filter(positive=self.cleaned_data['positive'])

# Apply other filters verbatim
for field in ('version', 'locale', 'os'):
for field in ('product', 'version', 'locale', 'os'):
if self.cleaned_data[field]:
filter = { field: self.cleaned_data[field] }
sqs = sqs.filter(**filter)
Expand Down
4 changes: 2 additions & 2 deletions apps/search/templates/search/search.html
Expand Up @@ -7,8 +7,8 @@ <h1>Search Results</h1>

<div id="search_box" class="clearfix">
<div id="search_options">
{% if query %}
Description: <span class="opt">"{{ query }}"</span>;
{% if page.object_list %}
{% if query %}Description: <span class="opt">"{{ query }}"</span>;{% endif %}
Dates: <span class="opt">{{ form.cleaned_data.date_start }}
&ndash; {{ form.cleaned_data.date_end }}</span>
<br/>
Expand Down
10 changes: 8 additions & 2 deletions apps/search/views.py
@@ -1,12 +1,18 @@
from haystack.views import SearchView
import jingo

from feedback.models import Opinion, Term
from feedback import stats, FIREFOX

import jingo


class OpinionSearchView(SearchView):
def get_results(self):
"""If no query is selected, browse dataset."""
if self.form.is_valid() and not self.query:
return Opinion.objects.browse(**self.form.cleaned_data)
else:
return super(OpinionSearchView, self).get_results()

def extra_context(self):
"""Gather sentiments/trends/demographic info for these search results."""
extra = super(OpinionSearchView, self).extra_context()
Expand Down
4 changes: 4 additions & 0 deletions media/css/reporter.css
Expand Up @@ -649,6 +649,10 @@ input.placeholder {
#search #overview {
float: right;
}
#dashboard #messages a.more {
float: right;
margin-top: .5em;
}
#dashboard .prototype {
display: none;
}
Expand Down

0 comments on commit 361d8f9

Please sign in to comment.