Esempio n. 1
0
def posts():
    ''' (HTML) list of ALL posts. (also deletes broken posts, if error) '''

    try:
        user = user_session.get_user()
    except user_session.NotLoggedIn:
        user = User()

    try:
        if user.is_admin:
            return render_template('posts.html',
                                   posts=Post.select(),
                                   user=user)
        else:
            return render_template('posts.html',
                                   posts=Post.select() \
                                             .where(Post.status == 0), user=user)
    except Feed.DoesNotExist:
        # Ah. Database inconsistancy! Not good, lah.
        ps = Post.raw('select post.id from post'
                      ' left join feed on feed.id = post.feed_id'
                      ' where feed.id is null;')
        for p in ps:
            p.delete_instance()
        flash('Cleaned up old posts...')

    if user.is_admin:
        return render_template('posts.html', posts=Post.select(), user=user)
    else:
        return render_template('posts.html',
                               posts=Post.select()\
                                         .where(Post.status == 0), user=user)
Esempio n. 2
0
def posts():
    ''' (HTML) list of ALL posts. (also deletes broken posts, if error) '''

    try:
        user = user_session.get_user()
    except user_session.NotLoggedIn:
        user = User()

    try:
        if user.is_admin:
            return render_template('posts.html', posts=Post.select(), user=user)
        else:
            return render_template('posts.html',
                                   posts=Post.select() \
                                             .where(Post.status == 0), user=user)
    except Feed.DoesNotExist:
        # Ah. Database inconsistancy! Not good, lah.
        ps = Post.raw('select post.id from post'
                      ' left join feed on feed.id = post.feed_id'
                      ' where feed.id is null;')
        for p in ps:
            p.delete_instance()
        flash('Cleaned up old posts...')

    if user.is_admin:
        return render_template('posts.html', posts=Post.select(), user=user)
    else:
        return render_template('posts.html',
                               posts=Post.select()\
                                         .where(Post.status == 0), user=user)
Esempio n. 3
0
def posts_housekeeping():
    ''' goes through all posts, move 'old' posts to archive status,
        delete reeeeealy old posts. '''

    time_now = now()
    archive_time = time_now - \
                   timedelta(days=config_var('posts.archive_after_days', 7))
    delete_time = time_now - \
                  timedelta(days=config_var('posts.delete_after_days', 30))

    # first delete really old posts:

    delete_count = 0
    archive_count = 0

    if config_var('posts.delete_when_old', True):
        for post in Post.select().where(Post.active_end < delete_time):
            delete_post_and_run_callback(post, post_types.load(post.type))
            delete_count += 1

    # next set old-ish posts to archived:

    if config_var('posts.archive_when_old', True):
        archive_count = Post.update(status=2) \
                            .where((Post.active_end < archive_time) &
                                   (Post.status != 2)) \
                            .execute()

    # And done.

    return jsonify({"deleted": delete_count,
                    "archived": archive_count,
                    "delete_before": delete_time,
                    "archive_before": archive_time,
                    "now": time_now})
Esempio n. 4
0
def posts_housekeeping():
    ''' goes through all posts, move 'old' posts to archive status,
        delete reeeeealy old posts. '''

    time_now = now()
    archive_time = time_now - \
                   timedelta(days=config_var('posts.archive_after_days', 7))
    delete_time = time_now - \
                  timedelta(days=config_var('posts.delete_after_days', 30))

    # first delete really old posts:

    delete_count = 0
    archive_count = 0

    if config_var('posts.delete_when_old', True):
        for post in Post.select().where(Post.active_end < delete_time):
            delete_post_and_run_callback(post, post_types.load(post.type))
            delete_count += 1

    # next set old-ish posts to archived:

    if config_var('posts.archive_when_old', True):
        archive_count = Post.update(status=2) \
                            .where((Post.active_end < archive_time) &
                                   (Post.status != 2)) \
                            .execute()

    # And done.

    return jsonify({"deleted": delete_count,
                    "archived": archive_count,
                    "delete_before": delete_time,
                    "archive_before": archive_time,
                    "now": time_now})
Esempio n. 5
0
def feedsrss(ids_raw):
    ''' get a bunch of feeds posts as an RSS stream '''

    ids = []
    feed_names = []

    for i in ids_raw.split(','):
        try:
            feedid = int(i)
            if feedid in ids:
                continue

            feed = Feed.get(id=feedid)
            ids.append(feedid)
            feed_names.append(feed.name)
        except ValueError:
            continue
        except Feed.DoesNotExist:
            continue

    time_now = now()
    feed_posts = [p for p in \
                  Post.select().join(Feed).where(
                      (Feed.id << ids)
                      &(Post.status == 0)
                      &(Post.active_start < time_now)
                      &(Post.active_end > time_now)
                      &(Post.published)
                      )]

    feed = RSSFeed()

    feed.feed["title"] = ",".join(feed_names)
    feed.feed["link"] = url_for('feeds')
    feed.feed["description"] = "Posts from " + (','.join(feed_names))

    for post in feed_posts:
        contents = json.loads(post.content)
        cleantext = bleach.clean(contents["content"], tags=[], strip=True)
        if len(cleantext) > 20:
            cleantext = cleantext[0:20] + "..."

        item = {
            "title": cleantext,
            "description": contents["content"],
            "guid": str(post.id),

            }
        feed.items.append(item)

    resp = make_response(feed.format_rss2_string())
    resp.headers["Content-Type"] = "application/xml"

    return resp
