Merge branch 'master' into configobj

Conflicts:
	setup.py
This commit is contained in:
Christopher Allan Webber 2011-06-18 11:10:46 -05:00
commit c897283849
8 changed files with 120 additions and 7 deletions

1
.gitignore vendored
View File

@ -12,3 +12,4 @@ docs/_build/
user_dev/ user_dev/
server-log.txt server-log.txt
*~ *~
*.swp

View File

@ -136,7 +136,7 @@ Slartibartfast does the following:
4. Slartibartfast pushes his changes to his clone (the remote is named 4. Slartibartfast pushes his changes to his clone (the remote is named
``origin``):: ``origin``)::
git push origin issue_42 git push origin issue_42 --set-upstream
5. Slartibartfast adds a comment to issue 42 with the url for his 5. Slartibartfast adds a comment to issue 42 with the url for his
repository and the name of the branch he put the code in. He also repository and the name of the branch he put the code in. He also

View File

@ -35,6 +35,8 @@
<div class="mediagoblin_header_right"> <div class="mediagoblin_header_right">
{% if request.user %} {% if request.user %}
{{ request.user['username'] }}'s account {{ request.user['username'] }}'s account
<a href="{{ request.urlgen('mediagoblin.user_pages.user_gallery',
user= request.user['username']) }}">gallery</a>
(<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">logout</a>) (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">logout</a>)
{% else %} {% else %}
<a href="{{ request.urlgen('mediagoblin.auth.login') }}"> <a href="{{ request.urlgen('mediagoblin.auth.login') }}">

View File

@ -0,0 +1,42 @@
{#
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011 Free Software Foundation, Inc
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#}
{% extends "mediagoblin/base.html" %}
{% block mediagoblin_head %}
<link rel="alternate" type="application/atom+xml"
href="{{ request.urlgen(
'mediagoblin.user_pages.atom_feed',
user=user.username) }}">
{% endblock mediagoblin_head %}
{% block mediagoblin_content -%}
{% if user %}
<h1>gallery for <a href="{{ request.urlgen(
'mediagoblin.user_pages.user_home',
user=user.username) }}">{{ user.username }}</a></h1>
{% include "mediagoblin/utils/object_gallery.html" %}
<a href={{ request.urlgen(
'mediagoblin.user_pages.atom_feed',
user=user.username) }}> atom feed</a>
{% else %}
{# This *should* not occur as the view makes sure we pass in a user. #}
<p>Sorry, no such user found.<p/>
{% endif %}
{% endblock %}

View File

@ -209,8 +209,6 @@ def test_register_views(test_app):
assert new_user['status'] == u'active' assert new_user['status'] == u'active'
assert new_user['email_verified'] == True assert new_user['email_verified'] == True
## TODO: Try logging in
# Uniqueness checks # Uniqueness checks
# ----------------- # -----------------
## We shouldn't be able to register with that user twice ## We shouldn't be able to register with that user twice
@ -229,3 +227,43 @@ def test_register_views(test_app):
u'Sorry, a user with that name already exists.'] u'Sorry, a user with that name already exists.']
## TODO: Also check for double instances of an email address? ## TODO: Also check for double instances of an email address?
@setup_fresh_app
def test_authentication_views(test_app):
"""
Test logging in and logging out
"""
# Make a new user
test_user = mg_globals.database.User()
test_user['username'] = u'chris'
test_user['email'] = u'chris@example.com'
test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast')
test_user.save()
# Get login
test_app.get('/auth/login/')
# Make sure it rendered with the appropriate template
assert util.TEMPLATE_TEST_CONTEXT.has_key(
'mediagoblin/auth/login.html')
# Log in as that user
util.clear_test_template_context()
response = test_app.post(
'/auth/login/', {
'username': u'chris',
'password': 'toast'})
response.follow()
assert_equal(
urlparse.urlsplit(response.location)[2],
'/')
assert util.TEMPLATE_TEST_CONTEXT.has_key(
'mediagoblin/root.html')
# Make sure we're in the session or something
session = util.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html']['request'].session
assert session['user_id'] == unicode(test_user['_id'])
# Log out as that user
# Make sure we're not in the session

View File

@ -19,6 +19,8 @@ from routes.route import Route
user_routes = [ user_routes = [
Route('mediagoblin.user_pages.user_home', "/{user}/", Route('mediagoblin.user_pages.user_home', "/{user}/",
controller="mediagoblin.user_pages.views:user_home"), controller="mediagoblin.user_pages.views:user_home"),
Route('mediagoblin.user_pages.user_gallery', "/{user}/gallery/",
controller="mediagoblin.user_pages.views:user_gallery"),
Route('mediagoblin.user_pages.media_home', '/{user}/m/{media}/', Route('mediagoblin.user_pages.media_home', '/{user}/m/{media}/',
requirements=dict(m_id="[0-9a-fA-F]{24}"), requirements=dict(m_id="[0-9a-fA-F]{24}"),
controller="mediagoblin.user_pages.views:media_home"), controller="mediagoblin.user_pages.views:media_home"),

View File

@ -49,6 +49,33 @@ def user_home(request, page):
'media_entries': media_entries, 'media_entries': media_entries,
'pagination': pagination}) 'pagination': pagination})
@uses_pagination
def user_gallery(request, page):
"""'Gallery' of a User()"""
user = request.db.User.find_one({
'username': request.matchdict['user'],
'status': 'active'})
if not user:
return exc.HTTPNotFound()
cursor = request.db.MediaEntry.find(
{'uploader': user['_id'],
'state': 'processed'}).sort('created', DESCENDING)
pagination = Pagination(page, cursor)
media_entries = pagination()
#if no data is available, return NotFound
if media_entries == None:
return exc.HTTPNotFound()
return render_to_response(
request,
'mediagoblin/user_pages/gallery.html',
{'user': user,
'media_entries': media_entries,
'pagination': pagination})
@get_user_media_entry @get_user_media_entry
def media_home(request, media): def media_home(request, media):

View File

@ -43,6 +43,7 @@ setup(
'argparse', 'argparse',
'webtest', 'webtest',
'ConfigObj', 'ConfigObj',
'lxml',
], ],
test_suite='nose.collector', test_suite='nose.collector',