Skip to content
This repository has been archived by the owner on Mar 15, 2018. It is now read-only.

Commit

Permalink
Add time ranges to featured apps tool (bug 779898)
Browse files Browse the repository at this point in the history
  • Loading branch information
Allen Short committed Aug 24, 2012
1 parent f1b61d5 commit 44000f6
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 15 deletions.
61 changes: 55 additions & 6 deletions media/js/mkt/admin_featuredapp.js
Expand Up @@ -24,11 +24,53 @@ function registerAddonAutocomplete(node) {
};
}

function registerDatepicker(node) {
var $startPicker = node.find('.start-date-picker');
var $tabl = $startPicker.closest('table');
var url = $tabl.data('url');
var appid = $tabl.data('app-id');
$startPicker.datepicker({
dateFormat: 'yy-mm-dd',
onSelect: function(dateText) {
node.find('.date-range-start').val(dateText);
saveFeaturedDate('startdate', url, appid, dateText);
}
});
var $endPicker = node.find('.end-date-picker');
$endPicker.datepicker({
dateFormat: 'yy-mm-dd',
onSelect: function(dateText) {
node.find('.date-range-end').val(dateText);
saveFeaturedDate('enddate', url, appid, dateText);
}
});

var $start = node.find('.date-range-start');
$start.change(
function (e) {
saveFeaturedDate('startdate', $tabl.data('url'), $tabl.data('app-id'), $start.val());
});
var $end = node.find('.date-range-end');
$end.change(
function (e) {
saveFeaturedDate('enddate', $tabl.data('url'), $tabl.data('app-id'), $end.val());
});

}

function saveFeaturedDate(which, url, appid, val) {
var data = {};
data[which] = val;
data.app = appid;
$.ajax({type: 'POST', url: url, data: data});
}

function newAddonSlot(id) {
var $tbody = $("#featured-webapps");
var $form = $tbody.next().children("tr").clone();
var $input = $form.find('input.placeholder');
registerAddonAutocomplete($input);
registerDatepicker($form);
$tbody.append($form);
}

Expand Down Expand Up @@ -73,16 +115,17 @@ $(document).ready(function(){
'select.localepicker',
'change',
_pd(function (e) {
var region = $(e.target);
var $region = $(e.target);
var $tabl = $region.closest('table');
$.ajax({
type: 'POST',
url: region.data('url'),
url: $tabl.data('url'),
data: {
'region':
_(region.children('option'))
_($region.children('option'))
.filter(function(opt) {return opt.selected})
.map(function(sopt) {return sopt.value}),
'app': region.data('id')
'app': $tabl.data('app-id')
}
});
})
Expand All @@ -93,10 +136,16 @@ $(document).ready(function(){
url: categories.data("src")});
p.then(function(data) {
categories.html(data);
showAppsList(categories);
showAppsList(categories).then(
function () {
registerDatepicker(appslist);
});
});
categories.change(function (e) {
showAppsList(categories);
showAppsList(categories).then(
function () {
registerDatepicker(appslist);
});
});
$('#featured-add').click(_pd(function() { newAddonSlot(); }));
});
2 changes: 2 additions & 0 deletions migrations/460-featured-app-start-end.sql
@@ -0,0 +1,2 @@
ALTER TABLE `zadmin_featuredapp` ADD COLUMN `start_date` DATE,
ADD COLUMN `end_date` DATE;
2 changes: 2 additions & 0 deletions mkt/browse/tests/test_views.py
@@ -1,3 +1,4 @@
import datetime
from django.conf import settings

from nose import SkipTest
Expand Down Expand Up @@ -38,6 +39,7 @@ def make_featured(self, app, category=None):
# Feature in the US region.
FeaturedAppRegion.objects.create(featured_app=f,
region=mkt.regions.US.id)
return f

def setup_featured(self):
self.skip_if_disabled(settings.REGION_STORES)
Expand Down
28 changes: 28 additions & 0 deletions mkt/home/tests/test_views.py
@@ -1,10 +1,13 @@
import datetime

from nose.tools import eq_