Esempio n. 6
0
def feedsrss(ids_raw):
    ''' get a bunch of feeds posts as an RSS stream '''

    ids = []
    feed_names = []

    for i in ids_raw.split(','):
        try:
            feedid = int(i)
            if feedid in ids:
                continue

            feed = Feed.get(id=feedid)
            ids.append(feedid)
            feed_names.append(feed.name)
        except ValueError:
            continue
        except Feed.DoesNotExist:
            continue

    time_now = now()
    feed_posts = [p for p in \
                  Post.select().join(Feed).where(
                      (Feed.id << ids)
                      &(Post.status == 0)
                      &(Post.active_start < time_now)
                      &(Post.active_end > time_now)
                      &(Post.published)
                      )]

    feed = RSSFeed()

    feed.feed["title"] = ",".join(feed_names)
    feed.feed["link"] = url_for('feeds')
    feed.feed["description"] = "Posts from " + (','.join(feed_names))

    for post in feed_posts:
        contents = json.loads(post.content)
        cleantext = bleach.clean(contents["content"], tags=[], strip=True)
        if len(cleantext) > 20:
            cleantext = cleantext[0:20] + "..."

        item = {
            "title": cleantext,
            "description": contents["content"],
            "guid": str(post.id),

            }
        feed.items.append(item)

    resp = make_response(feed.format_rss2_string())
    resp.headers["Content-Type"] = "application/xml"

    return resp
Esempio n. 7
0
def index():
    ''' main front page / dashboard / index. '''
    try:
        user = user_session.get_user()
    except user_session.NotLoggedIn as e:
        user = User()

    if not user:
        user = User()


    publishable_feeds = user.publishable_feeds()


    posts_to_publish = Post.select()\
                           .where((Post.published==False) &
                                  (Post.feed << publishable_feeds))

    screens = Screen.select()
    aliases = config_var('screens.aliases', [])

    for alias in aliases:
        for screen in screens:
            if screen.urlname == alias['screen_name']:
                alias['screen'] = screen
                break
        else:
            alias['screen'] = None

    return render_template('dashboard.html',
        aliases=aliases,
        feeds=Feed.select(),
        publishable_feeds=publishable_feeds,
        posts=Post.select().where(Post.author == user)\
                  .order_by(Post.write_date.desc())\
                  .limit(15),
        posts_to_publish=posts_to_publish,
        screens=screens,
        user=user)
Esempio n. 8
0
def index():
    ''' main front page / dashboard / index. '''
    try:
        user = user_session.get_user()
    except user_session.NotLoggedIn:
        user = User()

    if not user:
        user = User()

    publishable_feeds = user.publishable_feeds()


    posts_to_publish = Post.select()\
                           .where((Post.published == False) &
                                  (Post.feed << publishable_feeds))

    screens = Screen.select()
    aliases = config_var('screens.aliases', [])

    for alias in aliases:
        for screen in screens:
            if screen.urlname == alias['screen_name']:
                alias['screen'] = screen
                break
        else:
            alias['screen'] = None

    return render_template('dashboard.html',
                           aliases=aliases,
                           feeds=Feed.select(),
                           publishable_feeds=publishable_feeds,
                           posts=Post.select().where(Post.author == user)\
                                     .order_by(Post.write_date.desc())\
                                     .limit(15),
                           posts_to_publish=posts_to_publish,
                           screens=screens,
                           user=user)
Esempio n. 9
0
def screens_posts_from_feeds(json_feeds_list):
    '''
        send JSON list of the posts in whichever feeds you request
        (as a JS array [id,id,id] type list)
    '''
    feeds_list = json.loads(json_feeds_list)

    time_now = now()

    posts = [{"id": p.id,
              "changed": p.write_date,
              "uri": url_for('json_post', postid=p.id)} for p in \
             Post.select().join(Feed)
             .where((Feed.id << feeds_list)
                    &(Post.status == 0)
                    &(Post.active_start < time_now)
                    &(Post.active_end > time_now)
                    &(Post.published)
                   )]
    return jsonify(posts=posts)
