8b39853b5f
Signed-off-by: volpino <fox91@anche.no>
186 lines
5.3 KiB
Python
186 lines
5.3 KiB
Python
from django.contrib.syndication.views import Feed, FeedDoesNotExist
|
|
from django.shortcuts import get_object_or_404
|
|
from django.utils.feedgenerator import Atom1Feed
|
|
from django.core.urlresolvers import reverse
|
|
from django.db.models import Q
|
|
|
|
from djeuscan.models import Package, Herd, Maintainer, VersionLog
|
|
from djeuscan.helpers import get_profile, get_account_packages
|
|
|
|
|
|
class BaseFeed(Feed):
|
|
feed_type = Atom1Feed
|
|
author_name = 'euscan'
|
|
item_author_name = author_name
|
|
ttl = 3600
|
|
|
|
def item_title(self, vlog):
|
|
return str(vlog)
|
|
|
|
def item_description(self, vlog):
|
|
if vlog.overlay:
|
|
txt = 'Version %s-%s [%s] of package %s ' % \
|
|
(vlog.version, vlog.revision, vlog.slot, vlog.package)
|
|
else:
|
|
txt = 'Version %s of package %s ' % (vlog.version, vlog.package)
|
|
if vlog.action == vlog.VERSION_REMOVED:
|
|
if not vlog.overlay:
|
|
txt += 'has been removed upstream'
|
|
else:
|
|
txt += 'has been removed from overlay "%s"' % vlog.overlay
|
|
if vlog.action == vlog.VERSION_ADDED:
|
|
if not vlog.overlay:
|
|
txt += 'has been added upstream'
|
|
else:
|
|
txt += 'has been added to overlay "%s"' % vlog.overlay
|
|
|
|
return txt
|
|
|
|
def item_link(self, vlog):
|
|
kwargs = {'category': vlog.package.category,
|
|
'package': vlog.package.name}
|
|
return "%s#%s" % (reverse('djeuscan.views.package', kwargs=kwargs),
|
|
vlog.tag())
|
|
|
|
def item_pubdate(self, vlog):
|
|
return vlog.datetime
|
|
|
|
def item_categories(self, vlog):
|
|
return [vlog.package.category]
|
|
|
|
|
|
class GlobalFeed(BaseFeed):
|
|
title = "euscan"
|
|
link = "/"
|
|
description = "Last euscan changes"
|
|
|
|
def categories(self):
|
|
categories = Package.objects.categories()
|
|
return [category['category'] for category in categories]
|
|
|
|
def items(self):
|
|
return VersionLog.objects.order_by('-id')[:250]
|
|
|
|
|
|
class PackageFeed(BaseFeed):
|
|
feed_type = Atom1Feed
|
|
|
|
def get_object(self, request, category, package):
|
|
return get_object_or_404(Package, category=category, name=package)
|
|
|
|
def title(self, package):
|
|
return "%s" % package
|
|
|
|
def link(self, package):
|
|
return reverse('djeuscan.views.package', args=[package.category,
|
|
package.name])
|
|
|
|
def description(self, package):
|
|
return package.description
|
|
|
|
def items(self, package):
|
|
return VersionLog.objects.for_package(package, order=True)[:30]
|
|
|
|
def item_description(self, vlog):
|
|
return ''
|
|
|
|
|
|
class MaintainerFeed(BaseFeed):
|
|
feed_type = Atom1Feed
|
|
|
|
def get_object(self, request, maintainer_id):
|
|
return get_object_or_404(Maintainer, id=maintainer_id)
|
|
|
|
def title(self, maintainer):
|
|
return "%s" % maintainer
|
|
|
|
def description(self, maintainer):
|
|
return "Last changes for %s" % maintainer
|
|
|
|
def link(self, maintainer):
|
|
return reverse('djeuscan.views.maintainer',
|
|
kwargs={'maintainer_id': maintainer.id})
|
|
|
|
def items(self, maintainer):
|
|
return VersionLog.objects.for_maintainer(maintainer, order=True)[:50]
|
|
|
|
|
|
class HerdFeed(BaseFeed):
|
|
feed_type = Atom1Feed
|
|
|
|
def get_object(self, request, herd):
|
|
return get_object_or_404(Herd, herd=herd)
|
|
|
|
def title(self, herd):
|
|
return "%s" % herd
|
|
|
|
def description(self, herd):
|
|
return "Last changes for %s" % herd
|
|
|
|
def link(self, herd):
|
|
return reverse('djeuscan.views.herd', kwargs={'herd': herd.herd})
|
|
|
|
def items(self, herd):
|
|
return VersionLog.objects.for_herd(herd, order=True)[:100]
|
|
|
|
|
|
class CategoryFeed(BaseFeed):
|
|
feed_type = Atom1Feed
|
|
|
|
def get_object(self, request, category):
|
|
if not Package.objects.categories().count():
|
|
raise FeedDoesNotExist
|
|
return category
|
|
|
|
def title(self, category):
|
|
return "%s" % category
|
|
|
|
def description(self, category):
|
|
return "Last changes for %s" % category
|
|
|
|
def link(self, category):
|
|
return reverse('djeuscan.views.category', args=[category])
|
|
|
|
def items(self, category):
|
|
return VersionLog.objects.for_category(category, order=True)[:100]
|
|
|
|
|
|
class UserFeed(BaseFeed):
|
|
link = "/"
|
|
|
|
def description(self, data):
|
|
return "%s - last euscan changes"
|
|
|
|
def title(self, data):
|
|
return "%s - watched packages" % data[0]
|
|
|
|
def get_object(self, request):
|
|
options = request.GET
|
|
return request.user, options
|
|
|
|
def items(self, data):
|
|
user, options = data
|
|
|
|
profile = get_profile(user)
|
|
packages = get_account_packages(user)
|
|
overlays = [o.name for o in profile.overlays.all()]
|
|
|
|
ret = VersionLog.objects.filter(
|
|
Q(package__in=packages) | Q(overlay__in=overlays)
|
|
)
|
|
|
|
# first of all consider options, then user preferences
|
|
if options:
|
|
upstream_info = "upstream_info" in options
|
|
portage_info = "portage_info" in options
|
|
else:
|
|
upstream_info = profile.upstream_info
|
|
portage_info = profile.portage_info
|
|
|
|
if not upstream_info:
|
|
ret = ret.exclude(overlay="")
|
|
if not portage_info:
|
|
ret = ret.exclude(~Q(overlay=""))
|
|
|
|
return ret.order_by("-datetime")[:100]
|