Exemple #1
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})
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})
def postedit_type(typeid):
    ''' returns an editor page, of type typeid '''

    post_type_module = post_types.load(typeid)

    return render_template('post_type_container.html',
                           post_type=typeid,
                           form_content=post_type_module.form(request.form))
def postedit_type(typeid):
    ''' returns an editor page, of type typeid '''

    post_type_module = post_types.load(typeid)

    return render_template('post_type_container.html',
                           post_type=typeid,
                           form_content=post_type_module.form(request.form))
def feedpage(feedid):
    ''' the back end settings for one feed. '''

    try:
        feed = Feed.get(id=feedid)
        user = user_session.get_user()
    except user_session.NotLoggedIn:
        user = User()
    except:
        flash('invalid feed id! (' + str(feedid) + ')')
        return redirect(url_for('feeds'))

    if request.method == 'POST':
        if not user_session.logged_in():
            flash("You're not logged in!")
            return redirect(url_for('feeds'))

        if not user.is_admin:
            flash('Sorry! Only Admins can change these details.')
            return redirect(request.referrer)

        action = request.form.get('action', 'none')

        if action == 'edit':
            feed.name = request.form.get('title', feed.name).strip()

            inlist = request.form.getlist

            feed.post_types = ', '.join(inlist('post_types'))

            feed.set_authors(by_id(User, inlist('authors')))
            feed.set_publishers(by_id(User, inlist('publishers')))
            feed.set_author_groups(by_id(Group, inlist('author_groups')))
            feed.set_publisher_groups(by_id(Group, inlist('publisher_groups')))

            feed.save()
            flash('Saved')
        elif action == 'delete':

            for post in feed.posts:
                post_type_module = post_types.load(post.type)
                delete_post_and_run_callback(post, post_type_module)

            feed.delete_instance(True, True) # cascade/recursive delete.
            flash('Deleted')
            return redirect(url_for('feeds'))

    return render_template('feed.html',
                           feed=feed,
                           user=user,
                           all_posttypes=post_types.types(),
                           allusers=User.select(),
                           allgroups=Group.select()
                          )
Exemple #6
0
def feedpage(feedid):
    ''' the back end settings for one feed. '''

    try:
        feed = Feed.get(id=feedid)
        user = user_session.get_user()
    except user_session.NotLoggedIn:
        user = User()
    except:
        flash('invalid feed id! (' + str(feedid) + ')')
        return redirect(url_for('feeds'))

    if request.method == 'POST':
        if not user_session.logged_in():
            flash("You're not logged in!")
            return redirect(url_for('feeds'))

        if not user.is_admin:
            flash('Sorry! Only Admins can change these details.')
            return redirect(request.referrer)

        action = request.form.get('action', 'none')

        if action == 'edit':
            feed.name = request.form.get('title', feed.name).strip()

            inlist = request.form.getlist

            feed.post_types = ', '.join(inlist('post_types'))

            feed.set_authors(by_id(User, inlist('authors')))
            feed.set_publishers(by_id(User, inlist('publishers')))
            feed.set_author_groups(by_id(Group, inlist('author_groups')))
            feed.set_publisher_groups(by_id(Group, inlist('publisher_groups')))

            feed.save()
            flash('Saved')
        elif action == 'delete':

            for post in feed.posts:
                post_type_module = post_types.load(post.type)
                delete_post_and_run_callback(post, post_type_module)

            feed.delete_instance(True, True) # cascade/recursive delete.
            flash('Deleted')
            return redirect(url_for('feeds'))

    return render_template('feed.html',
                           feed=feed,
                           user=user,
                           all_posttypes=post_types.types(),
                           allusers=User.select(),
                           allgroups=Group.select()
                          )
