Пример #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})
Пример #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)
Пример #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})
Пример #4
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)
Пример #5
0
    def post_new_post_now(self):
        ''' check that things are cool now, whatever now is '''

        self.login(USERNAME, USERPASS)

        with self.ctx():
            resp = self.client.get(url_for('feedpage', feedid=self.feed.id))

            self.assertEqual(resp.status_code, 200)
            self.assertIn(self.feed.name, resp.data)

            resp = self.client.post(url_for('post_new', feed_id=self.feed.id),
                                    data={"post_type":"html",
                                          "content": "{'content':'test'}",
                                          "active_start": models.now(),
                                          "active_end": models.now() + \
                                                        timedelta(minutes=1),
                                         },
                                    follow_redirects=True)

        post = Post.get()
        post.publish(self.user)
        post.save()

        return post
Пример #6
0
    def post_new_post_now(self):
        ''' check that things are cool now, whatever now is '''

        self.login(USERNAME, USERPASS)

        with self.ctx():
            resp = self.client.get(url_for('feedpage', feedid=self.feed.id))

            self.assertEqual(resp.status_code, 200)
            self.assertIn(self.feed.name, resp.data)

            resp = self.client.post(url_for('post_new', feed_id=self.feed.id),
                                    data={"post_type":"html",
                                          "content": "{'content':'test'}",
                                          "active_start": models.now(),
                                          "active_end": models.now() + \
                                                        timedelta(minutes=1),
                                         },
                                    follow_redirects=True)

        post = Post.get()
        post.publish(self.user)
        post.save()

        return post
Пример #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!'
Пример #8
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
Пример #9
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
Пример #10
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!'
Пример #11
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)
Пример #12
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)
Пример #13
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)
Пример #14
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)
Пример #15
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
Пример #16
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)
Пример #17
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)
Пример #18
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))
Пример #19
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)))
Пример #20
0
def json_post(postid):
    try:
        return jsonify(Post.get(Post.id == postid).dict_repr())
    except:
        return jsonify({"error": "Invalid Post ID"})
Пример #21
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 = 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))
Пример #22
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)))
Пример #23
0
def json_post(postid):
    try:
        return jsonify(Post.get(Post.id == postid).dict_repr())
    except:
        return jsonify({"error": "Invalid Post ID"})