from amo.tests import app_factory, mock_es
from amo.urlresolvers import reverse

import mkt
from mkt.browse.tests.test_views import BrowseBase
from mkt.webapps.models import Webapp
from mkt.zadmin.models import FeaturedApp, FeaturedAppRegion


Expand Down Expand Up @@ -56,3 +59,28 @@ def test_popular(self):

def test_popular_region_exclusions(self):
self._test_popular_region_exclusions()

def make_time_limited_feature(self):
a = app_factory()
fa = self.make_featured(app=a, category=None)
fa.startdate = datetime.date(2012, 1, 1)
fa.enddate = datetime.date(2012, 2, 1)
fa.save()
return a

@mock_es
def test_featured_time_excluded(self):
a = self.make_time_limited_feature()
for d in [datetime.date(2012, 1, 1),
datetime.date(2012, 1, 15),
datetime.date(2012, 2, 1)]:
Webapp.now = staticmethod(lambda: d)
eq_(self.get_pks('featured', self.url, {'region': 'us'}),
[a.id])

def test_featured_time_included(self):
self.make_time_limited_feature()
for d in [datetime.date(2011, 12, 15),
datetime.date(2012, 2, 2)]:
Webapp.now = staticmethod(lambda: d)
eq_(self.get_pks('featured', self.url, {'region': 'us'}), [])
10 changes: 9 additions & 1 deletion mkt/webapps/models.py
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
import datetime
import json
import os
import urlparse
Expand Down Expand Up @@ -399,12 +400,19 @@ def content_ratings_in(self, region, category=None):
return list(self.content_ratings.filter(ratings_body__in=rb)
.order_by('rating'))

@classmethod
def now(cls):
return datetime.date.today()

@classmethod
def featured(cls, cat=None, region=None, limit=6):
FeaturedApp = models.get_model('zadmin', 'FeaturedApp')
qs = (FeaturedApp.objects
.filter(app__status=amo.STATUS_PUBLIC,
app__disabled_by_user=False)
app__disabled_by_user=False,
start_date__lte=cls.now(),
end_date__gte=cls.now()
)
.order_by('-app__weekly_downloads'))

if isinstance(cat, list):
Expand Down
2 changes: 2 additions & 0 deletions mkt/zadmin/models.py
Expand Up @@ -10,6 +10,8 @@ class FeaturedApp(models.Model):
app = models.ForeignKey(Webapp, null=False)
category = models.ForeignKey(Category, null=True)
is_sponsor = models.BooleanField(default=False)
start_date = models.DateField(null=True)

This comment has been minimized.

Copy link
@cvan

cvan Aug 29, 2012

Contributor

won't this get weird with timezones or we don't care?

end_date = models.DateField(null=True)

class Meta:
db_table = 'zadmin_featuredapp'
Expand Down
24 changes: 20 additions & 4 deletions mkt/zadmin/templates/zadmin/featured_apps_ajax.html
Expand Up @@ -2,7 +2,7 @@
{% for row, selected_regions in apps_regions -%}
<tr>
<td>
<table>
<table data-app-id="{{ row.pk }}" data-url="{{ url('zadmin.set_attrs_ajax') }}">
<tr>
<td><img src="{{ row.app.icon_url }}"></td>
<td>{{ row.app.name }}</td>
Expand All @@ -19,9 +19,7 @@
</td>
<td>{% if row.is_sponsor %}Sponsored{% else %}Not sponsored{% endif %}</td>
<td>
<select class="localepicker" multiple
data-url="{{ url('zadmin.set_region_ajax') }}"
data-id="{{ row.pk }}">
<select class="localepicker" multiple>
{%- for locName, loc in regions -%}
<option value="{{ loc.id }}"
{%- if loc.id in selected_regions %} selected{%- endif -%}
Expand All @@ -30,6 +28,24 @@
</select>
</td>
</tr>
<tr>
<td>
{{ _('Start date') }}

This comment has been minimized.

Copy link
@cvan

cvan Aug 29, 2012

Contributor

we need to localize admin?