Esempio n. 10
0
def screens_posts_from_feeds(json_feeds_list):
    '''
        send JSON list of the posts in whichever feeds you request
        (as a JS array [id,id,id] type list)
    '''
    feeds_list = json.loads(json_feeds_list)

    time_now = now()

    posts = [{"id": p.id,
              "changed": p.write_date,
              "uri": url_for('json_post', postid=p.id)} for p in \
             Post.select().join(Feed)
             .where((Feed.id << feeds_list)
                    &(Post.status == 0)
                    &(Post.active_start < time_now)
                    &(Post.active_end > time_now)
                    &(Post.published)
                   )]
    return jsonify(posts=posts)
Esempio n. 11
0
def get_new(data):
    ''' ok, actually go get us some new posts, alright? (return new posts, and
        update data with any hidden fields updated that we need to
        (current_posts, for instance))'''

    feed = feedparser.parse(data['url'])

    new_posts = []

    templater = make_templater(data)

    for post in Post.select().where((Post.type == 'news')):
        delete_post_and_run_callback(post, post_types.load(post.type))

    for entry in feed.entries:
        new_posts.append({
            'type': 'news',
            'color': None,
            'content': templater(entry)
        })

    data['current_posts'] = [e.id for e in feed.entries]

    return new_posts
Esempio n. 12
0
def user_edit(userid=-1):
    ''' edit one user.  Admins can edit any user, but other users
        can only edit themselves. if userid is -1, create a new user. '''

    try:
        current_user = user_session.get_user()
    except user_session.NotLoggedIn as e:
        flash("Sorry, you're not logged in!")
        return permission_denied("You're not logged in!")

    userid = int(userid)

    if userid != -1:
        try:
            user = User.get(id=userid)
        except User.DoesNotExist:
            return not_found(title="User doesn't exist",
                             message="Sorry, that user does not exist!")
    else:

        if not current_user.is_admin:
            flash('Sorry! Only admins can create new users!')
            return permission_denied("Admins only!")

        try:
            user = User.get(loginname=request.form.get('loginname', ''))
            return permission_denied("Username already exists!")
        except peewee.DoesNotExist:
            pass

        user = User()  #pylint: disable=no-value-for-parameter

    if request.method == 'POST':
        if current_user != user and not current_user.is_admin:
            return permission_denied("Sorry, you may not edit this user.")

        update_user(user, request.form, current_user)

        # save:

        try:
            user.save()
            if userid == -1:
                flash('New user created.')
                return redirect(url_for('user_edit', userid=user.id))
            else:
                flash('Saved')

        except peewee.IntegrityError as err:
            flash('Cannot Save:' + str(err))

    elif request.method == 'DELETE':
        if not current_user.is_admin:
            return 'Sorry, only admins can delete users', 403

        if user.id == current_user.id:
            return 'Sorry! You cannot delete yourself!', 403

        user.delete_instance(recursive=True)

        return 'User: %s deleted. (And all their posts)' % user.displayname

    users_posts = Post.select().where(Post.author == user) \
                               .order_by(Post.write_date.desc()) \
                               .limit(10)

    return render_template('user.html',
                           allgroups=Group.select(),
                           posts=users_posts,
                           user=user)
Esempio n. 13
0
def user_edit(userid=-1):
    ''' edit one user.  Admins can edit any user, but other users
        can only edit themselves. if userid is -1, create a new user. '''

    try:
        current_user = user_session.get_user()
    except user_session.NotLoggedIn as e:
        flash("Sorry, you're not logged in!")
        return permission_denied("You're not logged in!")

    userid = int(userid)

    if userid != -1:
        try:
            user = User.get(id=userid)
        except User.DoesNotExist:
            return not_found(title="User doesn't exist",
                             message="Sorry, that user does not exist!")
    else:
        if not current_user.is_admin:
            flash('Sorry! Only admins can create new users!')
            return permission_denied("Admins only!")

        try:
            user = User.get(loginname=request.form['loginname'])
            return permission_denied("Username already exists!")
        except peewee.DoesNotExist:
            pass

        user = User() #pylint: disable=no-value-for-parameter

    if request.method == 'POST':
        if current_user != user and not current_user.is_admin:
            return permission_denied("Sorry, you may not edit this user.")

        update_user(user, request.form, current_user)

        # save:

        try:
            user.save()
            if userid == -1:
                flash('New user created.')
                return redirect(url_for('user_edit', userid=user.id))
            else:
                flash('Saved')

        except peewee.IntegrityError as err:
            flash('Cannot Save:' + str(err))

    elif request.method == 'DELETE':
        if not current_user.is_admin:
            return 'Sorry, only admins can delete users', 403

        if user.id == current_user.id:
            return 'Sorry! You cannot delete yourself!', 403

        user.delete_instance(recursive=True)

        return 'User: %s deleted. (And all their posts)' % user.displayname

    users_posts = Post.select().where(Post.author == user) \
                               .order_by(Post.write_date.desc()) \
                               .limit(10)

    return render_template('user.html',
                           allgroups=Group.select(),
                           posts=users_posts, user=user)