2012-08-11 13:31:57 +02:00
|
|
|
import json
|
2013-02-26 09:33:25 +01:00
|
|
|
from urllib import urlencode
|
2012-08-11 13:31:57 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
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
|
2012-08-08 14:33:37 +02:00
|
|
|
from django.db.models import Q
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-11 13:31:57 +02:00
|
|
|
from euscan.version import gentoo_unstable
|
|
|
|
|
2013-02-26 09:33:25 +01:00
|
|
|
from djeuscan.models import Package, Herd, Maintainer, Version, VersionLog
|
2012-11-02 17:33:00 +01:00
|
|
|
|
|
|
|
from euscan_accounts.helpers import get_profile
|
2012-04-28 18:16:05 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2013-02-26 09:33:25 +01:00
|
|
|
class StabilizationCandidatesFeed(Feed):
|
|
|
|
feed_type = Atom1Feed
|
|
|
|
author_name = 'euscan'
|
|
|
|
item_author_name = author_name
|
|
|
|
title = 'Stabilization candidates'
|
|
|
|
link = "/"
|
|
|
|
description = "Stabilization candidates"
|
|
|
|
ttl = 3600
|
|
|
|
|
|
|
|
def item_title(self, version):
|
|
|
|
return version.cpv()
|
|
|
|
|
|
|
|
def item_description(self, version):
|
|
|
|
cpv = version.cpv()
|
|
|
|
maintainers = herds = ""
|
|
|
|
|
|
|
|
if version.package.maintainers.all():
|
|
|
|
maintainers = "Maintainers: {}\n".format(
|
2013-03-09 12:35:39 +01:00
|
|
|
", ".join(str(m) for m in version.package.maintainers.all())
|
2013-02-26 09:33:25 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
if version.package.herds.all():
|
|
|
|
herds = "Herds: {}\n".format(
|
2013-03-09 12:35:39 +01:00
|
|
|
", ".join(str(h) for h in version.package.herds.all())
|
2013-02-26 09:33:25 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
bugs_link = "https://bugs.gentoo.org/buglist.cgi?quicksearch={}"
|
|
|
|
|
|
|
|
comment = """
|
|
|
|
This bug was filed via euscan
|
|
|
|
|
|
|
|
How much have you used the package in question?
|
|
|
|
|
|
|
|
Have you had any problems with the package?
|
|
|
|
|
|
|
|
emerge --info:
|
|
|
|
|
|
|
|
Other info:
|
|
|
|
{} {}
|
|
|
|
""".format(herds, maintainers)
|
|
|
|
comment = "\n".join([line.lstrip() for line in comment.split("\n")])
|
|
|
|
description = """
|
|
|
|
Added to tree: {date}<br/>
|
|
|
|
{herds} <br />
|
|
|
|
{maintainers}<br />
|
|
|
|
Open bugs for {cat_pn}:
|
|
|
|
<a href="{cat_bugs}">Show</a><br />
|
|
|
|
Open bugs for {pn}:
|
|
|
|
<a href="{pn_bugs}">Show</a><br />
|
|
|
|
<a href="{submit_bug}">File bug </a>
|
|
|
|
""".format(
|
|
|
|
date=version.stabilization_candidate,
|
|
|
|
herds=herds,
|
|
|
|
maintainers=maintainers,
|
2013-03-09 13:09:44 +01:00
|
|
|
cat_pn=version.package.cp(),
|
|
|
|
cat_bugs=bugs_link.format(version.package.cp()),
|
|
|
|
pn=version.package.name,
|
|
|
|
pn_bugs=bugs_link.format(version.package.name),
|
2013-02-26 09:33:25 +01:00
|
|
|
submit_bug='https://bugs.gentoo.org/enter_bug.cgi?{}'.format(
|
|
|
|
urlencode({
|
|
|
|
"product": 'Gentoo Linux',
|
|
|
|
"short_desc": "Stable request for {}".format(cpv),
|
|
|
|
"comment": comment,
|
|
|
|
"keywords": 'STABLEREQ',
|
|
|
|
})
|
|
|
|
),
|
|
|
|
)
|
|
|
|
return description
|
|
|
|
|
|
|
|
def item_link(self, version):
|
|
|
|
kwargs = {'category': version.package.category,
|
|
|
|
'package': version.package.name}
|
|
|
|
return "%s#version-%s" % (
|
|
|
|
reverse('djeuscan.views.package', kwargs=kwargs), version.tag
|
|
|
|
)
|
|
|
|
|
|
|
|
def item_categories(self):
|
|
|
|
return ["stabilization_candidate"]
|
|
|
|
|
|
|
|
def items(self):
|
|
|
|
versions = Version.objects.exclude(stabilization_candidate=None)
|
2013-03-09 12:35:39 +01:00
|
|
|
return versions.order_by("-stabilization_candidate")
|
2013-02-26 09:33:25 +01:00
|
|
|
|
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
class BaseFeed(Feed):
|
|
|
|
feed_type = Atom1Feed
|
2011-08-28 10:45:46 +02:00
|
|
|
author_name = 'euscan'
|
|
|
|
item_author_name = author_name
|
|
|
|
ttl = 3600
|
2011-08-25 15:39:54 +02:00
|
|
|
|
|
|
|
def item_title(self, vlog):
|
|
|
|
return str(vlog)
|
|
|
|
|
|
|
|
def item_description(self, vlog):
|
|
|
|
if vlog.overlay:
|
2012-04-28 18:16:05 +02:00
|
|
|
txt = 'Version %s-%s [%s] of package %s ' % \
|
|
|
|
(vlog.version, vlog.revision, vlog.slot, vlog.package)
|
2011-08-25 15:39:54 +02:00
|
|
|
else:
|
|
|
|
txt = 'Version %s of package %s ' % (vlog.version, vlog.package)
|
|
|
|
if vlog.action == vlog.VERSION_REMOVED:
|
2011-08-28 10:45:46 +02:00
|
|
|
if not vlog.overlay:
|
2011-08-25 15:39:54 +02:00
|
|
|
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):
|
2012-04-28 18:16:05 +02:00
|
|
|
kwargs = {'category': vlog.package.category,
|
|
|
|
'package': vlog.package.name}
|
2012-11-08 15:19:45 +01:00
|
|
|
return "%s#version-%s" % (
|
|
|
|
reverse('djeuscan.views.package', kwargs=kwargs), vlog.tag
|
2012-08-15 15:32:16 +02:00
|
|
|
)
|
2011-08-25 15:39:54 +02:00
|
|
|
|
|
|
|
def item_pubdate(self, vlog):
|
|
|
|
return vlog.datetime
|
|
|
|
|
|
|
|
def item_categories(self, vlog):
|
|
|
|
return [vlog.package.category]
|
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def items(self, data=None):
|
|
|
|
user = data.get("user", None) if data else None
|
2012-08-11 13:31:57 +02:00
|
|
|
options = data.get("options", {}) if data else {}
|
2012-08-09 12:20:19 +02:00
|
|
|
|
|
|
|
# first of all consider options, then user preferences
|
2012-08-11 13:31:57 +02:00
|
|
|
try:
|
|
|
|
upstream_info = json.loads(options.get("upstream_info", "1"))
|
|
|
|
portage_info = json.loads(options.get("portage_info", "1"))
|
|
|
|
show_adds = json.loads(options.get("show_adds", "1"))
|
|
|
|
show_removals = json.loads(options.get("show_removals", "1"))
|
|
|
|
ignore_pre = json.loads(options.get("ignore_pre", "0"))
|
|
|
|
ignore_pre_if_stable = json.loads(
|
|
|
|
options.get("ignore_pre_if_stable", "0")
|
|
|
|
)
|
|
|
|
except ValueError:
|
|
|
|
return []
|
|
|
|
|
|
|
|
if user and not options:
|
2012-08-09 12:20:19 +02:00
|
|
|
profile = get_profile(user)
|
2012-08-11 13:31:57 +02:00
|
|
|
upstream_info = profile.feed_upstream_info
|
|
|
|
portage_info = profile.feed_portage_info
|
|
|
|
show_adds = profile.feed_show_adds
|
|
|
|
show_removals = profile.feed_show_removals
|
|
|
|
ignore_pre = profile.feed_ignore_pre
|
|
|
|
ignore_pre_if_stable = profile.feed_ignore_pre_if_stable
|
2012-08-09 12:20:19 +02:00
|
|
|
|
|
|
|
ret, max_items = self._items(data)
|
|
|
|
|
|
|
|
if not upstream_info:
|
|
|
|
ret = ret.exclude(overlay="")
|
|
|
|
if not portage_info:
|
|
|
|
ret = ret.exclude(~Q(overlay=""))
|
2012-08-11 13:31:57 +02:00
|
|
|
if not show_adds:
|
|
|
|
ret = ret.exclude(action=VersionLog.VERSION_ADDED)
|
|
|
|
if not show_removals:
|
|
|
|
ret = ret.exclude(action=VersionLog.VERSION_REMOVED)
|
|
|
|
if ignore_pre:
|
|
|
|
ret = ret.exclude(vtype__in=gentoo_unstable)
|
|
|
|
if ignore_pre_if_stable:
|
|
|
|
ret = ret.exclude(
|
|
|
|
~Q(package__last_version_gentoo__vtype__in=gentoo_unstable),
|
|
|
|
vtype__in=gentoo_unstable
|
|
|
|
)
|
2012-08-09 12:20:19 +02:00
|
|
|
|
|
|
|
return ret.order_by("-datetime")[:max_items]
|
|
|
|
|
2012-04-28 18:16:05 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
class GlobalFeed(BaseFeed):
|
|
|
|
title = "euscan"
|
|
|
|
link = "/"
|
|
|
|
description = "Last euscan changes"
|
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def get_object(self, request):
|
|
|
|
return {"options": request.GET}
|
|
|
|
|
|
|
|
def categories(self, data):
|
2012-05-05 10:30:09 +02:00
|
|
|
categories = Package.objects.categories()
|
2012-04-28 18:16:05 +02:00
|
|
|
return [category['category'] for category in categories]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def _items(self, data):
|
|
|
|
return VersionLog.objects.all(), 250
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-04-28 18:16:05 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
class PackageFeed(BaseFeed):
|
|
|
|
feed_type = Atom1Feed
|
|
|
|
|
|
|
|
def get_object(self, request, category, package):
|
2012-08-09 12:20:19 +02:00
|
|
|
return {
|
|
|
|
"obj": get_object_or_404(Package, category=category, name=package),
|
|
|
|
"options": request.GET,
|
|
|
|
}
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def title(self, data):
|
|
|
|
return "%s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def link(self, data):
|
|
|
|
return reverse('djeuscan.views.package', args=[data["obj"].category,
|
|
|
|
data["obj"].name])
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def description(self, data):
|
|
|
|
return data["obj"].description
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def _items(self, data):
|
|
|
|
return VersionLog.objects.for_package(data["obj"]), 30
|
2011-08-25 15:39:54 +02:00
|
|
|
|
|
|
|
def item_description(self, vlog):
|
|
|
|
return ''
|
|
|
|
|
2012-04-28 18:16:05 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
class MaintainerFeed(BaseFeed):
|
|
|
|
feed_type = Atom1Feed
|
|
|
|
|
2012-10-29 12:47:32 +01:00
|
|
|
def get_object(self, request, maintainer_id=None, maintainer_email=None):
|
|
|
|
if maintainer_id:
|
|
|
|
obj = get_object_or_404(Maintainer, id=maintainer_id)
|
|
|
|
else:
|
|
|
|
obj = get_object_or_404(Maintainer, email=maintainer_email)
|
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
return {
|
2012-10-29 12:47:32 +01:00
|
|
|
"obj": obj,
|
2012-08-09 12:20:19 +02:00
|
|
|
"options": request.GET,
|
|
|
|
}
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def title(self, data):
|
|
|
|
return "%s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def description(self, data):
|
|
|
|
return "Last changes for %s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def link(self, data):
|
2012-10-29 12:47:32 +01:00
|
|
|
return reverse('djeuscan.views.maintainer', args=[data["obj"].email])
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def _items(self, data):
|
|
|
|
return VersionLog.objects.for_maintainer(data["obj"]), 50
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-04-28 18:16:05 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
class HerdFeed(BaseFeed):
|
|
|
|
feed_type = Atom1Feed
|
|
|
|
|
|
|
|
def get_object(self, request, herd):
|
2012-08-09 12:20:19 +02:00
|
|
|
return {
|
|
|
|
"obj": get_object_or_404(Herd, herd=herd),
|
|
|
|
"options": request.GET,
|
|
|
|
}
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def title(self, data):
|
|
|
|
return "%s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def description(self, data):
|
|
|
|
return "Last changes for %s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def link(self, data):
|
|
|
|
return reverse('djeuscan.views.herd',
|
|
|
|
kwargs={'herd': data["obj"].herd})
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def _items(self, data):
|
|
|
|
return VersionLog.objects.for_herd(data["obj"]), 100
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-04-28 18:16:05 +02:00
|
|
|
|
2011-08-25 15:39:54 +02:00
|
|
|
class CategoryFeed(BaseFeed):
|
|
|
|
feed_type = Atom1Feed
|
|
|
|
|
|
|
|
def get_object(self, request, category):
|
2012-05-05 10:30:09 +02:00
|
|
|
if not Package.objects.categories().count():
|
2011-08-25 15:39:54 +02:00
|
|
|
raise FeedDoesNotExist
|
2012-08-09 12:20:19 +02:00
|
|
|
return {
|
|
|
|
"obj": category,
|
|
|
|
"options": request.GET,
|
|
|
|
}
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def title(self, data):
|
|
|
|
return "%s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def description(self, data):
|
|
|
|
return "Last changes for %s" % data["obj"]
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def link(self, data):
|
|
|
|
return reverse('djeuscan.views.category', args=[data["obj"]])
|
2011-08-25 15:39:54 +02:00
|
|
|
|
2012-08-09 12:20:19 +02:00
|
|
|
def _items(self, data):
|
|
|
|
return VersionLog.objects.for_category(data["obj"]), 100
|
2012-08-08 13:30:56 +02:00
|
|
|
|
|
|
|
|
2012-09-14 15:25:08 +02:00
|
|
|
class WorldScanFeed(BaseFeed):
|
|
|
|
link = "/"
|
|
|
|
|
|
|
|
def get_object(self, request):
|
|
|
|
return {
|
|
|
|
"options": request.GET,
|
|
|
|
}
|
|
|
|
|
|
|
|
def _items(self, data):
|
|
|
|
packages = []
|
2012-09-21 17:10:51 +02:00
|
|
|
for pkg_name in data["options"].getlist("p", []):
|
2012-09-14 15:25:08 +02:00
|
|
|
if "/" in pkg_name:
|
|
|
|
cat, name = pkg_name.split("/", 1)
|
|
|
|
pkg = Package.objects.filter(name=name, category=cat)
|
|
|
|
else:
|
|
|
|
pkg = Package.objects.filter(name=pkg_name)
|
|
|
|
packages.extend(pkg)
|
|
|
|
|
|
|
|
vlogs = VersionLog.objects.filter(package__in=packages)
|
|
|
|
|
|
|
|
return vlogs, 100
|