</td>
<td>
<input type="date" class="date-range-start" value="{{ row.start_date }}">
<div class="start-date-picker"></div>
</td>
</tr>
<tr>
<td>
{{ _('End date') }}
</td>
<td>
<input type="date" class="date-range-end" value="{{ row.end_date }}">
<div class="end-date-picker"></div>
</td>
</tr>
</table>
</td>
<td><input type="hidden"><a class="remove" data-id="{{ row.app.id }}">×</a></td>
Expand Down
21 changes: 20 additions & 1 deletion mkt/zadmin/tests/test_views.py
@@ -1,3 +1,5 @@
from datetime import date

from nose.tools import eq_
from pyquery import PyQuery as pq

Expand Down Expand Up @@ -114,14 +116,31 @@ def test_delete_featured_app(self):
def test_set_region(self):
f = FeaturedApp.objects.create(app=self.a1, category=None)
FeaturedAppRegion.objects.create(featured_app=f, region=1)
r = self.client.post(reverse('zadmin.set_region_ajax'),
r = self.client.post(reverse('zadmin.set_attrs_ajax'),
data={'app': f.pk, 'region[]': (3, 2)})
eq_(r.status_code, 200)
eq_(list(FeaturedApp.objects.get(pk=f.pk).regions.values_list(
'region', flat=True)),
[2, 3])


def test_set_startdate(self):
f = FeaturedApp.objects.create(app=self.a1, category=None)
FeaturedAppRegion.objects.create(featured_app=f, region=1)
r = self.client.post(reverse('zadmin.set_attrs_ajax'),
data={'app': f.pk, 'startdate': '2012-08-01'})
eq_(r.status_code, 200)
eq_(FeaturedApp.objects.get(pk=f.pk).startdate, date(2012, 8, 1))

def test_set_enddate(self):
f = FeaturedApp.objects.create(app=self.a1, category=None)
FeaturedAppRegion.objects.create(featured_app=f, region=1)
r = self.client.post(reverse('zadmin.set_attrs_ajax'),
data={'app': f.pk, 'enddate': '2012-08-31'})
eq_(r.status_code, 200)
eq_(FeaturedApp.objects.get(pk=f.pk).enddate, date(2012, 8, 31))


class TestAddonSearch(amo.tests.ESTestCase):
fixtures = ['base/users', 'webapps/337141-steamcube', 'base/addon_3615']

Expand Down
4 changes: 2 additions & 2 deletions mkt/zadmin/urls.py
Expand Up @@ -12,6 +12,6 @@
name='zadmin.featured_apps_ajax'),
url('^apps/featured_categories_ajax$', views.featured_categories_ajax,
name='zadmin.featured_categories_ajax'),
url('^apps/set_region_ajax$', views.set_region_ajax,
name='zadmin.set_region_ajax'),
url('^apps/set_attrs_ajax$', views.set_attrs_ajax,
name='zadmin.set_attrs_ajax'),
)
15 changes: 14 additions & 1 deletion mkt/zadmin/views.py
@@ -1,3 +1,5 @@
import datetime

import jingo

from django.contrib import admin
Expand Down Expand Up @@ -71,8 +73,11 @@ def featured_apps_ajax(request):


@admin_required
def set_region_ajax(request):
def set_attrs_ajax(request):
regions = request.POST.getlist('region[]')
startdate = request.POST.get('startdate', None)
enddate = request.POST.get('enddate', None)

app = request.POST.get('app', None)
if regions and app:
fa = FeaturedApp.objects.get(pk=app)
Expand All @@ -83,6 +88,14 @@ def set_region_ajax(request):
for i in to_create:
FeaturedAppRegion.objects.create(featured_app=fa, region=i)

if startdate and app:
FeaturedApp.objects.update(

This comment has been minimized.

Copy link
@cvan

cvan Aug 29, 2012

Contributor

isn't this fa?

start_date=datetime.datetime.strptime(startdate,
'%Y-%m-%d'))
if enddate and app:
FeaturedApp.objects.update(
end_date=datetime.datetime.strptime(enddate,
'%Y-%m-%d'))
return HttpResponse()


Expand Down

0 comments on commit 44000f6

Please sign in to comment.