Exemple #1
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine
    Base.metadata.create_all(engine)
    cache.configure_from_config(settings, 'dogpile.cache.')
    authn_policy = AuthTktAuthenticationPolicy(settings['auth_secret'],
                                               hashalg='sha512',
                                               callback=userfinder)
    authz_policy = ACLAuthorizationPolicy()
    config = Configurator(settings=settings,
                          root_factory='miniblog.models.RootFactory',
                          session_factory=get_session,
                          )
    config.set_authentication_policy(authn_policy)
    config.set_authorization_policy(authz_policy)
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('home', '/')
    config.add_route('home_paged', '/page/{page}')
    config.add_route('add_entry', '/add')
    config.add_route('manage_categories', '/edit_categories')
    config.add_route('delete_category', '/categories/delete/{name_}')
    config.add_route('view_entry', '/entry/{id_}')
    config.add_route('delete_entry', '/entry/{id_}/delete')
    config.add_route('edit_entry', '/entry/{id_}/edit')
    config.add_route('view_category', '/category/{id_}')
    config.add_route('view_categories', '/categories')
    config.add_route('about', '/about')
    config.add_route('search', '/search')
    config.add_route('login', '/login')
    config.add_route('logout', '/logout')
    config.scan()
    return config.make_wsgi_app()
Exemple #2
0
 def delete_entry(self):
     entry_id = self.request.matchdict["id_"]
     entry = DBSession.query(Entry).filter(Entry.id == entry_id).one()
     DBSession.delete(entry)
     get_categories.invalidate()
     get_recent_posts.invalidate()
     return HTTPFound(location=self.request.route_url('home'))
Exemple #3
0
 def manage_categories(self):
     form = CategoryForm(self.request.POST)
     if self.request.method == 'POST':
         category = Category(form.data['name'])
         DBSession.add(category)
         get_categories.invalidate()
         return HTTPFound(location=self.request.route_url('manage_categories'))
     categories = DBSession.query(Category).all()
     return {'form': form, 'categories': categories}
Exemple #4
0
def main(argv=sys.argv):
    if len(argv) != 2:
        usage(argv)
    config_uri = argv[1]
    setup_logging(config_uri)
    settings = get_appsettings(config_uri)
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.create_all(engine)
Exemple #5
0
 def delete_category(self):
     category = DBSession.query(Category)\
         .options(subqueryload(Category.entries))\
         .filter(Category.name == self.request.matchdict["name_"])\
         .one()
     if category.entries:
         self.request.session.flash(
             'There are still entries in category %s, cannot delete!'
             % category.name)
     else:
         DBSession.delete(category)
     return HTTPFound(location=self.request.route_url('manage_categories'))
Exemple #6
0
    def view_categories(self):
        current_page = int(self.request.GET.get('page', 1))
        last_entry = DBSession.query(Entry.entry_time).\
                    filter(Entry.category_name == Category.name).\
                    order_by(desc(Entry.entry_time)).\
                    limit(1).\
                    as_scalar()
        categories = DBSession.query(Category, last_entry)

        page_url = partial(self.request.route_url, 'view_categories')
        page = Page(categories, page=current_page, items_per_page=20,
                    item_count=categories.count(),
                    url=page_url)
        return {'categories': page}
Exemple #7
0
 def categories(self):
     """A list of :class:`miniblog.models.Category` that have entries
     attached."""
     categories = DBSession.query(Category)\
         .filter(exists().where(Category.name == Entry.category_name))\
         .all()
     return categories
Exemple #8
0
 def view_entry(self):
     id_ = self.request.matchdict['id_']
     try:
         entry = DBSession.query(Entry).filter(Entry.id == id_).one()
     except NoResultFound:
         raise HTTPNotFound("Blog post not found. This blogpost was "
                            "possibly deleted.")
     return {'entry': entry}
Exemple #9
0
 def home(self):
     current_page = int(self.request.matchdict.get('page', 1))
     all_entries = DBSession.query(Entry)\
         .order_by(desc(Entry.entry_time))
     page_url = partial(self.request.route_url, 'home_paged')
     page = Page(all_entries, page=current_page, items_per_page=5,
          item_count=all_entries.count(),
          url=page_url)
     return {'entries': page}
Exemple #10
0
 def setUp(self):
     self.config = testing.setUp()
     from sqlalchemy import create_engine
     engine = create_engine('sqlite://')
     from miniblog.models import Category, Base, DBSession, cache
     from tempfile import mktemp
     try:
         cache.configure_from_config({'cache.backend': 'dogpile.cache.dbm',
                      'cache.arguments.filename': mktemp()},
                     'cache.')
     except Exception:
         pass
     DBSession.configure(bind=engine)
     Base.metadata.create_all(engine)
     with transaction.manager:
         for i in range(3):
             category = Category('Category {0}'.format(i))
             DBSession.add(category)
Exemple #11
0
    def test_Category_entries(self):
        from miniblog.models import Category, Entry
        cat = Category('Test')
        entry1 = Entry('Test 1', '...')
        entry2 = Entry('Test 2', '...')

        cat.entries.append(entry1)
        cat.entries.append(entry2)
        DBSession.add(cat)
        DBSession.flush()

        inserted_entry = DBSession.\
            query(Entry).\
            filter(Entry.title == 'Test 1').\
            one()

        self.assertEqual(inserted_entry, entry1)
        self.assertEqual(inserted_entry.category, cat)
