Adds preliminary review queue for editors (bug 627512)

This commit is contained in:
Kumar McMillan 2011-01-27 21:23:22 -06:00
Родитель 7e324e44bb
Коммит 1b9b74a984
6 изменённых файлов: 123 добавлений и 10 удалений

Просмотреть файл

@ -7,7 +7,8 @@ from jingo import register
from tower import ugettext_lazy as _, ungettext as ngettext
import amo
from editors.models import ViewPendingQueue, ViewFullReviewQueue
from editors.models import (ViewPendingQueue, ViewFullReviewQueue,
ViewPreliminaryQueue)
from amo.helpers import page_title
from amo.urlresolvers import reverse
@ -101,3 +102,12 @@ class ViewFullReviewQueueTable(tables.ModelTable, EditorQueueTable):
class Meta(EditorQueueTable.Meta):
model = ViewFullReviewQueue
class ViewPreliminaryQueueTable(tables.ModelTable, EditorQueueTable):
flags = tables.Column(verbose_name=_(u'Flags'))
applications = tables.Column(verbose_name=_(u'Applications'))
additional_info = tables.Column(verbose_name=_(u'Additional Information'))
class Meta(EditorQueueTable.Meta):
model = ViewPreliminaryQueue

Просмотреть файл

@ -103,3 +103,16 @@ def create_view_ed_full_review_q(sender, **kw):
post_syncdb.connect(create_view_ed_full_review_q)
class ViewPreliminaryQueue(ViewQueue):
class Meta(ViewQueue.Meta):
db_table = 'view_ed_prelim_q'
def create_view_ed_prelim_q(sender, **kw):
_create_view('137-view_ed_prelim_q.sql')
post_syncdb.connect(create_view_ed_prelim_q)

Просмотреть файл

@ -7,7 +7,8 @@ from addons.models import Addon
from versions.models import Version, ApplicationsVersions
from files.models import Platform, File
from applications.models import Application, AppVersion
from editors.models import ViewPendingQueue, ViewFullReviewQueue
from editors.models import (ViewPendingQueue, ViewFullReviewQueue,
ViewPreliminaryQueue)
def create_addon_file(name, version_str, addon_status, file_status,
@ -78,9 +79,9 @@ class TestQueue(test_utils.TestCase):
eq_(sorted(row.application_ids),
[amo.FIREFOX.id, amo.THUNDERBIRD.id])
def test_hide_unreviewed_files(self):
def test_reviewed_files_are_hidden(self):
self.new_file(name='Unreviewed', version=u'0.1')
create_addon_file('Listed', '0.1',
create_addon_file('Already Reviewed', '0.1',
amo.STATUS_PUBLIC, amo.STATUS_LISTED)
eq_(sorted(q.addon_name for q in self.Queue.objects.all()),
['Unreviewed'])
@ -138,3 +139,26 @@ class TestFullReviewQueue(TestQueue):
amo.STATUS_NOMINATED, amo.STATUS_NULL)
eq_(sorted(q.addon_name for q in self.Queue.objects.all()),
['Disabled', 'Null'])
class TestPreliminaryQueue(TestQueue):
__test__ = True
Queue = ViewPreliminaryQueue
def new_file(self, name=u'Preliminary', version=u'1.0', **kw):
return create_addon_file(name, version,
amo.STATUS_LITE, amo.STATUS_UNREVIEWED,
**kw)
def new_search_ext(self, name, version, **kw):
return create_search_ext(name, version,
amo.STATUS_LITE, amo.STATUS_UNREVIEWED,
**kw)
def test_unreviewed_addons_are_in_q(self):
create_addon_file('Lite', '0.1',
amo.STATUS_LITE, amo.STATUS_UNREVIEWED)
create_addon_file('Unreviewed', '0.1',
amo.STATUS_UNREVIEWED, amo.STATUS_UNREVIEWED)
eq_(sorted(q.addon_name for q in self.Queue.objects.all()),
['Lite', 'Unreviewed'])

Просмотреть файл

@ -120,7 +120,13 @@ class QueueTest(EditorTest):
amo.STATUS_NOMINATED, amo.STATUS_UNREVIEWED)
self.addon_file(u'Nominated Two', u'0.1',
amo.STATUS_LITE_AND_NOMINATED, amo.STATUS_UNREVIEWED)
self.addon_file(u'Prelim One', u'0.1',
amo.STATUS_LITE, amo.STATUS_UNREVIEWED)
self.addon_file(u'Prelim Two', u'0.1',
amo.STATUS_UNREVIEWED, amo.STATUS_UNREVIEWED)
self.addon_file(u'Public', u'0.1',
amo.STATUS_PUBLIC, amo.STATUS_LISTED)
def addon_file(self, *args, **kw):
a = create_addon_file(*args, **kw)
self.versions[unicode(a['addon'].name)] = a['version']
@ -218,3 +224,29 @@ class TestNominatedQueue(QueueTest):
eq_(doc('.tabnav li a:eq(0)').text(), u'Full Reviews (2)')
eq_(doc('.tabnav li a:eq(0)').attr('href'),
reverse('editors.queue_nominated'))
class TestPreliminaryQueue(QueueTest):
def test_results(self):
r = self.client.get(reverse('editors.queue_prelim'))
eq_(r.status_code, 200)
doc = pq(r.content)
row = doc('div.section table tr:eq(1)')
eq_(doc('td:eq(0)', row).text(), u'Prelim One 0.1')
eq_(doc('td a:eq(0)', row).attr('href'),
reverse('editors.review',
args=[self.versions[u'Prelim One'].id]) + '?num=1')
row = doc('div.section table tr:eq(2)')
eq_(doc('td:eq(0)', row).text(), u'Prelim Two 0.1')
eq_(doc('a:eq(0)', row).attr('href'),
reverse('editors.review',
args=[self.versions[u'Prelim Two'].id]) + '?num=2')
def test_queue_count(self):
r = self.client.get(reverse('editors.queue_prelim'))
eq_(r.status_code, 200)
doc = pq(r.content)
eq_(doc('.tabnav li a:eq(2)').text(), u'Preliminary Reviews (2)')
eq_(doc('.tabnav li a:eq(2)').attr('href'),
reverse('editors.queue_prelim'))

