Beispiel #1
0
    def execute_view(self, request, **kwargs):
        url = kwargs["url"]
        type = kwargs["type"]
        content_item = db.query(ContentItem).filter(ContentItem.type == type, ContentItem.type_key == url, ContentItem.permissions_for(request.user)).first()
        if content_item is None:
            raise NotFound()
        item_dict = self._item_dict(content_item)
        return self.render_to_response(request, [
            "content/type/%s/view.html" % (item_dict["type"],),
            "content/type/%s/view.html" % (item_dict["base_type"],),
        ], **{
            "meta_properties"   :   {
                                        "og_description"    : item_dict["description"],
                                        "og_image"          : item_dict["image"],

                                    },
            "breadcrumbs"       :   [item_dict["title"]],
            "body_class"        :   "view " + item_dict["base_type"] + " " + item_dict["type"],
            "item"              :   item_dict,
        })
def block(request, feed, item):    
    next = db.query(ContentItem).filter(ContentItem.type.in_(get_content_feeds()[feed]["types"]), ContentItem.permissions_for(request.user), ContentItem.created_at > item["created_at"]).order_by(ContentItem.created_at).first()
    prev = db.query(ContentItem).filter(ContentItem.type.in_(get_content_feeds()[feed]["types"]), ContentItem.permissions_for(request.user), ContentItem.created_at < item["created_at"]).order_by(ContentItem.created_at.desc()).first()
    if next or prev:
        return {
            "next"  : process_content_item(next) if next else None,
            "prev"  : process_content_item(prev) if prev else None,
        }
    else:
        return None
Beispiel #3
0
    def execute_feed(self, request, **kwargs):        
        feed = self.feeds[kwargs["feed"]]
        format = kwargs.get("format", "html")

        f = self.feeds[kwargs["feed"]]["url"]
        q = db.query(ContentItem).filter(ContentItem.parent_id == None, ContentItem.type.in_(feed["types"]), ContentItem.permissions_for(request.user)).options(subqueryload("children"), subqueryload("comments"), subqueryload("tags"))
        t = []

        if "tag" in kwargs:
            tag = db.query(Tag).filter(Tag.url == kwargs["tag"]).first()
            if tag is None:
                raise NotFound()
            f += "/tag/" + kwargs["tag"]
            q = q.filter(ContentItem.id.in_([content_item.id for content_item in tag.content_items]))
            t.append(tag.title)

        if feed["rss_allow"]:
            rss_url = config.url + "/" + feed["url"] + "/rss/" if feed["url"] != "" else config.url + "/rss/"
            rss_title = config.build_title(feed["title"])

            if format == "rss":
                items = q.order_by(ContentItem.created_at.desc())[:feed["rss_items"]]
                rss = PyRSS2Gen.RSS2(
                    title           =   rss_title,
                    link            =   rss_url,
                    description     =   "",
                    lastBuildDate   =   datetime.now(),

                    items           =   [
                                            PyRSS2Gen.RSSItem(
                                                title       = item_dict["title"],
                                                link        = item_dict["url"],
                                                description = item_dict["description"],
                                                guid        = PyRSS2Gen.Guid(item_dict["url"]),
                                                pubDate     = item.created_at
                                            )
                                            for item_dict in [self._item_dict(item) for item in items]
                                        ]
                )
                rss_string = StringIO.StringIO()
                rss.write_xml(rss_string, "utf-8")
                return Response(rss_string.getvalue(), mimetype="application/rss+xml")
        else:
            rss_url = None
            rss_title = None

        if format == "json":
            count = int(request.args.get("count", "100"))
            if "before" in request.args:
                q = q.filter(ContentItem.created_at < dateutil.parser.parse(request.args["before"])).order_by(ContentItem.created_at.desc())
            elif "after" in request.args:
                q = q.filter(ContentItem.created_at > dateutil.parser.parse(request.args["after"])).order_by(ContentItem.created_at)
            else:
                q = q.order_by(ContentItem.created_at.desc())
            items = q[:count]
        else:
            title = [feed["title"]] + t

            if "page" in kwargs:
                page = kwargs["page"]
                items = list(reversed(q.order_by(ContentItem.created_at)[(page - 1) * feed["per_page"] : page * feed["per_page"]]))
                if len(items) == 0:
                    raise NotFound()
                items_skipped = q.filter(ContentItem.created_at > items[0].created_at).count()
            else:
                page = None
                items = q.order_by(ContentItem.created_at.desc())[:feed["per_page"]]
                items_skipped = 0

            dates = [created_at for (created_at,) in q.order_by(ContentItem.created_at).values(ContentItem.created_at)]
            pages = list(reversed([
                (
                    page,
                    dates[page * feed["per_page"]],
                    dates[min((page + 1) * feed["per_page"], len(dates)) - 1]
                )
                for page in xrange(0, int(ceil(float(len(dates)) / feed["per_page"])))
            ]))

            seasons = []
            month2season = {
                1 : "winter",
                2 : "winter",
                3 : "spring",
                4 : "spring",
                5 : "spring",
                6 : "summer",
                7 : "summer",
                8 : "summer",
                9 : "autumn",
               10 : "autumn",
               11 : "autumn",
               12 : "winter"
            }
            for date in dates:
                if len(seasons) == 0 or seasons[-1][0] != month2season[date.month]:
                    seasons.append((month2season[date.month], 1))
                else:
                    seasons[-1] = (seasons[-1][0], seasons[-1][1] + 1)
            seasons = list(reversed(seasons))

        items_formatted = [self._render_item_preview(request, kwargs["feed"], "DESC", item) for item in items]
        if format == "json":
            return Response(simplejson.dumps(items_formatted), mimetype="application/json")
        else:
            return self.render_to_response(request, [
                "content/feed/%s/feed.html" % (kwargs["feed"],),
                "content/feed/feed.html",
            ], **{
                "breadcrumbs"       :   title,
                "rss_url"           :   rss_url,
                "rss_title"         :   rss_title,
                "body_class"        :   "feed " + kwargs["feed"],
                "feed"              :   kwargs["feed"],
                "feed_url"          :   f.lstrip("/"),
                "items"             :   "".join(items_formatted),
                "items_skipped"     :   items_skipped,
                "pagination"        :   {
                                            "page"      :   page,
                                            "pages"     :   pages,
                                            "seasons"   :   seasons,
                                            "url"       :   re.sub("/page/([0-9]+)/", "/", request.path),
                                            "per_page"  :   feed["per_page"],
                                        },
            })