Exemple #7
0
def external_source_run(source_id):
    ''' use the importer specified to see if there is any new data,
        and if there is, then import it. '''

    try:
        source = ExternalSource.get(id=source_id)
    except ExternalSource.DoesNotExist:
        return 'Invalid Source', 404

    time_now = now()
    if user_session.is_admin() and request.form.get('force', 'no') == 'yes':
        flash("Update forced.")
    else:
        if source.last_checked:
            next_check = source.last_checked + timedelta(
                minutes=source.frequency)

            if next_check > time_now:
                return "Nothing to do. Last: {0}, Next: {1}, Now: {2} ".format(
                    source.last_checked, next_check, time_now)

    module = external_source_types.load(source.type)

    settings_data = json.loads(source.settings)
    new_posts = module.get_new(settings_data)

    if new_posts:
        for fresh_data in new_posts:
            post = Post(type=fresh_data.get('type', 'html'), \
                        author=source.post_as_user)
            post_type_module = post_types.load(fresh_data.get('type', 'html'))

            post.feed = source.feed

            fresh_data['active_start'] = source.current_lifetime_start()
            fresh_data['active_end'] = source.current_lifetime_end()

            post_form_intake(post, fresh_data, post_type_module)
            post.display_time = source.display_time

            if source.publish:
                post.publisher = source.post_as_user
                post.publish_date = now()
                post.published = True
            post.save()
    # else, no new posts! oh well!

    source.settings = json.dumps(settings_data)
    source.last_checked = now()
    source.save()

    return 'Done!'
def external_source_run(source_id):
    ''' use the importer specified to see if there is any new data,
        and if there is, then import it. '''

    try:
        source = ExternalSource.get(id=source_id)
    except ExternalSource.DoesNotExist:
        return 'Invalid Source', 404

    time_now = now()
    if user_session.is_admin() and request.form.get('force', 'no') == 'yes':
        flash("Update forced.")
    else:
        if source.last_checked:
            next_check = source.last_checked + timedelta(minutes=source.frequency)

            if next_check > time_now:
                return "Nothing to do. Last: {0}, Next: {1}, Now: {2} ".format(
                    source.last_checked, next_check, time_now)

    module = external_source_types.load(source.type)

    settings_data = json.loads(source.settings)
    new_posts = module.get_new(settings_data)

    if new_posts:
        for fresh_data in new_posts:
            post = Post(type=fresh_data.get('type', 'html'), \
                        author=source.post_as_user)
            post_type_module = post_types.load(fresh_data.get('type', 'html'))

            post.feed = source.feed

            fresh_data['active_start'] = source.current_lifetime_start()
            fresh_data['active_end'] = source.current_lifetime_end()

            post_form_intake(post, fresh_data, post_type_module)
            post.display_time = source.display_time

            if source.publish:
                post.publisher = source.post_as_user
                post.publish_date = now()
                post.published = True
            post.save()
    # else, no new posts! oh well!

    source.settings = json.dumps(settings_data)
    source.last_checked = now()
    source.save()

    return 'Done!'
