Lovely day for PEP8 and pylint!
This commit is contained in:
@ -1,15 +1,16 @@
|
||||
from piston.emitters import Emitter, XMLEmitter
|
||||
from piston.emitters import XMLEmitter
|
||||
|
||||
|
||||
class EuscanXMLEmitter(XMLEmitter):
|
||||
_parent = []
|
||||
_known_parents = {
|
||||
'vlog' : 'version',
|
||||
'herds' : 'herd',
|
||||
'maintainers' : 'maintainer',
|
||||
'packaged' : 'version',
|
||||
'upstream' : 'version',
|
||||
'packages' : 'package',
|
||||
'categories' : 'category'
|
||||
'vlog': 'version',
|
||||
'herds': 'herd',
|
||||
'maintainers': 'maintainer',
|
||||
'packaged': 'version',
|
||||
'upstream': 'version',
|
||||
'packages': 'package',
|
||||
'categories': 'category'
|
||||
}
|
||||
|
||||
def _push_parent(self, parent):
|
||||
|
@ -1,24 +1,26 @@
|
||||
from piston.handler import AnonymousBaseHandler, BaseHandler
|
||||
from piston.utils import rc, HttpStatusCode
|
||||
from piston.handler import AnonymousBaseHandler
|
||||
from piston.utils import rc
|
||||
|
||||
from django.db.models import Sum, Max
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.forms.models import model_to_dict
|
||||
|
||||
from djeuscan.models import Version, Package, Herd, Maintainer, EuscanResult, VersionLog
|
||||
from djeuscan.forms import WorldForm, PackagesForm
|
||||
from djeuscan.models import Version, Package, Herd, Maintainer, EuscanResult, \
|
||||
VersionLog
|
||||
|
||||
# replace default XMLEmitter with ours
|
||||
from piston.emitters import Emitter
|
||||
from emitters import EuscanXMLEmitter
|
||||
Emitter.register('xml', EuscanXMLEmitter, 'text/xml; charset=utf-8')
|
||||
|
||||
|
||||
def xint(i):
|
||||
try:
|
||||
return int(i)
|
||||
except:
|
||||
return 0
|
||||
|
||||
|
||||
def renameFields(vqs, fields):
|
||||
ret = []
|
||||
for n in vqs:
|
||||
@ -29,6 +31,7 @@ def renameFields(vqs, fields):
|
||||
ret.append(n)
|
||||
return ret
|
||||
|
||||
|
||||
class catch_and_return(object):
|
||||
def __init__(self, err, response):
|
||||
self.err = err
|
||||
@ -42,6 +45,7 @@ class catch_and_return(object):
|
||||
return self.response
|
||||
return wrapper
|
||||
|
||||
|
||||
# /api/1.0/
|
||||
class RootHandler(AnonymousBaseHandler):
|
||||
allowed_methods = ('GET',)
|
||||
@ -49,52 +53,70 @@ class RootHandler(AnonymousBaseHandler):
|
||||
def read(self, request):
|
||||
return {'api-version': '1.0'}
|
||||
|
||||
|
||||
# /api/1.0/statistics
|
||||
class StatisticsHandler(AnonymousBaseHandler):
|
||||
allowed_methods = ('GET',)
|
||||
|
||||
def read(self, request):
|
||||
_aggr = Package.objects.aggregate
|
||||
data = {}
|
||||
data['n_packaged'] = xint(Package.objects.aggregate(Sum('n_packaged'))['n_packaged__sum'])
|
||||
data['n_overlay'] = xint(Package.objects.aggregate(Sum('n_overlay'))['n_overlay__sum'])
|
||||
data['n_versions'] = xint(Package.objects.aggregate(Sum('n_versions'))['n_versions__sum'])
|
||||
data['n_upstream'] = data['n_versions'] - data['n_packaged'] - data['n_overlay']
|
||||
data['n_packaged'] = xint(_aggr(Sum('n_packaged'))['n_packaged__sum'])
|
||||
data['n_overlay'] = xint(_aggr(Sum('n_overlay'))['n_overlay__sum'])
|
||||
data['n_versions'] = xint(_aggr(Sum('n_versions'))['n_versions__sum'])
|
||||
data['n_upstream'] = data['n_versions'] - data['n_packaged'] - \
|
||||
data['n_overlay']
|
||||
data['n_packages'] = Package.objects.count()
|
||||
data['n_herds'] = Herd.objects.count()
|
||||
data['n_maintainers'] = Maintainer.objects.count()
|
||||
data['last_scan'] = EuscanResult.objects.get(id=EuscanResult.objects.aggregate(Max('id'))['id__max']).datetime
|
||||
data['last_scan'] = EuscanResult.objects.get(
|
||||
id=EuscanResult.objects.aggregate(Max('id'))['id__max']
|
||||
).datetime
|
||||
|
||||
return data
|
||||
|
||||
|
||||
# /api/1.0/maintainers
|
||||
class MaintainersHandler(AnonymousBaseHandler):
|
||||
allowed_methods = ('GET',)
|
||||
|
||||
def read(self, request):
|
||||
maintainers = Package.objects.filter(maintainers__isnull=False)
|
||||
maintainers = maintainers.values('maintainers__id', 'maintainers__name', 'maintainers__email')
|
||||
maintainers = maintainers.values(
|
||||
'maintainers__id',
|
||||
'maintainers__name',
|
||||
'maintainers__email'
|
||||
)
|
||||
maintainers = maintainers.annotate(n_packaged=Sum('n_packaged'),
|
||||
n_overlay=Sum('n_overlay'),
|
||||
n_versions=Sum('n_versions'))
|
||||
|
||||
maintainers = renameFields(maintainers, [('maintainers__id', 'id'),
|
||||
('maintainers__name', 'name'),
|
||||
('maintainers__email', 'email')])
|
||||
return { 'maintainers' : maintainers }
|
||||
maintainers = renameFields(
|
||||
maintainers,
|
||||
[('maintainers__id', 'id'),
|
||||
('maintainers__name', 'name'),
|
||||
('maintainers__email', 'email')]
|
||||
)
|
||||
return {'maintainers': maintainers}
|
||||
|
||||
|
||||
# /api/1.0/herds
|
||||
class HerdsHandler(AnonymousBaseHandler):
|
||||
allowed_methods = ('GET',)
|
||||
|
||||
def read(self, request):
|
||||
# FIXME: optimize the query, it uses 'LEFT OUTER JOIN' instead of 'INNER JOIN'
|
||||
# FIXME: optimize the query, it uses 'LEFT OUTER JOIN'
|
||||
# instead of 'INNER JOIN'
|
||||
herds = Package.objects.filter(herds__isnull=False)
|
||||
herds = herds.values('herds__herd').annotate(n_packaged=Sum('n_packaged'),
|
||||
n_overlay=Sum('n_overlay'),
|
||||
n_versions=Sum('n_versions'))
|
||||
herds = herds.values('herds__herd').annotate(
|
||||
n_packaged=Sum('n_packaged'),
|
||||
n_overlay=Sum('n_overlay'),
|
||||
n_versions=Sum('n_versions')
|
||||
)
|
||||
|
||||
herds = renameFields(herds, [('herds__herd', 'herd')])
|
||||
return { 'herds' : herds }
|
||||
return {'herds': herds}
|
||||
|
||||
|
||||
# /api/1.0/categories
|
||||
class CategoriesHandler(AnonymousBaseHandler):
|
||||
@ -106,7 +128,8 @@ class CategoriesHandler(AnonymousBaseHandler):
|
||||
n_overlay=Sum('n_overlay'),
|
||||
n_versions=Sum('n_versions'))
|
||||
|
||||
return { 'categories' : categories }
|
||||
return {'categories': categories}
|
||||
|
||||
|
||||
# /api/1.0/packages/by-maintainer/
|
||||
# /api/1.0/packages/by-category/
|
||||
@ -125,17 +148,21 @@ class PackagesHandler(AnonymousBaseHandler):
|
||||
|
||||
if 'category' in kwargs:
|
||||
packages = Package.objects.filter(category=kwargs['category'])
|
||||
data = { 'category' : kwargs['category'] }
|
||||
data = {'category': kwargs['category']}
|
||||
elif 'herd' in kwargs:
|
||||
herd = Herd.objects.get(herd=kwargs['herd'])
|
||||
packages = Package.objects.filter(herds__id=herd.id)
|
||||
data = { 'herd' : herd }
|
||||
data = {'herd': herd}
|
||||
elif 'maintainer_id' in kwargs:
|
||||
maintainer = Maintainer.objects.get(id=kwargs['maintainer_id'])
|
||||
packages = Package.objects.filter(maintainers__id=maintainer.id)
|
||||
data = { 'maintainer' : maintainer }
|
||||
data = {'maintainer': maintainer}
|
||||
|
||||
packages = packages.select_related('last_version_gentoo', 'last_version_overlay', 'last_version_upstream')
|
||||
packages = packages.select_related(
|
||||
'last_version_gentoo',
|
||||
'last_version_overlay',
|
||||
'last_version_upstream'
|
||||
)
|
||||
data['packages'] = packages
|
||||
|
||||
if not data:
|
||||
@ -143,6 +170,7 @@ class PackagesHandler(AnonymousBaseHandler):
|
||||
|
||||
return data
|
||||
|
||||
|
||||
# /api/1.0/package/
|
||||
class PackageHandler(AnonymousBaseHandler):
|
||||
allowed_methods = ('GET',)
|
||||
@ -152,7 +180,8 @@ class PackageHandler(AnonymousBaseHandler):
|
||||
package = Package.objects.get(category=category, name=package)
|
||||
package.homepages = package.homepage.split(' ')
|
||||
versions = Version.objects.filter(package=package)
|
||||
log = EuscanResult.objects.filter(package=package).order_by('-datetime')[:1]
|
||||
log = EuscanResult.objects.filter(package=package).\
|
||||
order_by('-datetime')[:1]
|
||||
log = log[0] if log else None
|
||||
vlog = VersionLog.objects.filter(package=package).order_by('-id')
|
||||
|
||||
@ -166,7 +195,8 @@ class PackageHandler(AnonymousBaseHandler):
|
||||
|
||||
version_log = []
|
||||
for v in vlog:
|
||||
v = model_to_dict(v, ['version', 'revision', 'slot', 'overlay', 'datetime', 'action'])
|
||||
v = model_to_dict(v, ['version', 'revision', 'slot', 'overlay',
|
||||
'datetime', 'action'])
|
||||
if v['action'] == VersionLog.VERSION_ADDED:
|
||||
v['action'] = 'added'
|
||||
if v['action'] == VersionLog.VERSION_REMOVED:
|
||||
@ -177,7 +207,10 @@ class PackageHandler(AnonymousBaseHandler):
|
||||
packaged = []
|
||||
for version in versions:
|
||||
unpackaged = not version.packaged
|
||||
version = model_to_dict(version, ['version', 'revision', 'slot', 'overlay', 'urls'])
|
||||
version = model_to_dict(
|
||||
version,
|
||||
['version', 'revision', 'slot', 'overlay', 'urls']
|
||||
)
|
||||
if unpackaged:
|
||||
upstream.append(version)
|
||||
else:
|
||||
|
@ -1,7 +1,8 @@
|
||||
from django.conf.urls.defaults import *
|
||||
from django.conf.urls.defaults import url, patterns
|
||||
|
||||
from piston.resource import Resource
|
||||
from handlers import *
|
||||
from handlers import RootHandler, StatisticsHandler, HerdsHandler, \
|
||||
CategoriesHandler, MaintainersHandler, PackagesHandler, PackageHandler
|
||||
|
||||
root_handler = Resource(handler=RootHandler)
|
||||
statistics_handler = Resource(handler=StatisticsHandler)
|
||||
@ -12,16 +13,25 @@ packages_handler = Resource(handler=PackagesHandler)
|
||||
package_handler = Resource(handler=PackageHandler)
|
||||
|
||||
urlpatterns = patterns('djeuscan.api.views',
|
||||
url(r'^1.0/statistics\.(?P<emitter_format>.+)$', statistics_handler, name='api.views.statistics'),
|
||||
url(r'^1.0/herds\.(?P<emitter_format>.+)$', herds_handler, name='api.views.herds'),
|
||||
url(r'^1.0/categories\.(?P<emitter_format>.+)$', categories_handler, name='api.views.categories'),
|
||||
url(r'^1.0/maintainers\.(?P<emitter_format>.+)$', maintainers_handler, name='api.views.maintainers'),
|
||||
url(r'^1.0/statistics\.(?P<emitter_format>.+)$', statistics_handler,
|
||||
name='api.views.statistics'),
|
||||
url(r'^1.0/herds\.(?P<emitter_format>.+)$', herds_handler,
|
||||
name='api.views.herds'),
|
||||
url(r'^1.0/categories\.(?P<emitter_format>.+)$', categories_handler,
|
||||
name='api.views.categories'),
|
||||
url(r'^1.0/maintainers\.(?P<emitter_format>.+)$', maintainers_handler,
|
||||
name='api.views.maintainers'),
|
||||
|
||||
url(r'^1.0/packages/by-maintainer/(?P<maintainer_id>\d+)\.(?P<emitter_format>.+)$', packages_handler, name='api.views.packages'),
|
||||
url(r'^1.0/packages/by-herd/(?P<herd>[\@\{\}\w+.-]*)\.(?P<emitter_format>.+)?$', packages_handler, name='api.views.packages'),
|
||||
url(r'^1.0/packages/by-category/(?P<category>[\w+][\w+.-]*)\.(?P<emitter_format>.+)?$', packages_handler, name='api.views.packages'),
|
||||
url(r'^1.0/packages/by-maintainer/(?P<maintainer_id>\d+)\.(?P<emitter_format>.+)$',
|
||||
packages_handler, name='api.views.packages'),
|
||||
url(r'^1.0/packages/by-herd/(?P<herd>[\@\{\}\w+.-]*)\.(?P<emitter_format>.+)?$',
|
||||
packages_handler, name='api.views.packages'),
|
||||
url(r'^1.0/packages/by-category/(?P<category>[\w+][\w+.-]*)\.(?P<emitter_format>.+)?$',
|
||||
packages_handler, name='api.views.packages'),
|
||||
|
||||
url(r'^1.0/package/(?P<category>[\w+][\w+.-]*)/(?P<package>[\w+][\w+.-]*)\.(?P<emitter_format>.+)$', package_handler, name='api.views.package'),
|
||||
url(r'^1.0/package/(?P<category>[\w+][\w+.-]*)/(?P<package>[\w+][\w+.-]*)\.(?P<emitter_format>.+)$',
|
||||
package_handler, name='api.views.package'),
|
||||
|
||||
url(r'^1.0/api\.(?P<emitter_format>.+)$', root_handler, name='api.views.root'),
|
||||
url(r'^1.0/api\.(?P<emitter_format>.+)$',
|
||||
root_handler, name='api.views.root'),
|
||||
)
|
||||
|
Reference in New Issue
Block a user