Просмотреть файл

@ -10,8 +10,10 @@ import amo
from amo.decorators import login_required
from devhub.models import ActivityLog
from editors import forms
from editors.models import ViewPendingQueue, ViewFullReviewQueue
from editors.helpers import ViewPendingQueueTable, ViewFullReviewQueueTable
from editors.models import (ViewPendingQueue, ViewFullReviewQueue,
ViewPreliminaryQueue)
from editors.helpers import (ViewPendingQueueTable, ViewFullReviewQueueTable,
ViewPreliminaryQueueTable)
from amo.utils import paginate
from amo.urlresolvers import reverse
from files.models import Approval
@ -89,8 +91,8 @@ def _queue(request, TableObj, tab):
queue_counts = {
'pending': ViewPendingQueue.objects.all().count(),
'nominated': ViewFullReviewQueue.objects.all().count(),
# TODO(Kumar) these are just placeholders
'prelim': ViewPendingQueue.objects.all().count(),
'prelim': ViewPreliminaryQueue.objects.all().count(),
# TODO(Kumar) this is just a placeholder
'moderated': ViewPendingQueue.objects.all().count()
}
page = paginate(request, table.rows, per_page=100,
@ -118,7 +120,7 @@ def queue_pending(request):
@editor_required
def queue_prelim(request):
raise NotImplementedError
return _queue(request, ViewPreliminaryQueueTable, 'prelim')
@editor_required

Просмотреть файл

@ -0,0 +1,32 @@
-- bug 627512
CREATE OR REPLACE VIEW view_ed_prelim_q AS
SELECT
addons.id,
tr.localized_string as addon_name,
addons.status as addon_status,
addons.addontype_id as addon_type_id,
addons.adminreview as admin_review,
addons.sitespecific as is_site_specific,
GROUP_CONCAT(versions.id
ORDER BY versions.created DESC) as latest_version_ids,
GROUP_CONCAT(versions.version
ORDER BY versions.created DESC SEPARATOR '&&&&') as
latest_versions,
GROUP_CONCAT(DISTINCT files.platform_id) as file_platform_ids,
TIMESTAMPDIFF(DAY,
MAX(versions.created), NOW()) as waiting_time_days,
TIMESTAMPDIFF(HOUR,
MAX(versions.created), NOW()) as waiting_time_hours,
GROUP_CONCAT(DISTINCT apps.application_id) as application_ids
FROM files
JOIN versions ON (files.version_id = versions.id)
JOIN addons ON (versions.addon_id = addons.id)
LEFT JOIN applications_versions as apps on versions.id = apps.version_id
JOIN translations AS tr ON (tr.id = addons.name
AND tr.locale = addons.defaultlocale)
WHERE
-- STATUS_UNREVIEWED
files.status = 1
-- STATUS_LITE, STATUS_UNREVIEWED
AND addons.status in (8, 1)
GROUP BY id;