Exemple #12
0
 def view_category(self):
     current_page = int(self.request.matchdict.get('page', 1))
     id_ = self.request.matchdict['id_']
     page_url = partial(self.request.route_url, 'view_category')
     entries = DBSession.query(Entry).\
         filter(Entry.category_name == id_).\
         order_by(desc(Entry.entry_time))
     page = Page(entries, page=current_page, items_per_page=5,
          item_count=entries.count(),
          url=page_url)
     return {'entries': page}
Exemple #13
0
    def test_Entry_init(self):
        from miniblog.models import Entry, Category
        from datetime import datetime

        # Ensure that title and text are enforced
        self.assertRaises(TypeError, Entry)
        self.assertRaises(TypeError, Entry, '')
        self.assertRaises(TypeError, Entry, title='')
        self.assertRaises(TypeError, Entry, text='')

        self.assertIsInstance(Entry('', ''), Entry)

        # Now check that category assignment works
        cat = Category('Test')
        DBSession.add(cat)
        entry = Entry('Test Title', 'Text', 'Test')
        DBSession.add(entry)
        DBSession.flush()
        self.assertEqual(entry.category, cat)

        # Test that entry time is set (test on equality would of course fail)
        self.assertLess((datetime.now() - entry.entry_time).seconds, 1)


        # Check title and text are correctly set on arguments
        entry = Entry('Title', 'Text')
        self.assertEqual(entry.title, 'Title')
        self.assertEqual(entry._text, 'Text')

        entry = Entry(title='Title', text='Text')
        self.assertEqual(entry.title, 'Title')
        self.assertEqual(entry._text, 'Text')
Exemple #14
0
    def test_get_recent_posts(self):
        from miniblog.models import get_recent_posts, Entry
        from time import sleep
        # test with not enough entries
        DBSession.add(Entry('Title 1', 'Text 1'))
        self.assertEqual(len(get_recent_posts()), 1)

        # make sure caching is still in place
        # sleep(1)  # activate this when order test fails
        DBSession.add(Entry('Title 2', 'Text 2'))
        self.assertEqual(len(get_recent_posts()), 1)

        # Invalidate and recount
        get_recent_posts.invalidate()
        self.assertEqual(len(get_recent_posts()), 2)

        # Check order is correct
        recent = get_recent_posts()
        first = recent[0].entry_time
        second = recent[1].entry_time
        self.assertGreater(first, second)

        # Check count param:
        self.assertEqual(len(get_recent_posts(1)), 1)

        for i in range(3, 9):
            DBSession.add(Entry('Title {0}'.format(i),
                                'Text {0}'.format(i)))
        get_recent_posts.invalidate()
        self.assertEqual(len(get_recent_posts()), 7)
Exemple #15
0
    def add_entry(self):
        entry_id = self.request.matchdict.get("id_", 0)
        if entry_id:
            entry = DBSession.query(Entry).filter(Entry.id == entry_id).one()
            form_data = MultiDict({'title': entry.title, 'text': entry._text,
                                   'category': entry.category_name})
            form_data.update(self.request.session.get("edit_entry_%i_form" % entry.id, {}))
        else:
            entry = None
            form_data = MultiDict(self.request.session.get("add_entry_form", {}))
        form_data.update(self.request.POST)
        form = EntryForm(form_data)
        form.category.choices = [('', ' - None - ')] + [(name[0], name[0]) for name in get_categories()]
        preview = None
        if self.request.method == 'POST':
            if not form.validate():
                for field, errors in form.errors.items():
                    for error in errors:
                        self.request.session.flash('Field "%s" has the following error: "%s"' % (field, error))
                if entry:
                    self.request.session["edit_entry_%i_form" % entry.id] = form.data
                else:
                    self.request.session["add_entry_form"] = form.data
                return HTTPFound(location=self.request.route_url('add_entry'))

            if form.submit.data:
                if "category" in form.data and form.data["category"]:
                    category = DBSession.query(Category)\
                        .filter(Category.name == form.data["category"]).one()
                else:
                    category = None
                if not entry:
                    entry = Entry(form.data["title"], form.data["text"])
                    entry.category = category
                    if "add_entry_form" in self.request.session:
                        del self.request.session["add_entry_form"]
                    DBSession.add(entry)
                else:
                    if "edit_entry_%i_form" \
                            % entry.id in self.request.session:
                        del self.request.session["edit_entry_%i_form"
                                                 % entry.id]
                    entry._text = form.data["text"]
                    entry.title = form.data["title"]
                    entry.category = category
                DBSession.flush()
                get_categories.invalidate()
                get_recent_posts.invalidate()
                return HTTPFound(location=self.request.route_url('view_entry', id_=entry.id))
            if form.preview.data:
                preview = entry
        return {'form': form, 'preview': preview}
Exemple #16
0
 def tearDown(self):
     DBSession.remove()
Exemple #17
0
 def search(self):
     results = DBSession.query(Entry)\
         .filter(Entry.title.like('%%%s%%' % (self.request.GET['search'])))\
         .all()
     return {'results': results}