Skip to content

Commit

Permalink
Converts view-based editor queues to raw SQL (bug 633319, 622171)
Browse files Browse the repository at this point in the history
  • Loading branch information
kumar303 committed Feb 12, 2011
1 parent e35fc54 commit 05b771e
Show file tree
Hide file tree
Showing 7 changed files with 679 additions and 86 deletions.
24 changes: 11 additions & 13 deletions apps/editors/helpers.py
Expand Up @@ -9,6 +9,7 @@
import amo
from editors.models import (ViewPendingQueue, ViewFullReviewQueue,
ViewPreliminaryQueue)
from editors.sql_table import SQLTable
from amo.helpers import page_title
from amo.urlresolvers import reverse

Expand All @@ -25,7 +26,13 @@ def editor_page_title(context, title=None, addon=None):
return page_title(context, title)


class EditorQueueTable:
class EditorQueueTable(SQLTable):
addon_name = tables.Column(verbose_name=_(u'Addon'))
addon_type_id = tables.Column(verbose_name=_(u'Type'))
waiting_time_days = tables.Column(verbose_name=_(u'Waiting Time'))
flags = tables.Column(verbose_name=_(u'Flags'))
applications = tables.Column(verbose_name=_(u'Applications'))
additional_info = tables.Column(verbose_name=_(u'Additional Information'))

def render_addon_name(self, row):
url = '%s?num=%s' % (reverse('editors.review',
Expand Down Expand Up @@ -86,28 +93,19 @@ class Meta:
'flags', 'applications', 'additional_info']


class ViewPendingQueueTable(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 ViewPendingQueueTable(EditorQueueTable):

class Meta(EditorQueueTable.Meta):
model = ViewPendingQueue


class ViewFullReviewQueueTable(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 ViewFullReviewQueueTable(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 ViewPreliminaryQueueTable(EditorQueueTable):

class Meta(EditorQueueTable.Meta):
model = ViewPreliminaryQueue
167 changes: 94 additions & 73 deletions apps/editors/models.py
@@ -1,14 +1,15 @@
import copy
import os

from django.db import models
from django.conf import settings
from django.db import connection, models
from django.db.models.signals import post_syncdb
from tower import ugettext_lazy as _

import amo
import amo.models
from translations.fields import TranslatedField
from users.models import UserProfile
from editors.sql_model import RawSQLModel


class CannedResponse(amo.models.ModelBase):
Expand Down Expand Up @@ -38,33 +39,53 @@ class Meta:
db_table = u'eventlog'


def _create_view(migration_file):
cursor = connection.cursor()
ddl = os.path.join(settings.ROOT, 'migrations',
migration_file)
with open(ddl, 'r') as f:
cursor.execute(f.read())


class ViewQueue(models.Model):
STATUS_CHOICES = amo.STATUS_CHOICES.items()
# id is Addon ID.
addon_name = models.CharField(max_length=255, verbose_name=_(u'Addon'))
addon_status = models.PositiveIntegerField(choices=STATUS_CHOICES)
addon_type_id = models.PositiveIntegerField(verbose_name=_(u'Type'))
class ViewQueue(RawSQLModel):
id = models.IntegerField()
addon_name = models.CharField(max_length=255)
addon_status = models.IntegerField()
addon_type_id = models.IntegerField()
admin_review = models.BooleanField()
is_site_specific = models.BooleanField()
waiting_time_days = models.PositiveIntegerField(
verbose_name=_(u'Waiting Time'))
waiting_time_hours = models.PositiveIntegerField()
_latest_version_ids = models.CharField(max_length=255,
db_column='latest_version_ids')
_latest_versions = models.CharField(max_length=255,
db_column='latest_versions')
_file_platform_ids = models.CharField(max_length=255,
db_column='file_platform_ids')
_application_ids = models.CharField(max_length=255,
db_column='application_ids')
_latest_versions = models.CharField(max_length=255)
_latest_version_ids = models.CharField(max_length=255)
_file_platform_ids = models.CharField(max_length=255)
_application_ids = models.CharField(max_length=255)
waiting_time_days = models.IntegerField()
waiting_time_hours = models.IntegerField()

def base_query(self):
return {
'select': {
'id': 'addons.id',
'addon_name': 'tr.localized_string',
'addon_status': 'addons.status',
'addon_type_id': 'addons.addontype_id',
'admin_review': 'addons.adminreview',
'is_site_specific': 'addons.sitespecific',
'_latest_version_ids':
"""GROUP_CONCAT(versions.id
ORDER BY versions.created DESC)""",
'_latest_versions':
"""GROUP_CONCAT(versions.version
ORDER BY versions.created
DESC SEPARATOR '&&&&')""",
'_file_platform_ids':
'GROUP_CONCAT(DISTINCT files.platform_id)',
'_application_ids':
'GROUP_CONCAT(DISTINCT apps.application_id)'
},
'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': [],
'group_by': 'id'}

@property
def latest_version(self):
Expand All @@ -83,52 +104,52 @@ def file_platform_ids(self):
def application_ids(self):
return self._explode_concat(self._application_ids)

def _explode_concat(self, value, sep=',', cast=int):
"""Returns list of IDs in a MySQL GROUP_CONCAT(field) result."""
if value is None:
# for NULL fields, ala left joins
return []
return [cast(i) for i in value.split(sep)]

class Meta:
abstract = True
managed = False


class ViewPendingQueue(ViewQueue):

class Meta(ViewQueue.Meta):
db_table = 'view_ed_pending_q'


def create_view_ed_pending_q(sender, **kw):
_create_view('134-view_ed_pending_q.sql')


post_syncdb.connect(create_view_ed_pending_q)


class ViewFullReviewQueue(ViewQueue):

class Meta(ViewQueue.Meta):
db_table = 'view_ed_full_review_q'


def create_view_ed_full_review_q(sender, **kw):
_create_view('136-view_ed_full_review_q.sql')


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)
def base_query(self):
q = super(ViewFullReviewQueue, self).base_query()
q['select'].update({
'waiting_time_days':
'TIMESTAMPDIFF(DAY, addons.nominationdate, NOW())',
'waiting_time_hours':
'TIMESTAMPDIFF(HOUR, addons.nominationdate, NOW())'
})
q['where'].extend(['files.status <> %s' % amo.STATUS_BETA,
'addons.status IN (%s, %s)' % (
amo.STATUS_NOMINATED,
amo.STATUS_LITE_AND_NOMINATED)])
return q


class VersionSpecificQueue(ViewQueue):

def base_query(self):
q = copy.deepcopy(super(VersionSpecificQueue, self).base_query())
q['select'].update({
'waiting_time_days':
'TIMESTAMPDIFF(DAY, MAX(versions.created), NOW())',
'waiting_time_hours':
'TIMESTAMPDIFF(HOUR, MAX(versions.created), NOW())'
})
return q


class ViewPendingQueue(VersionSpecificQueue):

def base_query(self):
q = super(ViewPendingQueue, self).base_query()
q['where'].extend(['files.status = %s' % amo.STATUS_UNREVIEWED,
'addons.status = %s' % amo.STATUS_PUBLIC])
return q


class ViewPreliminaryQueue(VersionSpecificQueue):

def base_query(self):
q = super(ViewPreliminaryQueue, self).base_query()
q['where'].extend(['files.status = %s' % amo.STATUS_UNREVIEWED,
'addons.status IN (%s, %s)' % (
amo.STATUS_LITE,
amo.STATUS_UNREVIEWED)])
return q

0 comments on commit 05b771e

Please sign in to comment.