Exemple #9
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
def postpage(postid):
    ''' Edit a post. '''

    if not user_session.logged_in():
        flash("You're not logged in!")
        return redirect(url_for('posts'))

    try:
        post = Post.get(Post.id == postid)
        post_type_module = post_types.load(post.type)
        user = user_session.get_user()

    except Post.DoesNotExist:
        flash('Sorry! Post id:{0} not found!'.format(postid))
        return redirect(url_for('posts'))

    if request.method == 'POST':
        try:
            # check for write permission, and if the post is
            # already published, publish permission.

            if_i_cant_write_then_i_quit(post, user)

            # if the user is allowed to set the feed to what they've
            # requested, then do it.

            post.feed = try_to_set_feed(post,
                                        request.form.get('post_feed', False),
                                        user)

        except PleaseRedirect as e:
            flash(str(e.msg))
            redirect(e.url)

        # if it's a publish or delete request, handle that instead:
        action = request.form.get('action', 'edit')

        if action == 'delete':
            # don't need extra guards, as if_i_cant... deals with it above
            delete_post_and_run_callback(post, post_type_module)
            flash('Deleted')
        elif action == 'publish':
            try:
                post.publish(user)
                flash("Published")
            except PermissionDenied:
                flash("Sorry, you don't have permission to publish"
                      " posts in this feed.")
        elif action == 'unpublish':
            try:
                post.publish(user, False)
                flash("Published!")
            except PermissionDenied:
                flash('Sorry, you do NOT have permission' \
                       ' to unpublish on this feed.')
        elif action == 'move':
            if not user_session.is_admin():
                flash('Sorry! You are not an admin!')
                return jsonify({'error': 'permission denied'})
            post.feed = Feed.get(Feed.id == getint('feed', post.feed))
            post.save()
            return jsonify({'message': 'Moved to ' + post.feed.name})

        if action not in ('edit', 'update'):
            return redirect(request.referrer if request.referrer else '/')

        # finally get around to editing the content of the post...
        try:
            post_form_intake(post, request.form, post_type_module)
            post.save()
            flash('Updated.')
        except Exception as e:
            flash('invalid content for this data type!')
            flash(str(e))

    # Should we bother displaying 'Post' button, and editable controls
    # if the user can't write to this post anyway?

    #can_write, can_publish = can_user_write_and_publish(user, post)

    return render_template('post_editor.html',
                           post=post,
                           current_feed=post.feed.id,
                           feedlist=user.writeable_feeds(),
                           user=user,
                           form_content=post_type_module.form(json.loads(post.content)))
def post_new(feed_id):
    ''' create a new post! '''

    if not user_session.logged_in():
        flash("You're not logged in!")
        return redirect(url_for('index'))

    user = user_session.get_user()

    try:
        feed = Feed.get(id=feed_id)
    except Feed.DoesNotExist:
        flash('Sorry, Feed does not exist!')
        return redirect(url_for('feeds'))

    if not feed.user_can_write(user):
        flash("Sorry! You don't have permission to write here!")
        return redirect(request.referrer if request.referrer else '/')

    if request.method == 'GET':
        # send a blank form for the user:

        post = Post()
        post.feed = feed

        # give list of available post types:

        all_posttypes = dict([(x['id'], x) for x in post_types.types()])

        if post.feed.post_types:

            allowed_post_types = []

            for post_type in post.feed.post_types_as_list():
                if post_type in all_posttypes:
                    allowed_post_types.append(all_posttypes[post_type])
        else:
            allowed_post_types = all_posttypes.values()

        # return the page:

        return render_template('postnew.html',
                               current_feed=feed,
                               post=post,
                               user=user,
                               post_types=allowed_post_types)

    else: # POST. new post!
        post_type = request.form.get('post_type')
        try:
            post_type_module = post_types.load(post_type)
        except:
            flash('Sorry! invalid post type.')
            return redirect(request.referrer if request.referrer else '/')

        if feed.post_types and post_type not in feed.post_types_as_list():
            flash('sorry! this post type is not allowed in this feed!')
            return redirect(request.referrer if request.referrer else '/')

        post = Post(type=post_type, author=user)

        try:
            post.feed = feed

            if_i_cant_write_then_i_quit(post, user)

            post_form_intake(post, request.form, post_type_module)

        except PleaseRedirect as e:
            flash(str(e.msg))
            return redirect(e.url if e.url else request.url)

        post.save()
        flash('Saved!')

        return redirect(url_for('feedpage', feedid=post.feed.id))
