Merge branch 'master' into configobj
Conflicts: setup.py
This commit is contained in:
commit
c897283849
3
.gitignore
vendored
3
.gitignore
vendored
@ -11,4 +11,5 @@ mediagoblin.egg-info
|
|||||||
docs/_build/
|
docs/_build/
|
||||||
user_dev/
|
user_dev/
|
||||||
server-log.txt
|
server-log.txt
|
||||||
*~
|
*~
|
||||||
|
*.swp
|
||||||
|
@ -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
|
||||||
|
@ -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') }}">
|
||||||
|
42
mediagoblin/templates/mediagoblin/user_pages/gallery.html
Normal file
42
mediagoblin/templates/mediagoblin/user_pages/gallery.html
Normal 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 %}
|
@ -77,7 +77,7 @@ def test_register_views(test_app):
|
|||||||
# Make sure it rendered with the appropriate template
|
# Make sure it rendered with the appropriate template
|
||||||
assert util.TEMPLATE_TEST_CONTEXT.has_key(
|
assert util.TEMPLATE_TEST_CONTEXT.has_key(
|
||||||
'mediagoblin/auth/register.html')
|
'mediagoblin/auth/register.html')
|
||||||
|
|
||||||
# Try to register without providing anything, should error
|
# Try to register without providing anything, should error
|
||||||
# --------------------------------------------------------
|
# --------------------------------------------------------
|
||||||
|
|
||||||
@ -182,7 +182,7 @@ def test_register_views(test_app):
|
|||||||
unicode(new_user['_id'])]
|
unicode(new_user['_id'])]
|
||||||
assert parsed_get_params['token'] == [
|
assert parsed_get_params['token'] == [
|
||||||
new_user['verification_key']]
|
new_user['verification_key']]
|
||||||
|
|
||||||
## Try verifying with bs verification key, shouldn't work
|
## Try verifying with bs verification key, shouldn't work
|
||||||
util.clear_test_template_context()
|
util.clear_test_template_context()
|
||||||
test_app.get(
|
test_app.get(
|
||||||
@ -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
|
||||||
@ -221,7 +219,7 @@ def test_register_views(test_app):
|
|||||||
'password': 'iamsohappy2',
|
'password': 'iamsohappy2',
|
||||||
'confirm_password': 'iamsohappy2',
|
'confirm_password': 'iamsohappy2',
|
||||||
'email': 'happygrrl2@example.org'})
|
'email': 'happygrrl2@example.org'})
|
||||||
|
|
||||||
context = util.TEMPLATE_TEST_CONTEXT[
|
context = util.TEMPLATE_TEST_CONTEXT[
|
||||||
'mediagoblin/auth/register.html']
|
'mediagoblin/auth/register.html']
|
||||||
form = context['register_form']
|
form = context['register_form']
|
||||||
@ -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
|
||||||
|
|
||||||
|
@ -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"),
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user