diff --git a/euscanwww/djeuscan/feeds.py b/euscanwww/djeuscan/feeds.py index 9d1c513..22befb3 100644 --- a/euscanwww/djeuscan/feeds.py +++ b/euscanwww/djeuscan/feeds.py @@ -48,38 +48,69 @@ class BaseFeed(Feed): def item_categories(self, vlog): return [vlog.package.category] + def items(self, data=None): + user = data.get("user", None) if data else None + options = data.get("options", None) if data else None + + upstream_info = True + portage_info = True + + # first of all consider options, then user preferences + if options: + upstream_info = "upstream_info" in options + portage_info = "portage_info" in options + elif user: + profile = get_profile(user) + upstream_info = profile.upstream_info + portage_info = profile.portage_info + + ret, max_items = self._items(data) + + if not upstream_info: + ret = ret.exclude(overlay="") + if not portage_info: + ret = ret.exclude(~Q(overlay="")) + + return ret.order_by("-datetime")[:max_items] + class GlobalFeed(BaseFeed): title = "euscan" link = "/" description = "Last euscan changes" - def categories(self): + def get_object(self, request): + return {"options": request.GET} + + def categories(self, data): categories = Package.objects.categories() return [category['category'] for category in categories] - def items(self): - return VersionLog.objects.order_by('-id')[:250] + def _items(self, data): + return VersionLog.objects.all(), 250 class PackageFeed(BaseFeed): feed_type = Atom1Feed def get_object(self, request, category, package): - return get_object_or_404(Package, category=category, name=package) + return { + "obj": get_object_or_404(Package, category=category, name=package), + "options": request.GET, + } - def title(self, package): - return "%s" % package + def title(self, data): + return "%s" % data["obj"] - def link(self, package): - return reverse('djeuscan.views.package', args=[package.category, - package.name]) + def link(self, data): + return reverse('djeuscan.views.package', args=[data["obj"].category, + data["obj"].name]) - def description(self, package): - return package.description + def description(self, data): + return data["obj"].description - def items(self, package): - return VersionLog.objects.for_package(package, order=True)[:30] + def _items(self, data): + return VersionLog.objects.for_package(data["obj"]), 30 def item_description(self, vlog): return '' @@ -89,39 +120,46 @@ class MaintainerFeed(BaseFeed): feed_type = Atom1Feed def get_object(self, request, maintainer_id): - return get_object_or_404(Maintainer, id=maintainer_id) + return { + "obj": get_object_or_404(Maintainer, id=maintainer_id), + "options": request.GET, + } - def title(self, maintainer): - return "%s" % maintainer + def title(self, data): + return "%s" % data["obj"] - def description(self, maintainer): - return "Last changes for %s" % maintainer + def description(self, data): + return "Last changes for %s" % data["obj"] - def link(self, maintainer): + def link(self, data): return reverse('djeuscan.views.maintainer', - kwargs={'maintainer_id': maintainer.id}) + kwargs={'maintainer_id': data["obj"].id}) - def items(self, maintainer): - return VersionLog.objects.for_maintainer(maintainer, order=True)[:50] + def _items(self, data): + return VersionLog.objects.for_maintainer(data["obj"]), 50 class HerdFeed(BaseFeed): feed_type = Atom1Feed def get_object(self, request, herd): - return get_object_or_404(Herd, herd=herd) + return { + "obj": get_object_or_404(Herd, herd=herd), + "options": request.GET, + } - def title(self, herd): - return "%s" % herd + def title(self, data): + return "%s" % data["obj"] - def description(self, herd): - return "Last changes for %s" % herd + def description(self, data): + return "Last changes for %s" % data["obj"] - def link(self, herd): - return reverse('djeuscan.views.herd', kwargs={'herd': herd.herd}) + def link(self, data): + return reverse('djeuscan.views.herd', + kwargs={'herd': data["obj"].herd}) - def items(self, herd): - return VersionLog.objects.for_herd(herd, order=True)[:100] + def _items(self, data): + return VersionLog.objects.for_herd(data["obj"]), 100 class CategoryFeed(BaseFeed): @@ -130,56 +168,46 @@ class CategoryFeed(BaseFeed): def get_object(self, request, category): if not Package.objects.categories().count(): raise FeedDoesNotExist - return category + return { + "obj": category, + "options": request.GET, + } - def title(self, category): - return "%s" % category + def title(self, data): + return "%s" % data["obj"] - def description(self, category): - return "Last changes for %s" % category + def description(self, data): + return "Last changes for %s" % data["obj"] - def link(self, category): - return reverse('djeuscan.views.category', args=[category]) + def link(self, data): + return reverse('djeuscan.views.category', args=[data["obj"]]) - def items(self, category): - return VersionLog.objects.for_category(category, order=True)[:100] + def _items(self, data): + return VersionLog.objects.for_category(data["obj"]), 100 class UserFeed(BaseFeed): link = "/" def description(self, data): - return "%s - last euscan changes" + return "%s - last euscan changes" % data["user"] def title(self, data): - return "%s - watched packages" % data[0] + return "%s - watched packages" % data["user"] def get_object(self, request): - options = request.GET - return request.user, options + return { + "user": request.user, + "options": request.GET, + } - def items(self, data): - user, options = data + def _items(self, data): + user, options = data["user"], data["options"] profile = get_profile(user) packages = get_account_packages(user) overlays = [o.name for o in profile.overlays.all()] - ret = VersionLog.objects.filter( + return 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] + ), 100