Exemple #12
0
def postpage(postid):
    ''' Edit a post. '''

    if not user_session.logged_in():
        flash("You're not logged in!")
        return redirect(url_for('posts'))

    try:
        post = Post.get(Post.id == postid)
        post_type_module = post_types.load(post.type)
        user = user_session.get_user()

    except Post.DoesNotExist:
        flash('Sorry! Post id:{0} not found!'.format(postid))
        return redirect(url_for('posts'))

    if request.method == 'POST':
        try:
            # check for write permission, and if the post is
            # already published, publish permission.

            if_i_cant_write_then_i_quit(post, user)

            # if the user is allowed to set the feed to what they've
            # requested, then do it.

            post.feed = try_to_set_feed(post,
                                        request.form.get('post_feed', False),
                                        user)

        except PleaseRedirect as e:
            flash(str(e.msg))
            redirect(e.url)

        # if it's a publish or delete request, handle that instead:
        action = request.form.get('action', 'edit')

        if action == 'delete':
            # don't need extra guards, as if_i_cant... deals with it above
            delete_post_and_run_callback(post, post_type_module)
            flash('Deleted')
        elif action == 'publish':
            try:
                post.publish(user)
                flash("Published")
            except PermissionDenied:
                flash("Sorry, you don't have permission to publish"
                      " posts in this feed.")
        elif action == 'unpublish':
            try:
                post.publish(user, False)
                flash("Published!")
            except PermissionDenied:
                flash('Sorry, you do NOT have permission' \
                       ' to unpublish on this feed.')
        elif action == 'move':
            if not user_session.is_admin():
                flash('Sorry! You are not an admin!')
                return jsonify({'error': 'permission denied'})
            post.feed = Feed.get(Feed.id == getint('feed', post.feed))
            post.save()
            return jsonify({'message': 'Moved to ' + post.feed.name})

        if action not in ('edit', 'update'):
            return redirect(request.referrer if request.referrer else '/')

        # finally get around to editing the content of the post...
        try:
            post_form_intake(post, request.form, post_type_module)
            post.save()
            flash('Updated.')
        except Exception as e:
            flash('invalid content for this data type!')
            flash(str(e))

    # Should we bother displaying 'Post' button, and editable controls
    # if the user can't write to this post anyway?

    #can_write, can_publish = can_user_write_and_publish(user, post)

    return render_template('post_editor.html',
                           post=post,
                           current_feed=post.feed.id,
                           feedlist=user.writeable_feeds(),
                           user=user,
                           form_content=post_type_module.form(
                               json.loads(post.content)))
Exemple #13
0
def post_new(feed_id):
    ''' create a new post! '''

    #if not user_session.logged_in():
    #    flash("You're not logged in!")
    #    return redirect(url_for('index'))

    user = user_session.get_user()

    try:
        feed = Feed.get(id=feed_id)
    except Feed.DoesNotExist:
        flash('Sorry, Feed does not exist!')
        return redirect(url_for('feeds'))

    if not feed.user_can_write(user):
        flash("Sorry! You don't have permission to write here!")
        return redirect(request.referrer if request.referrer else '/')

    if request.method == 'GET':
        # send a blank form for the user:

        post = Post()
        post.feed = feed

        # give list of available post types:

        all_posttypes = dict([(x['id'], x) for x in post_types.types()])

        if post.feed.post_types:

            allowed_post_types = []

            for post_type in post.feed.post_types_as_list():
                if post_type in all_posttypes:
                    allowed_post_types.append(all_posttypes[post_type])
        else:
            allowed_post_types = list(all_posttypes.values())

        # return the page:

        return render_template('postnew.html',
                               current_feed=feed,
                               post=post,
                               user=user,
                               post_types=allowed_post_types)

    else:  # POST. new post!
        post_type = request.form.get('post_type')
        try:
            post_type_module = post_types.load(post_type)
        except:
            flash('Sorry! invalid post type.')
            return redirect(request.referrer if request.referrer else '/')

        if feed.post_types and post_type not in feed.post_types_as_list():
            flash('sorry! this post type is not allowed in this feed!')
            return redirect(request.referrer if request.referrer else '/')

        post = Post(type=post_type, author=user)

        try:
            post.feed = feed

            if_i_cant_write_then_i_quit(post, user)

            post_form_intake(post, request.form, post_type_module)

        except PleaseRedirect as e:
            flash(str(e.msg))
            return redirect(e.url if e.url else request.url)

        post.save()
        post.publish(user)  # publish all posts by default
        flash('Saved!')

        return redirect(url_for('feedpage', feedid=post.feed.id))