aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/templates
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin/templates')
-rw-r--r--mediagoblin/templates/mediagoblin/api/authorize.html56
-rw-r--r--mediagoblin/templates/mediagoblin/api/oob.html33
-rw-r--r--mediagoblin/templates/mediagoblin/auth/change_fp.html44
-rw-r--r--mediagoblin/templates/mediagoblin/auth/login.html21
-rw-r--r--mediagoblin/templates/mediagoblin/auth/register.html7
-rw-r--r--mediagoblin/templates/mediagoblin/banned.html35
-rw-r--r--mediagoblin/templates/mediagoblin/base.html110
-rw-r--r--mediagoblin/templates/mediagoblin/bits/above_content.html (renamed from mediagoblin/templates/mediagoblin/bits/above-content.html)0
-rw-r--r--mediagoblin/templates/mediagoblin/bits/base_footer.html35
-rw-r--r--mediagoblin/templates/mediagoblin/bits/body_end.html (renamed from mediagoblin/templates/mediagoblin/bits/body-start.html)2
-rw-r--r--mediagoblin/templates/mediagoblin/bits/body_start.html (renamed from mediagoblin/templates/mediagoblin/bits/body-end.html)0
-rw-r--r--mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html47
-rw-r--r--mediagoblin/templates/mediagoblin/edit/change_email.html (renamed from mediagoblin/templates/mediagoblin/auth/forgot_password.html)23
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_account.html24
-rw-r--r--mediagoblin/templates/mediagoblin/edit/verification.txt (renamed from mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt)15
-rw-r--r--mediagoblin/templates/mediagoblin/extra_head.html16
-rw-r--r--mediagoblin/templates/mediagoblin/fragments/header_notifications.html44
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/blogpost.html33
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/image.html17
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/pdf.html30
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/stl.html16
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/video.html33
-rw-r--r--mediagoblin/templates/mediagoblin/moderation/media_panel.html (renamed from mediagoblin/templates/mediagoblin/admin/panel.html)5
-rw-r--r--mediagoblin/templates/mediagoblin/moderation/report.html161
-rw-r--r--mediagoblin/templates/mediagoblin/moderation/report_panel.html202
-rw-r--r--mediagoblin/templates/mediagoblin/moderation/user.html217
-rw-r--r--mediagoblin/templates/mediagoblin/moderation/user_panel.html97
-rw-r--r--mediagoblin/templates/mediagoblin/root.html19
-rw-r--r--mediagoblin/templates/mediagoblin/submit/start.html5
-rw-r--r--mediagoblin/templates/mediagoblin/terms_of_service.html303
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/blog_media.html176
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/collection.html12
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html7
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html7
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/collection_list.html14
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media.html58
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/report.html83
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user.html174
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user_nonactive.html81
-rw-r--r--mediagoblin/templates/mediagoblin/utils/collection_gallery.html4
-rw-r--r--mediagoblin/templates/mediagoblin/utils/comment-subscription.html33
-rw-r--r--mediagoblin/templates/mediagoblin/utils/exif.html39
-rw-r--r--mediagoblin/templates/mediagoblin/utils/report.html28
-rw-r--r--mediagoblin/templates/mediagoblin/utils/wtforms.html58
44 files changed, 2089 insertions, 335 deletions
diff --git a/mediagoblin/templates/mediagoblin/api/authorize.html b/mediagoblin/templates/mediagoblin/api/authorize.html
new file mode 100644
index 00000000..93cdc7e3
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/api/authorize.html
@@ -0,0 +1,56 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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 title -%}
+ {% trans %}Authorization{% endtrans %} &mdash; {{ super() }}
+{%- endblock %}
+
+{% block mediagoblin_content %}
+
+<h1>{% trans %}Authorize{% endtrans %}</h1>
+
+<p>
+ {% trans %}You are logged in as{% endtrans %}
+ <strong>{{user.username}}</strong>
+ <br /><br />
+
+ {% trans %}Do you want to authorize {% endtrans %}
+ {% if client.application_name -%}
+ <em>{{ client.application_name }}</em>
+ {%- else -%}
+ <em>{% trans %}an unknown application{% endtrans %}</em>
+ {%- endif %}
+ {% trans %} to access your account? {% endtrans %}
+ <br /><br />
+ {% trans %}Applications with access to your account can: {% endtrans %}
+ <ul>
+ <li>{% trans %}Post new media as you{% endtrans %}</li>
+ <li>{% trans %}See your information (e.g profile, media, etc...){% endtrans %}</li>
+ <li>{% trans %}Change your information{% endtrans %}</li>
+ </ul>
+ <br />
+
+ <form method="POST">
+ {{ csrf_token }}
+ {{ authorize_form.oauth_token }}
+ {{ authorize_form.oauth_verifier }}
+ <input type="submit" value="{% trans %}Authorize{% endtrans %}">
+ </form>
+</p>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/api/oob.html b/mediagoblin/templates/mediagoblin/api/oob.html
new file mode 100644
index 00000000..d290472a
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/api/oob.html
@@ -0,0 +1,33 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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 title -%}
+ {% trans %}Authorization Finished{% endtrans %} &mdash; {{ super() }}
+{%- endblock %}
+
+{% block mediagoblin_content %}
+
+<h1>{% trans %}Authorization Complete{% endtrans %}</h1>
+
+<h4>{% trans %}Copy and paste this into your client:{% endtrans %}</h4>
+
+<p class="verifier">
+ {{ oauth_request.verifier }}
+</p>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html
deleted file mode 100644
index 1f7d9aca..00000000
--- a/mediagoblin/templates/mediagoblin/auth/change_fp.html
+++ /dev/null
@@ -1,44 +0,0 @@
-{#
-# 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" %}
-
-{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
-
-{% block mediagoblin_head %}
- <script type="text/javascript"
- src="{{ request.staticdirect('/js/show_password.js') }}"></script>
-{% endblock mediagoblin_head %}
-
-{% block title -%}
- {% trans %}Set your new password{% endtrans %} &mdash; {{ super() }}
-{%- endblock %}
-
-{% block mediagoblin_content %}
- <form action="{{ request.urlgen('mediagoblin.auth.verify_forgot_password') }}"
- method="POST" enctype="multipart/form-data">
- {{ csrf_token }}
- <div class="form_box">
- <h1>{% trans %}Set your new password{% endtrans %}</h1>
- {{ wtforms_util.render_divs(cp_form) }}
- <div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Set password{% endtrans %}" class="button_form"/>
- </div>
- </div>
- </form>
-{% endblock %}
-
diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html
index 4a39059d..93cd82d9 100644
--- a/mediagoblin/templates/mediagoblin/auth/login.html
+++ b/mediagoblin/templates/mediagoblin/auth/login.html
@@ -20,8 +20,8 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% block mediagoblin_head %}
- <script type="text/javascript"
- src="{{ request.staticdirect('/js/autofilledin_password.js') }}"></script>
+ {{ super() }}
+ {% template_hook("fp_head") %}
{% endblock %}
{% block title -%}
@@ -29,7 +29,7 @@
{%- endblock %}
{% block mediagoblin_content %}
- <form action="{{ request.urlgen('mediagoblin.auth.login') }}"
+ <form action="{{ post_url }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
<div class="form_box">
@@ -39,17 +39,10 @@
{% trans %}Logging in failed!{% endtrans %}
</div>
{% endif %}
- {% if allow_registration %}
- <p>
- {% trans %}Don't have an account yet?{% endtrans %} <a href="{{ request.urlgen('mediagoblin.auth.register') }}">
- {%- trans %}Create one here!{% endtrans %}</a>
- </p>
- {% endif %}
- {{ wtforms_util.render_divs(login_form) }}
- <p>
- <a href="{{ request.urlgen('mediagoblin.auth.forgot_password') }}" id="forgot_password">
- {% trans %}Forgot your password?{% endtrans %}</a>
- </p>
+ {% template_hook("create_account") %}
+ {% template_hook("login_link") %}
+ {{ wtforms_util.render_divs(login_form, True) }}
+ {% template_hook("fp_link") %}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Log in{% endtrans %}" class="button_form"/>
</div>
diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html
index 6dff0207..a7b8033f 100644
--- a/mediagoblin/templates/mediagoblin/auth/register.html
+++ b/mediagoblin/templates/mediagoblin/auth/register.html
@@ -30,11 +30,12 @@
{% block mediagoblin_content %}
- <form action="{{ request.urlgen('mediagoblin.auth.register') }}"
+ <form action="{{ post_url }}"
method="POST" enctype="multipart/form-data">
<div class="form_box">
<h1>{% trans %}Create an account!{% endtrans %}</h1>
- {{ wtforms_util.render_divs(register_form) }}
+ {% template_hook("register_link") %}
+ {{ wtforms_util.render_divs(register_form, True) }}
{{ csrf_token }}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Create{% endtrans %}"
@@ -42,6 +43,4 @@
</div>
</div>
</form>
-<!-- Focus the username field by default -->
-<script>$(document).ready(function(){$("#username").focus();});</script>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/banned.html b/mediagoblin/templates/mediagoblin/banned.html
new file mode 100644
index 00000000..0b5a6884
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/banned.html
@@ -0,0 +1,35 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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 title %}{% trans %}You are Banned.{% endtrans %}{% endblock %}
+
+{% block mediagoblin_content %}
+ <img class="right_align" src="{{ request.staticdirect('/images/404.png') }}"
+ alt="{% trans %}Image of goblin stressing out{% endtrans %}" />
+
+ <h1>{% trans %}You have been banned{% endtrans %}
+ {% if expiration_date %}
+ {% trans until_when=expiration_date %}until {{ until_when }}{% endtrans %}
+ {% else %}
+ {% trans %}indefinitely{% endtrans %}
+ {% endif %}
+ </h2>
+ <p>{{ reason|safe }}</p>
+ <div class="clear"></div>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html
index 83bc65d4..6d49ff47 100644
--- a/mediagoblin/templates/mediagoblin/base.html
+++ b/mediagoblin/templates/mediagoblin/base.html
@@ -18,12 +18,16 @@
<!doctype html>
<html
-{% block mediagoblin_html_tag %}
-{% endblock mediagoblin_html_tag %}
->
- <head {% if is_rtl %} dir="rtl" {% endif %}>
+ {% block mediagoblin_html_tag %}
+ {% endblock mediagoblin_html_tag %}
+ {% if is_rtl -%}
+ dir="rtl"
+ {%- endif -%}
+ >
+ <head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>{% block title %}{{ app_config['html_title'] }}{% endblock %}</title>
<link rel="stylesheet" type="text/css"
href="{{ request.staticdirect('/css/extlib/reset.css') }}"/>
@@ -35,6 +39,11 @@
src="{{ request.staticdirect('/js/extlib/jquery.js') }}"></script>
<script type="text/javascript"
src="{{ request.staticdirect('/js/header_dropdown.js') }}"></script>
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/notifications.js') }}"></script>
+ <script>
+ var mark_all_comments_seen_url = "{{ request.urlgen('mediagoblin.notifications.mark_all_comment_notifications_seen') }}"
+ </script>
{# For clarification, the difference between the extra_head.html template
# and the head template hook is that the former should be used by
@@ -49,8 +58,7 @@
{% endblock mediagoblin_head %}
</head>
<body>
- <div {% if is_rtl %} dir="rtl" {% endif %}>
- {% include 'mediagoblin/bits/body-start.html' %}
+ {% include 'mediagoblin/bits/body_start.html' %}
{% block mediagoblin_body %}
{% block mediagoblin_header %}
<header>
@@ -58,26 +66,53 @@
{% block mediagoblin_header_title %}{% endblock %}
<div class="header_right">
{%- if request.user %}
- {% if request.user and request.user.status == 'active' %}
- <div class="button_action header_dropdown_down">&#9660;</div>
- <div class="button_action header_dropdown_up">&#9650;</div>
- {% elif request.user and request.user.status == "needs_email_verification" %}
+ {% if request.user and
+ request.user.has_privilege('active') and
+ not request.user.is_banned() %}
+
+ {% set notification_count = get_notification_count(request.user.id) %}
+ {% if notification_count %}
+ <a href="javascript:;" class="notification-gem button_action" title="Notifications">
+ {{ notification_count }}</a>
+ {% endif %}
+ <a href="javascript:;" class="button_action header_dropdown_down">&#9660;</a>
+ <a href="javascript:;" class="button_action header_dropdown_up">&#9650;</a>
+ {% elif request.user and not request.user.has_privilege('active') %}
{# the following link should only appear when verification is needed #}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
user=request.user.username) }}"
class="button_action_highlight">
{% trans %}Verify your email!{% endtrans %}</a>
- or <a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}log out{% endtrans %}</a>
+ or <a id="logout" href=
+ {% if persona is not defined %}
+ "{{ request.urlgen('mediagoblin.auth.logout') }}"
+ {% else %}
+ "javascript:;"
+ {% endif %}
+ >{% trans %}log out{% endtrans %}</a>
+ {% elif request.user and request.user.is_banned() %}
+ <a id="logout" href=
+ {% if persona is not defined %}
+ "{{ request.urlgen('mediagoblin.auth.logout') }}"
+ {% else %}
+ "javascript:;"
+ {% endif %}
+ >{% trans %}log out{% endtrans %}</a>
+ {% endif %}
+ {%- elif auth %}
+ <a href=
+ {% if persona_auth is defined %}
+ "javascript:;" id="persona_login"
+ {% else %}
+ "{{ request.urlgen('mediagoblin.auth.login') }}"
{% endif %}
- {%- else %}
- <a href="{{ request.urlgen('mediagoblin.auth.login') }}?next={{
- request.base_url|urlencode }}">
+ >
{%- trans %}Log in{% endtrans -%}
</a>
{%- endif %}
</div>
<div class="clear"></div>
- {% if request.user and request.user.status == 'active' %}
+ {% if request.user and request.user.has_privilege('active') %}
<div class="header_dropdown">
<p>
<span class="dropdown_title">
@@ -95,7 +130,14 @@
{%- trans %}Media processing panel{% endtrans -%}
</a>
&middot;
- <a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}Log out{% endtrans %}</a>
+ {% template_hook("blog_dashboard_home") %}
+ <a id="logout" href=
+ {% if persona is not defined %}
+ "{{ request.urlgen('mediagoblin.auth.logout') }}"
+ {% else %}
+ "javascript:;"
+ {% endif %}
+ >{% trans %}Log out{% endtrans %}</a>
</p>
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.start') }}">
{%- trans %}Add media{% endtrans -%}
@@ -103,38 +145,40 @@
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.collection') }}">
{%- trans %}Create new collection{% endtrans -%}
</a>
- {% if request.user.is_admin %}
+ {% if request.user.has_privilege('admin','moderator') %}
<p>
- <span class="dropdown_title">Admin powers:</span>
- <a href="{{ request.urlgen('mediagoblin.admin.panel') }}">
+ <span class="dropdown_title">Moderation powers:</span>
+ <a href="{{ request.urlgen('mediagoblin.moderation.media_panel') }}">
{%- trans %}Media processing panel{% endtrans -%}
</a>
+ &middot;
+ <a href="{{ request.urlgen('mediagoblin.moderation.users') }}">
+ {%- trans %}User management panel{% endtrans -%}
+ </a>
+ &middot;
+ <a href="{{ request.urlgen('mediagoblin.moderation.reports') }}">
+ {%- trans %}Report management panel{% endtrans -%}
+ </a>
</p>
{% endif %}
+ {% include 'mediagoblin/fragments/header_notifications.html' %}
</div>
{% endif %}
</header>
{% endblock %}
<div class="container">
- {% include 'mediagoblin/bits/above-content.html' %}
+ {% include 'mediagoblin/bits/above_content.html' %}
<div class="mediagoblin_content">
{% include "mediagoblin/utils/messages.html" %}
{% block mediagoblin_content %}
{% endblock mediagoblin_content %}
+ {% if csrf_token is defined %}
+ {% template_hook("persona_form") %}
+ {% endif %}
</div>
- {%- block mediagoblin_footer %}
- <footer>
- {% trans -%}
- Powered by <a href="http://mediagoblin.org/" title='Version {{ version }}'>MediaGoblin</a>, a <a href="http://gnu.org/">GNU</a> project.
- {%- endtrans %}
- {% trans source_link=app_config['source_link'] -%}
- Released under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">AGPL</a>. <a href="{{ source_link }}">Source code</a> available.
- {%- endtrans %}
- </footer>
- {%- endblock mediagoblin_footer %}
+ {%- include "mediagoblin/bits/base_footer.html" %}
</div>
{%- endblock mediagoblin_body %}
- {% include 'mediagoblin/bits/body-end.html' %}
- </div>
- </body>
+ {% include 'mediagoblin/bits/body_end.html' %}
+ </body>
</html>
diff --git a/mediagoblin/templates/mediagoblin/bits/above-content.html b/mediagoblin/templates/mediagoblin/bits/above_content.html
index bb7b9762..bb7b9762 100644
--- a/mediagoblin/templates/mediagoblin/bits/above-content.html
+++ b/mediagoblin/templates/mediagoblin/bits/above_content.html
diff --git a/mediagoblin/templates/mediagoblin/bits/base_footer.html b/mediagoblin/templates/mediagoblin/bits/base_footer.html
new file mode 100644
index 00000000..84397be2
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/bits/base_footer.html
@@ -0,0 +1,35 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011-2013 MediaGoblin contributors. See AUTHORS.
+#
+# 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/>.
+#}
+
+{%- block mediagoblin_footer %}
+ <footer>
+ {% trans -%}
+ Powered by <a href="http://mediagoblin.org/" title='Version {{ version }}'>MediaGoblin</a>, a <a href="http://gnu.org/">GNU</a> project.
+ {%- endtrans %}
+ {% trans source_link=app_config['source_link'] -%}
+ Released under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">AGPL</a>. <a href="{{ source_link }}">Source code</a> available.
+ {%- endtrans %}
+ {% if app_config['show_tos'] %}
+ <p class="fine_print">
+ <a href="{{ request.urlgen('terms_of_service') }}">
+ {%- trans %}Terms of Service{%- endtrans %}
+ </a>
+ </p>
+ {% endif %}
+ </footer>
+{%- endblock mediagoblin_footer -%}
diff --git a/mediagoblin/templates/mediagoblin/bits/body-start.html b/mediagoblin/templates/mediagoblin/bits/body_end.html
index bb7b9762..c8f5e2d6 100644
--- a/mediagoblin/templates/mediagoblin/bits/body-start.html
+++ b/mediagoblin/templates/mediagoblin/bits/body_end.html
@@ -15,3 +15,5 @@
# 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/>.
-#}
+
+{% template_hook("persona_end") %}
diff --git a/mediagoblin/templates/mediagoblin/bits/body-end.html b/mediagoblin/templates/mediagoblin/bits/body_start.html
index bb7b9762..bb7b9762 100644
--- a/mediagoblin/templates/mediagoblin/bits/body-end.html
+++ b/mediagoblin/templates/mediagoblin/bits/body_start.html
diff --git a/mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html b/mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html
new file mode 100644
index 00000000..4e55e618
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html
@@ -0,0 +1,47 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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/>.
+#}
+
+{% if request.user %}
+ <h1>{% trans %}Explore{% endtrans %}</h1>
+ {% else %}
+ <img class="right_align" src="{{ request.staticdirect('/images/home_goblin.png') }}" />
+ <h1>{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}</h1>
+ <p>{% trans %}This site is running <a href="http://mediagoblin.org">MediaGoblin</a>, an extraordinarily great piece of media hosting software.{% endtrans %}</p>
+ {% if auth %}
+ <p>{% trans %}To add your own media, place comments, and more, you can log in with your MediaGoblin account.{% endtrans %}</p>
+ {% if allow_registration %}
+ <p>{% trans %}Don't have one yet? It's easy!{% endtrans %}</p>
+ <a class="button_action_highlight" href=
+ {% if persona_auth is defined %}
+ "javascript:;" id="persona_login1"
+ {% else %}
+ "{{ request.urlgen('mediagoblin.auth.register') }}"
+ {% endif %}
+ {% trans %}
+ >Create an account at this site</a>
+ or
+ {%- endtrans %}
+ {% endif %}
+ {% endif %}
+ {% trans %}
+ <a class="button_action" href="http://mediagoblin.readthedocs.org/">Set up MediaGoblin on your own server</a>
+ {%- endtrans %}
+
+ <div class="clear"></div>
+ {% endif %}
+
diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/edit/change_email.html
index 46aeddef..76cc4771 100644
--- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html
+++ b/mediagoblin/templates/mediagoblin/edit/change_email.html
@@ -1,6 +1,6 @@
{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
#
# 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
@@ -20,18 +20,25 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% block title -%}
- {% trans %}Recover password{% endtrans %} &mdash; {{ super() }}
+ {% trans username=user.username -%}
+ Changing {{ username }}'s email
+ {%- endtrans %} &mdash; {{ super() }}
{%- endblock %}
{% block mediagoblin_content %}
- <form action="{{ request.urlgen('mediagoblin.auth.forgot_password') }}"
+ <form action="{{ request.urlgen('mediagoblin.edit.email') }}"
method="POST" enctype="multipart/form-data">
- {{ csrf_token }}
- <div class="form_box">
- <h1>{% trans %}Recover password{% endtrans %}</h1>
- {{ wtforms_util.render_divs(fp_form) }}
+ <div class="form_box edit_box">
+ <h1>
+ {%- trans username=user.username -%}
+ Changing {{ username }}'s email
+ {%- endtrans -%}
+ </h1>
+ {{ wtforms_util.render_divs(form, True) }}
+ {{ csrf_token }}
<div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Send instructions{% endtrans %}" class="button_form"/>
+ <input type="submit" value="{% trans %}Save{% endtrans %}"
+ class="button_form" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_account.html b/mediagoblin/templates/mediagoblin/edit/edit_account.html
index 7fe2c031..574fe459 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit_account.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit_account.html
@@ -41,16 +41,11 @@
Changing {{ username }}'s account settings
{%- endtrans -%}
</h1>
- {{ wtforms_util.render_field_div(form.old_password) }}
- {{ wtforms_util.render_field_div(form.new_password) }}
- <div class="form_field_input">
- <p>{{ form.wants_comment_notification }}
- {{ wtforms_util.render_label(form.wants_comment_notification) }}</p>
- </div>
- {{- wtforms_util.render_field_div(form.license_preference) }}
- <div class="form_submit_buttons">
+ {% template_hook("edit_link") %}
+ {{ wtforms_util.render_divs(form, True) }}
+ <div class="form_submit_buttons">
<input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
- {{ csrf_token }}
+ {{ csrf_token }}
</div>
</div>
</form>
@@ -58,5 +53,16 @@
<a href="{{ request.urlgen('mediagoblin.edit.delete_account') }}">
{%- trans %}Delete my account{% endtrans -%}
</a>
+ &middot;
+ {% template_hook("edit_link") %}
+ <a href="{{ request.urlgen('mediagoblin.edit.email') }}">
+ {% trans %}Email{% endtrans %}
+ </a>
+ {% if pass_auth is defined %}
+ &middot;
+ <a href="{{ request.urlgen('mediagoblin.plugins.basic_auth.edit.pass') }}">
+ {% trans %}Password{% endtrans %}
+ </a>
+ {% endif %}
</div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt b/mediagoblin/templates/mediagoblin/edit/verification.txt
index fb5e1674..d53cd5e8 100644
--- a/mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt
+++ b/mediagoblin/templates/mediagoblin/edit/verification.txt
@@ -1,6 +1,6 @@
{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
#
# 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
@@ -14,17 +14,16 @@
#
# 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/>.
-#}
+-#}
{% trans username=username, verification_url=verification_url|safe -%}
-Hi {{ username }},
+Hi,
-to change your GNU MediaGoblin password, open the following URL in
-your web browser:
+We wanted to verify that you are {{ username }}. If this is the case, then
+please follow the link below to verify your new email address.
{{ verification_url }}
-If you think this is an error, just ignore this email and continue being
-a happy goblin!
+If you are not {{ username }} or didn't request an email change, you can ignore
+this email.
{%- endtrans %}
-
diff --git a/mediagoblin/templates/mediagoblin/extra_head.html b/mediagoblin/templates/mediagoblin/extra_head.html
index 973e2b48..847cfcc7 100644
--- a/mediagoblin/templates/mediagoblin/extra_head.html
+++ b/mediagoblin/templates/mediagoblin/extra_head.html
@@ -17,3 +17,19 @@
-#}
{# Add extra head declarations here for your theme, if appropriate #}
+
+<script type="text/javascript"
+ src="{{request.staticdirect('extlib/tinymce/js/tinymce/tinymce.min.js')}}"></script>
+
+ <script type="text/javascript">
+ tinyMCE.init({
+ selector: "div.blog_form_field_input textarea",
+ height: 300,
+ width: 800,
+ plugins: [
+ "advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker",
+ "searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking",
+ "save table contextmenu directionality emoticons template paste textcolor"
+ ]
+ })
+</script>
diff --git a/mediagoblin/templates/mediagoblin/fragments/header_notifications.html b/mediagoblin/templates/mediagoblin/fragments/header_notifications.html
new file mode 100644
index 00000000..55759a39
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/fragments/header_notifications.html
@@ -0,0 +1,44 @@
+{% set notifications = get_notifications(request.user.id) %}
+{% if notifications %}
+ <div class="header_notifications">
+ <h3>{% trans %}New comments{% endtrans %}</h3>
+ <ul>
+ {% for notification in notifications %}
+ {% set comment = notification.subject %}
+ {% set comment_author = comment.get_author %}
+ {% set media = comment.get_entry %}
+ <li class="comment_wrapper">
+ <div class="comment_author">
+ <img src="{{ request.staticdirect('/images/icon_comment.png') }}" />
+ <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
+ user=comment_author.username) }}"
+ class="comment_authorlink">
+ {{- comment_author.username -}}
+ </a>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
+ comment=comment.id,
+ user=media.get_uploader.username,
+ media=media.slug_or_id) }}#comment"
+ class="comment_whenlink">
+ <span title='{{- comment.created.strftime("%I:%M%p %Y-%m-%d") -}}'>
+ {%- trans formatted_time=timesince(comment.created) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span>
+ </a>:
+ </div>
+ <div class="comment_content">
+ {% autoescape False -%}
+ {{ comment.content_html }}
+ {%- endautoescape %}
+ </div>
+
+ </li>
+ {% endfor %}
+ </ul>
+ <a href="{{ request.urlgen('mediagoblin.notifications.mark_all_comment_notifications_seen') }}?next={{
+ request.base_url|urlencode }}" id="mark_all_comments_seen">
+ {% trans %}Mark all read{% endtrans %}
+ </a>
+ </div>
+{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/blogpost.html b/mediagoblin/templates/mediagoblin/media_displays/blogpost.html
new file mode 100644
index 00000000..ca3441b9
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/media_displays/blogpost.html
@@ -0,0 +1,33 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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/user_pages/blog_media.html' %}
+
+{% block mediagoblin_head %}
+ {{ super() }}
+{% endblock %}
+
+{% block mediagoblin_media %}
+<h1> {{media.title}}</h1>
+<p>{{media.description|safe}}</p>
+
+{% endblock %}
+
+
+
+
diff --git a/mediagoblin/templates/mediagoblin/media_displays/image.html b/mediagoblin/templates/mediagoblin/media_displays/image.html
index 158dd67f..d0050f50 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/image.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/image.html
@@ -27,3 +27,20 @@
{{ super() }}
{% template_hook("image_sideinfo") %}
{% endblock %}
+
+{% block mediagoblin_after_added_sidebar %}
+ {% if app_config['original_date_visible'] %}
+ {% set original_date = media.media_manager.get_original_date() %}
+
+ {% if original_date %}
+ <h3>{% trans %}Created{% endtrans %}</h3>
+
+ <p><span title="{{ original_date.strftime("%I:%M%p %Y-%m-%d") }}">
+ {%- trans formatted_time=timesince(original_date) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span></p>
+ {%- endif %}
+ {% endif %}
+{% endblock %}
+
diff --git a/mediagoblin/templates/mediagoblin/media_displays/pdf.html b/mediagoblin/templates/mediagoblin/media_displays/pdf.html
index e946f3ab..a615cba6 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/pdf.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/pdf.html
@@ -29,7 +29,7 @@
media.media_files['original']) %}
{% endif %}
-{% set pdf_js = global_config.get('media_type:mediagoblin.media_types.pdf', {}).get('pdf_js', False) %}
+{% set pdf_js = global_config['plugins'].get('mediagoblin.media_types.pdf', {}).get('pdf_js', False) %}
{% if pdf_js %}
{% block mediagoblin_html_tag %}
@@ -46,19 +46,21 @@
{%- endblock %}
{% block mediagoblin_media %}
-{% if pdf_js %}
-<iframe width=640px height=480px
- src="{{ request.staticdirect('/extlib/pdf.js/web/viewer.html') }}?file={{ pdf_view }} ">
-</iframe>
-
-{% else %}
- <a href="{{ pdf_view }}">
- <img id="medium"
- class="media_image"
- src="{{ medium_view }}"
- alt="{% trans media_title=media.title -%} Image for {{ media_title}}{% endtrans %}"/>
- </a>
-{% endif %}
+ {% if pdf_js %}
+ <iframe width="640px" height="480px"
+ src="{{ request.staticdirect('/extlib/pdf.js/web/viewer.html') }}?file={{ pdf_view }} ">
+ </iframe>
+ {% else %}
+ <a href="{{ pdf_view }}">
+ <img id="medium"
+ class="media_image"
+ src="{{ medium_view }}"
+ alt="
+ {%- trans media_title=media.title -%}
+ Image for {{ media_title}}
+ {%- endtrans %}"/>
+ </a>
+ {% endif %}
{% endblock %}
{% block mediagoblin_sidebar %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/stl.html b/mediagoblin/templates/mediagoblin/media_displays/stl.html
index a89e0b4f..bc12ce4e 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/stl.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/stl.html
@@ -108,32 +108,26 @@ window.show_things = function () {
<div style="padding: 4px;">
- <a class="button_action" onclick="show('perspective');"
- title="{%- trans %}Toggle Rotate{% endtrans -%}">
+ <a class="button_action" onclick="show('perspective');">
{%- trans %}Perspective{% endtrans -%}
</a>
- <a class="button_action" onclick="show('front_view');"
- title="{%- trans %}Front{% endtrans -%}">
+ <a class="button_action" onclick="show('front_view');">
{%- trans %}Front{% endtrans -%}
</a>
- <a class="button_action" onclick="show('top_view');"
- title="{%- trans %}Top{% endtrans -%}">
+ <a class="button_action" onclick="show('top_view');">
{%- trans %}Top{% endtrans -%}
</a>
- <a class="button_action" onclick="show('side_view');"
- title="{%- trans %}Side{% endtrans -%}">
+ <a class="button_action" onclick="show('side_view');">
{%- trans %}Side{% endtrans -%}
</a>
{% if media.media_data.file_type == "stl" %}
<a id="webgl_button" class="button_action"
- onclick="show_things();"
- title="{%- trans %}WebGL{% endtrans -%}">
+ onclick="show_things();">
{%- trans %}WebGL{% endtrans -%}
</a>
{% endif %}
<a class="button_action" href="{{ model_download }}"
- title="{%- trans %}Download{% endtrans -%}"
style="float:right;">
{%- trans %}Download model{% endtrans -%}
</a>
diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html
index b0854c9f..9386ffcf 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/video.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/video.html
@@ -21,17 +21,36 @@
{% block mediagoblin_head -%}
{{ super() }}
<script type="text/javascript" src="{{
- request.staticdirect('/extlib/video-js/video.min.js') }}"></script>
- <link href="{{ request.staticdirect('/css/vjs-mg-skin.css') }}"
+ request.staticdirect('/extlib/video-js/video.js') }}"></script>
+ {# Sadly commented out till we can get the mediagoblin skin ported over
+ # to the newest video.js release ;\ #}
+ {#
+ <link href="{{ request.staticdirect('/css/vjs-mg-skin.css') }}"
+ rel="stylesheet">
+ #}
+ <link href="{{
+ request.staticdirect('/extlib/video-js/video-js.css') }}"
rel="stylesheet">
+
+ <style type="text/css">
+ .vjs-default-skin .vjs-big-play-button
+ {
+ top: 50%;
+ left: 50%;
+ margin: -1.5em auto auto -2em;
+ }
+ .vjs-play-progress, .vjs-volume-level {
+ background-color: #86D4B1 !important;
+ }
+ </style>
{%- endblock %}
{% block mediagoblin_media %}
{% set display_type, display_path = media.get_display_media() %}
<video controls
- {% if global_config['media_type:mediagoblin.media_types.video']['auto_play'] %}autoplay{% endif %}
- preload="auto" class="video-js vjs-mg-skin"
+ {% if global_config['plugins']['mediagoblin.media_types.video']['auto_play'] %}autoplay{% endif %}
+ preload="auto" class="video-js vjs-default-skin"
data-setup='{"height": {{ media.media_data.height }},
"width": {{ media.media_data.width }} }'>
<source src="{{ request.app.public_store.file_url(display_path) }}"
@@ -62,11 +81,11 @@
</a>
</li>
{% endif %}
- {% if 'webm_640' in media.media_files %}
+ {% if 'webm_video' in media.media_files %}
<li>
<a href="{{ request.app.public_store.file_url(
- media.media_files.webm_640) }}">
- {%- trans %}WebM file (640p; VP8/Vorbis){% endtrans -%}
+ media.media_files.webm_video) }}">
+ {%- trans %}WebM file (VP8/Vorbis){% endtrans -%}
</a>
</li>
{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/admin/panel.html b/mediagoblin/templates/mediagoblin/moderation/media_panel.html
index 1c3c866e..3c929d4f 100644
--- a/mediagoblin/templates/mediagoblin/admin/panel.html
+++ b/mediagoblin/templates/mediagoblin/moderation/media_panel.html
@@ -21,6 +21,7 @@
{% trans %}Media processing panel{% endtrans %} &mdash; {{ super() }}
{%- endblock %}
+
{% block mediagoblin_content %}
<h1>{% trans %}Media processing panel{% endtrans %}</h1>
@@ -28,7 +29,7 @@
<p>
{% trans %}Here you can track the state of media being processed on this instance.{% endtrans %}
</p>
-
+
<h2>{% trans %}Media in-processing{% endtrans %}</h2>
{% if processing_entries.count() %}
@@ -56,7 +57,7 @@
</table>
{% else %}
<p><em>{% trans %}No media in-processing{% endtrans %}</em></p>
-{% endif %}
+{% endif %}
<h2>{% trans %}These uploads failed to process:{% endtrans %}</h2>
{% if failed_entries.count() %}
diff --git a/mediagoblin/templates/mediagoblin/moderation/report.html b/mediagoblin/templates/mediagoblin/moderation/report.html
new file mode 100644
index 00000000..cedbd49a
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/moderation/report.html
@@ -0,0 +1,161 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{%- block mediagoblin_head %}
+ <script src="{{ request.staticdirect('/js/setup_report_forms.js') }}">
+ </script>
+{% endblock %}
+
+{%- block mediagoblin_content %}
+{% if not report %}
+ {% trans %}Sorry, no such report found.{% endtrans %}
+{% else %}
+ <a href="{{ request.urlgen('mediagoblin.moderation.reports') }}"
+ class="return_to_panel button_action"
+ title="Return to Reports Panel">
+ {% trans %}Return to Reports Panel{% endtrans %}</a>
+ <h2>{% trans %}Report{% endtrans %} #{{ report.id }}</h2>
+ {% if report.is_comment_report() and report.comment %}
+
+ {% trans %}Reported comment{% endtrans %}:
+ {% set comment = report.comment %}
+ {% set reported_user = comment.get_author %}
+ <div id="comment-{{ comment.id }}"
+ class="comment_wrapper">
+ <div class="comment_author">
+ <img src="{{ request.staticdirect('/images/icon_comment.png') }}" />
+ <a href="{{ request.urlgen('mediagoblin.moderation.users_detail',
+ user=comment.get_author.username) }}"
+ class="comment_authorlink">
+ {{- reported_user.username -}}
+ </a>
+ <a href="{{ request.urlgen(
+ 'mediagoblin.user_pages.media_home.view_comment',
+ comment=comment.id,
+ user=comment.get_media_entry.get_uploader.username,
+ media=comment.get_media_entry.slug_or_id) }}#comment"
+ class="comment_whenlink">
+ <span title='{{- comment.created.strftime("%I:%M%p %Y-%m-%d") -}}'>
+ {%- trans formatted_time=timesince(comment.created) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span></a>:
+ </div>
+ <div class=comment_content>
+ {% autoescape False %}
+ {{ comment.content_html }}
+ {% endautoescape %}
+ </div>
+ </div>
+ {% elif report.is_media_entry_report() and report.media_entry %}
+
+ {% set media_entry = report.media_entry %}
+ <div class="media_thumbnail">
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home',
+ user=media_entry.get_uploader.username,
+ media=media_entry.slug_or_id) }}">
+ <img src="{{ media_entry.thumb_url}}"/></a>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home',
+ user=media_entry.get_uploader.username,
+ media=media_entry.slug_or_id) }}" class=thumb_entry_title>
+ {{ media_entry.title }}</a>
+ </div>
+ <div class=clear></div>
+ <p>
+ {% trans user_name=report.reported_user.username,
+ user_url=request.urlgen(
+ 'mediagoblin.moderation.users_detail',
+ user=report.reported_user.username) %}
+ ❖ Reported media by <a href="{{ user_url }}">{{ user_name }}</a>
+ {% endtrans %}
+ </p>
+ <div class=clear></div>
+ {% else %}
+ <h2>{% trans user_url=request.urlgen(
+ 'mediagoblin.moderation.users_detail',
+ user=report.reporter.username),
+ user_name=report.reported_user.username %}
+ CONTENT BY
+ <a href="{{ user_url }}"> {{ user_name }}</a>
+ HAS BEEN DELETED
+ {% endtrans %}
+ </h2>
+ {% endif %}
+ Reason for report:
+ <div id="report-{{ report.id }}"
+ class="report_wrapper">
+ <div class="report_author">
+ <img src="{{ request.staticdirect(
+ '/images/icon_clipboard_alert.png') }}"
+ alt="Under a GNU LGPL v.3 or Creative Commons BY-SA 3.0 license.
+ Distributed by the GNOME project http://www.gnome.org" />
+ <a href="{{ request.urlgen('mediagoblin.moderation.users_detail',
+ user=report.reporter.username) }}"
+ class="report_authorlink">
+ {{- report.reporter.username -}}
+ </a>
+ <a href="{{ request.urlgen('mediagoblin.moderation.reports_detail',
+ report_id=report.id) }}"
+ class="report_whenlink">
+ <span title='{{- report.created.strftime("%I:%M%p %Y-%m-%d") -}}'>
+ {%- trans formatted_time=timesince(report.created) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span>
+ </a>
+ </div>
+ <div class="report_content">
+ {{ report.report_content }}
+ </div>
+ </div>
+ {% if not report.is_archived_report() and
+ not (report.reported_user.has_privilege('admin') and
+ not request.user.has_privilege('admin')) %}
+ <input type=button value="{% trans %}Resolve{% endtrans %}" id=open_resolution_form />
+ <form action="" method="POST" id=resolution_form>
+ {{ wtforms_util.render_divs(form) }}
+ {{ csrf_token }}
+ <input type=submit id="submit_this_report" value="{% trans %}Resolve This Report{% endtrans %}"/>
+ </form>
+ <script>
+ $(document).ready(function() {
+ init_report_resolution_form();
+ });
+ </script>
+ {% elif report.is_archived_report() %}
+ <h2><img src="{{ request.staticdirect('/images/icon_clipboard.png') }}"
+ alt="Under a GNU LGPL v.3 or Creative Commons BY-SA 3.0 license.
+ Distributed by the GNOME project http://www.gnome.org" />
+ {% trans %}Status{% endtrans %}:
+ </h2>
+ <b>{% trans %}RESOLVED{% endtrans %}</b>
+ {{ report.resolved.strftime("%I:%M%p %Y-%m-%d") }}
+ <pre>
+ <p>{{ report.result }}</p>
+ </pre>
+ {% else %}
+ <input type=button disabled=disabled value="{% trans %}Resolve This Report{% endtrans %}"/>
+ <p>
+ {% trans -%}
+ You cannot take action against an administrator
+ {%- endtrans %}
+ </p>
+ {% endif %}
+{% endif %}
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/moderation/report_panel.html b/mediagoblin/templates/mediagoblin/moderation/report_panel.html
new file mode 100644
index 00000000..95b6be80
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/moderation/report_panel.html
@@ -0,0 +1,202 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block title -%}
+ {% trans %}Report panel{% endtrans %} &mdash; {{ super() }}
+{%- endblock %}
+
+{% block mediagoblin_content %}
+
+<h1>{% trans %}Report panel{% endtrans %}</h1>
+
+<p>
+ {% trans %}
+ Here you can look up open reports that have been filed by users.
+ {% endtrans %}
+</p>
+
+<h2>{% trans %}Active Reports Filed{% endtrans %}</h2>
+{% if report_list.count() %}
+ {% if not active_settings.last_page == 1 %}
+ {% if 'active_p='~active_settings.current_page in request.query_string %}
+ {% set query_string = request.query_string %}{% else %}
+ {% set query_string =
+'active_p='~active_settings.current_page~"&"+request.query_string %}
+ {% endif %}
+ <div class="right_align">
+ {% set first_vis = active_settings.current_page-3 %}
+ {% set last_vis = active_settings.current_page+3 %}
+ {% set curr_page = active_settings.current_page %}
+ {% if 1 == curr_page %}<b>1</b>{% else %}
+ <a href ="?{{ query_string.replace(
+ 'active_p='~active_settings.current_page,
+ 'active_p='~1) }}">
+ 1</a>{% endif %}
+ {% if first_vis > 1 %}...{% endif %}
+ {% for p in range(first_vis,last_vis+1) %}
+ {% if p > 1 and p < active_settings.last_page and
+curr_page !=p %}
+ <a href="?{{ query_string.replace(
+ 'active_p='~active_settings.current_page,
+ 'active_p='~p) }}">
+ {{ p }}</a>
+ {% elif p > 1 and p < active_settings.last_page %}
+ <b>{{ p }}</b>
+ {% endif %}
+ {% endfor %}
+ {% if last_vis < active_settings.last_page %}...{% endif %}
+ {% if active_settings.last_page != curr_page %}
+ <a href ="?{{ query_string.replace(
+ 'active_p='~active_settings.current_page,
+ 'active_p='~active_settings.last_page) }}">
+ {{ active_settings.last_page }}</a>
+ {% else %}<b>{{ active_settings.last_page }}</b>
+ {% endif %}
+ </div>
+ {% endif %}
+ <table class="admin_panel processing">
+ <tr>
+ <th></th>
+ <th>{% trans %}Offender{% endtrans %}</th>
+ <th>{% trans %}When Reported{% endtrans %}</th>
+ <th>{% trans %}Reported By{% endtrans %}</th>
+ <th>{% trans %}Reason{% endtrans %}</th>
+ </tr>
+ {% for report in report_list %}
+ <tr>
+ {% if report.discriminator == "comment_report" %}
+ <td>
+ <img
+ src="{{ request.staticdirect(
+ '/images/icon_clipboard_alert.png') }}"
+ alt="Under a GNU LGPL v.3 or Creative Commons BY-SA 3.0 license.
+ Distributed by the GNOME project http://www.gnome.org" />
+ <a href="{{ request.urlgen(
+ 'mediagoblin.moderation.reports_detail',
+ report_id=report.id) }}">
+ {% trans report_id=report.id %}
+ Comment Report #{{ report_id }}
+ {% endtrans %}
+ </a>
+ </td>
+ {% elif report.discriminator == "media_report" %}
+ <td>
+ <img
+ src="{{ request.staticdirect(
+ '/images/icon_clipboard_alert.png') }}"
+ alt="Under a GNU LGPL v.3 or Creative Commons BY-SA 3.0 license.
+ Distributed by the GNOME project http://www.gnome.org" />
+ <a href="{{ request.urlgen(
+ 'mediagoblin.moderation.reports_detail',
+ report_id=report.id) }}">
+ {% trans report_id=report.id %}
+ Media Report #{{ report_id }}
+ {% endtrans %}
+ </a>
+ </td>
+ {% endif %}
+ <td>{{ report.reported_user.username }}</td>
+ <td>{{ report.created.strftime("%F %R") }}</td>
+ <td>{{ report.reporter.username }}</td>
+ <td>{{ report.report_content[0:20] }}...</td>
+ </tr>
+ {% endfor %}
+ </table>
+{% else %}
+ <p><em>{% trans %}No open reports found.{% endtrans %}</em></p>
+{% endif %}
+<h2>{% trans %}Closed Reports{% endtrans %}</h2>
+{% if closed_report_list.count() %}
+ {% if not closed_settings.last_page == 1 %}
+ {% if 'closed_p='~closed_settings.current_page in request.query_string %}
+ {% set query_string = request.query_string %}{% else %}
+ {% set query_string =
+'closed_p='~closed_settings.current_page~"&"+request.query_string %}
+ {% endif %}
+ <div class="right_align">
+ {% set first_vis = closed_settings.current_page-3 %}
+ {% set last_vis = closed_settings.current_page+3 %}
+ {% set curr_page = closed_settings.current_page %}
+ {% if not curr_page==1 %}
+ <a href ="?{{ query_string.replace(
+ 'closed_p='~closed_settings.current_page,
+ 'closed_p='~1) }}">1</a>
+ {% else %}
+ <b>1 </b>
+ {% endif %}
+ {% if first_vis > 1 %}...{% endif %}
+ {% for p in range(first_vis,last_vis+1) %}
+ {% if p > 1 and p < closed_settings.last_page and
+curr_page !=p %}
+ <a href="?{{ query_string.replace(
+ 'closed_p='~closed_settings.current_page,
+ 'closed_p='~p) }}">
+ {{ p }}</a>
+
+ {% elif p > 1 and p < closed_settings.last_page %}
+ <b>{{ p }}</b>
+ {% endif %}
+ {% endfor %}
+ {% if last_vis < closed_settings.last_page %}...{% endif %}
+ {% if curr_page != closed_settings.last_page %}
+ <a href ="?{{ query_string.replace(
+ 'closed_p='~closed_settings.current_page,
+ 'closed_p='~closed_settings.last_page) }}">
+ {{ closed_settings.last_page }}</a>
+ {% else %}<b>{{ closed_settings.last_page }}</b>
+ {% endif %}
+ </div>
+ {% endif %}
+ <table class="media_panel processing">
+ <tr>
+ <th></th>
+ <th>{% trans %}Resolved{% endtrans %}</th>
+ <th>{% trans %}Offender{% endtrans %}</th>
+ <th>{% trans %}Action Taken{% endtrans %}</th>
+ <th>{% trans %}Reported By{% endtrans %}</th>
+ <th>{% trans %}Reason{% endtrans %}</th>
+ </tr>
+ {% for report in closed_report_list %}
+ <tr>
+ <td>
+ <img
+ src="{{ request.staticdirect('/images/icon_clipboard.png') }}"
+ alt="Under a GNU LGPL v.3 or Creative Commons BY-SA 3.0 license.
+ Distributed by the GNOME project http://www.gnome.org" />
+ <a href="{{ request.urlgen('mediagoblin.moderation.reports_detail',
+ report_id=report.id) }}">
+ {% trans report_id=report.id %}
+ Closed Report #{{ report_id }}
+ {% endtrans %}
+ </a>
+ </td>
+ <td>{{ report.resolved.strftime("%F %R") }}</td>
+ <td>{{ report.reported_user.username }}</td>
+ <td>{{ report.created.strftime("%F %R") }}</td>
+ <td>{{ report.reporter.username }}</td>
+ <td>{{ report.report_content[:15] }}...</td>
+ </tr>
+ {% endfor %}
+ </table>
+{% else %}
+ <p><em>{% trans %}No closed reports found.{% endtrans %}</em></p>
+{% endif %}
+
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/moderation/user.html b/mediagoblin/templates/mediagoblin/moderation/user.html
new file mode 100644
index 00000000..6335ea12
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/moderation/user.html
@@ -0,0 +1,217 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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" %}
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block title %}
+ {%- if user -%}
+ {%- trans username=user.username -%}
+ User: {{ username }}
+ {%- endtrans %} &mdash; {{ super() }}
+ {%- else -%}
+ {{ super() }}
+ {%- endif -%}
+{% endblock %}
+
+{%- block mediagoblin_head %}
+ <script src="{{ request.staticdirect('/js/setup_report_forms.js') }}">
+ </script>
+{% endblock %}
+
+{% block mediagoblin_content -%}
+ {# If no user... #}
+ {% if not user %}
+ <p>{% trans %}Sorry, no such user found.{% endtrans %}</p>
+ {# User exists, but needs verification #}
+ {% elif not user.has_privilege('active') %}
+ <div class="profile_sidebar empty_space">
+ <h1>{% trans %}Email verification needed{% endtrans %}</h1>
+ <p>
+ {% trans -%}
+ Someone has registered an account with this username, but it still has
+ to be activated.
+ {%- endtrans %}
+ </p>
+
+ </div>
+
+ {# Active(?) (or at least verified at some point) user, horray! #}
+ {% else %}
+ <a href="{{ request.urlgen('mediagoblin.moderation.users') }}"
+ class="return_to_panel button_action"
+ title="Return to Users Panel">
+ {% trans %}Return to Users Panel{% endtrans %}</a>
+ <h1>
+ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%}
+ {% if user_banned and user_banned.expiration_date %}
+ &mdash; {% trans expiration_date=user_banned.expiration_date -%}
+ BANNED until {{ expiration_date }}
+ {%- endtrans %}
+ {% elif user_banned %}
+ &mdash; {% trans %}Banned Indefinitely{% endtrans %}
+ {% endif %}
+ </h1>
+ {% if not user.url and not user.bio %}
+ <div class="profile_sidebar empty_space">
+ <p>
+ {% trans -%}
+ This user hasn't filled in their profile (yet).
+ {%- endtrans %}
+ </p>
+ {% else %}
+ <div class="profile_sidebar">
+ {% include "mediagoblin/utils/profile.html" %}
+ {% if request.user and
+ (request.user.id == user.id or request.user.has_privilege('admin')) %}
+ <a href="{{ request.urlgen('mediagoblin.edit.profile',
+ user=user.username) }}">
+ {%- trans %}Edit profile{% endtrans -%}
+ </a>
+ {% endif %}
+ {% endif %}
+ <p>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.collection_list',
+ user=user.username) }}">
+ {%- trans %}Browse collections{% endtrans -%}
+ </a>
+ </p>
+ </div>
+ {% endif %}
+ {% if user %}
+ <h2>
+ {%- trans username=user.username -%}
+ Active Reports on {{ username }}
+ {%- endtrans -%}
+ </h2>
+ {% if reports.count() %}
+ <table class="admin_side_panel">
+ <tr>
+ <th>{%- trans %}Report ID{% endtrans -%}</th>
+ <th>{%- trans %}Reported Content{% endtrans -%}</th>
+ <th>{%- trans %}Description of Report{% endtrans -%}</th>
+ </tr>
+ {% for report in reports %}
+ <tr>
+ <td>
+ <img src="{{ request.staticdirect('/images/icon_clipboard.png') }}" />
+ <a href="{{ request.urlgen('mediagoblin.moderation.reports_detail',
+ report_id=report.id) }}">
+ {%- trans report_number=report.id -%}
+ Report #{{ report_number }}
+ {%- endtrans -%}
+ </a>
+ </td>
+ <td>
+ {% if report.discriminator == "comment_report" %}
+ <a>{%- trans %}Reported Comment{% endtrans -%}</a>
+ {% elif report.discriminator == "media_report" %}
+ <a>{%- trans %}Reported Media Entry{% endtrans -%}</a>
+ {% endif %}
+ </td>
+ <td>{{ report.report_content[:21] }}
+ {% if report.report_content|count >20 %}...{% endif %}</td>
+ <td>{%- trans %}Resolve{% endtrans -%}</td>
+ </tr>
+ {% endfor %}
+ <tr><td></td><td></td>
+ </table>
+ {% else %}
+ {%- trans username=user.username -%}
+ No active reports filed on {{ username }}
+ {%- endtrans -%}
+ {% endif %}
+ <span class="right_align">
+ <a href="{{ request.urlgen(
+ 'mediagoblin.moderation.reports') }}?reported_user={{user.id}}">
+ {%- trans
+ username=user.username %}All reports on {{ username }}{% endtrans %}</a>
+ &middot;
+ <a href="{{ request.urlgen(
+ 'mediagoblin.moderation.reports') }}?reporter={{user.id}}">
+ {%- trans username=user.username -%}
+ All reports that {{ username }} has filed
+ {%- endtrans %}</a>
+ </span>
+ <span class=clear></span>
+ <h2>{% trans username=user.username -%}
+ {{ username }}'s Privileges{% endtrans %}</h2>
+ <form method=POST action="{{ request.urlgen(
+ 'mediagoblin.moderation.ban_or_unban',
+ user=user.username) }}" class="right_align">
+ {{ csrf_token }}
+ {% if request.user.has_privilege('admin') and not user_banned and
+ not user.id == request.user.id %}
+ {{ wtforms_util.render_divs(ban_form) }}
+ <input type=submit class="button_action"
+ value="{% trans %}Ban User{% endtrans %}"
+ id="ban_user_submit" />
+ {% elif request.user.has_privilege('admin') and
+ not user.id == request.user.id %}
+ <input type=submit class="button_action right_align"
+ value="{% trans %}UnBan User{% endtrans %}" />
+ {% endif %}
+ </form>
+ <form action="{{ request.urlgen('mediagoblin.moderation.give_or_take_away_privilege',
+ user=user.username) }}"
+ method=post >
+ <table class="admin_side_panel">
+ <tr>
+ <th>{% trans %}Privilege{% endtrans %}</th>
+ <th>{% trans %}User Has Privilege{% endtrans %}</th>
+ </tr>
+ {% for privilege in privileges %}
+ <tr>
+ <td>{{ privilege.privilege_name }}</td>
+ {% if privilege in user.all_privileges %}
+ <td class="user_with_privilege">
+ {% trans %}Yes{% endtrans %}{% else %}
+ <td class="user_without_privilege">
+ {% trans %}No{% endtrans %}{% endif %}
+ </td>
+ {% if request.user.has_privilege('admin') %}
+ <td>
+ {% if privilege in user.all_privileges %}
+ <input type=submit id="{{ privilege.privilege_name }}"
+ class="submit_button button_action"
+ value =" -" />
+ {% else %}
+ <input type=submit id="{{ privilege.privilege_name }}"
+ class="submit_button button_action"
+ value ="+" />
+ {% endif %}
+ </td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </table>
+ {{ csrf_token }}
+ <input type=hidden name=privilege_name id=hidden_privilege_name />
+ </form>
+ {% endif %}
+ <script>
+$(document).ready(function(){
+ $('.submit_button').click(function(){
+ $('#hidden_privilege_name').val($(this).attr('id'));
+ });
+ init_user_banned_form();
+ $('#ban_user_submit').click(function(){
+ submit_user_banned_form()
+ });
+});
+ </script>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/moderation/user_panel.html b/mediagoblin/templates/mediagoblin/moderation/user_panel.html
new file mode 100644
index 00000000..4949960e
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/moderation/user_panel.html
@@ -0,0 +1,97 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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 title -%}
+ {% trans %}User panel{% endtrans %} &mdash; {{ super() }}
+{%- endblock %}
+
+{% block mediagoblin_content %}
+
+<h1>{% trans %}User panel{% endtrans %}</h1>
+
+<p>
+ {% trans %}
+ Here you can look up users in order to take punitive actions on them.
+ {% endtrans %}
+</p>
+
+<h2>{% trans %}Active Users{% endtrans %}</h2>
+
+{% if user_list.count() %}
+ {% if not last_page == 1 %}
+ {% if 'p='~current_page in request.query_string %}
+ {% set query_string = request.query_string %}{% else %}
+ {% set query_string =
+'p='~current_page~"&"+request.query_string %}
+ {% endif %}
+ <div class="right_align">
+ {% set first_vis = current_page-3 %}
+ {% set last_vis = current_page+3 %}
+ {% if 1 == current_page %}<b>1</b>{% else %}
+ <a href ="?{{ query_string.replace(
+ 'p='~current_page,
+ 'p='~1) }}">
+ 1</a>{% endif %}
+ {% if first_vis > 1 %}...{% endif %}
+ {% for p in range(first_vis,last_vis+1) %}
+ {% if p > 1 and p < last_page and
+current_page !=p %}
+ <a href="?{{ query_string.replace(
+ 'p='~current_page,
+ 'p='~p) }}">
+ {{ p }}</a>
+ {% elif p > 1 and p < last_page %}
+ <b>{{ p }}</b>
+ {% endif %}
+ {% endfor %}
+ {% if last_vis < last_page %}...{% endif %}
+ {% if last_page != current_page %}
+ <a href ="?{{ query_string.replace(
+ 'p='~current_page,
+ 'p='~last_page) }}">
+ {{ last_page }}</a>
+ {% else %}<b>{{ last_page }}</b>
+ {% endif %}
+ </div>
+ {% endif %}
+ <table class="admin_panel processing">
+ <tr>
+ <th>{% trans %}ID{% endtrans %}</th>
+ <th>{% trans %}Username{% endtrans %}</th>
+ <th>{% trans %}When Joined{% endtrans %}</th>
+ <th>{% trans %}# of Comments Posted{% endtrans %}</th>
+ </tr>
+ {% for user in user_list %}
+ <tr>
+ <td>{{ user.id }}</td>
+ <td>
+ <a href="{{ request.urlgen('mediagoblin.moderation.users_detail',
+ user= user.username) }}">
+ {{ user.username }}
+ </a>
+ </td>
+ <td>{{ user.created.strftime("%F %R") }}</td>
+ <td>{{ user.posted_comments.count() }}</td>
+ </tr>
+ {% endfor %}
+ </table>
+{% else %}
+ <p><em>{% trans %}No users found.{% endtrans %}</em></p>
+{% endif %}
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index 529d89ef..15d53af1 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -27,23 +27,8 @@
{%- endblock mediagoblin_head %}
{% block mediagoblin_content %}
- {% if request.user %}
- <h1>{% trans %}Explore{% endtrans %}</h1>
- {% else %}
- <h1>{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}</h1>
- <img class="right_align" src="{{ request.staticdirect('/images/frontpage_image.png') }}" />
- <p>{% trans %}This site is running <a href="http://mediagoblin.org">MediaGoblin</a>, an extraordinarily great piece of media hosting software.{% endtrans %}</p>
- <p>{% trans %}To add your own media, place comments, and more, you can log in with your MediaGoblin account.{% endtrans %}</p>
- {% if allow_registration %}
- <p>{% trans %}Don't have one yet? It's easy!{% endtrans %}</p>
- {% trans register_url=request.urlgen('mediagoblin.auth.register') -%}
- <a class="button_action_highlight" href="{{ register_url }}">Create an account at this site</a>
- or
- <a class="button_action" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a>
- {%- endtrans %}
- {% endif %}
- <div class="clear"></div>
- {% endif %}
+ {% include "mediagoblin/bits/frontpage_welcome.html" %}
+
<h2>{% trans %}Most recent media{% endtrans %}</h2>
{{ object_gallery(request, media_entries, pagination) }}
diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html
index aa390f56..d335d742 100644
--- a/mediagoblin/templates/mediagoblin/submit/start.html
+++ b/mediagoblin/templates/mediagoblin/submit/start.html
@@ -19,6 +19,11 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/file_size.js') }}"></script>
+{% endblock %}
+
{% block title -%}
{% trans %}Add your media{% endtrans %} &mdash; {{ super() }}
{%- endblock %}
diff --git a/mediagoblin/templates/mediagoblin/terms_of_service.html b/mediagoblin/templates/mediagoblin/terms_of_service.html
new file mode 100644
index 00000000..610afd25
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/terms_of_service.html
@@ -0,0 +1,303 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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 title %}
+ Terms of Service
+{% endblock %}
+
+{% block mediagoblin_content -%}
+{# <h2>The gist</h2>
+# This is where you might insert your own particular rules, unique to your
+# own website. Or your own worded summary.
+#}
+
+<h2>Terms of Service</h2>
+
+<p>
+The following terms and conditions govern all use of the
+{{ app_config['html_title'] }} website and all content, services and products
+available at or through the website (taken together, the Website).
+"Operator" means the owners and operators of this website.
+The Website is offered subject to your acceptance without modification of all
+of the terms and conditions contained herein and all other operating rules,
+policies (including, without limitation, Operator’s Privacy Policy) and
+procedures that may be published from time to time on this Site by Operator
+(collectively, the “Agreement”).
+</p>
+
+<p>
+Please read this Agreement carefully before accessing or using the Website.
+By accessing or using any part of the web site, you agree to become bound by
+the terms and conditions of this agreement. If you do not agree to all the
+terms and conditions of this agreement, then you may not access the Website
+or use any services. If these terms and conditions are considered an offer by
+Operator, acceptance is expressly limited to these terms. The Website is
+available only to individuals who are at least 13 years old.
+</p>
+
+<ol id="code_of_conduct_list">
+ <li><strong>Your {{ app_config['html_title'] }} Account and Site.</strong>
+ If you create a notice stream on the Website, you are responsible for
+ maintaining the security of your account and notice stream, and you are
+ fully responsible for all activities that occur under the account and any
+ other actions taken in connection with the notice stream. You must not
+ describe or assign keywords to your notice stream in a misleading or
+ unlawful manner,
+ including in a manner intended to trade on the name or reputation of
+ others, and Operator may change or remove any description or keyword that
+ it considers inappropriate or unlawful, or otherwise likely to cause
+ Operator liability. You must immediately notify Operator of any
+ unauthorized uses of your notice stream, your account or any other breaches
+ of security. Operator will not be liable for any acts or omissions by You,
+ including any damages of any kind incurred as a result of such acts or
+ omissions.
+ </li>
+ <li><strong>Responsibility of Contributors.</strong> If you operate a notice
+ stream, comment on a notice stream, post material to the Website, post
+ links on the Website, or otherwise make
+ (or allow any third party to make) material
+ available by means of the Website (any such material, “Content”), You are
+ entirely responsible for the content of, and any harm resulting from, that
+ Content. That is the case regardless of whether the Content in question
+ constitutes text, graphics, an audio file, or computer software. By making
+ Content available, you represent and warrant that:
+ <ul class="nested_sublist">
+ <li>
+ the downloading, copying and use of the Content will not infringe
+ the proprietary rights, including but not limited to the copyright,
+ patent, trademark or trade secret rights, of any third party;
+ </li>
+ <li>
+ if your employer has rights to any copyrights, patents, or trademarks
+ you create, you have either (i) received permission from your employer
+ to post or make available the Content, including but not limited to any
+ software, or (ii) secured from your employer a waiver as to all rights
+ in or to the Content;
+ </li>
+ <li>
+ you have fully complied with any third-party licenses relating to the
+ Content, and have done all things necessary to successfully pass
+ through to end users any required terms;
+ </li>
+ <li>the Content does not contain or install any viruses, worms, malware,
+ Trojan horses or other harmful or destructive content;
+ </li>
+ <li>the Content is not spam, and does not contain unethical or unwanted
+ commercial content designed to drive traffic to third party sites or
+ boost the search engine rankings of third party sites, or to further
+ unlawful acts (such as phishing) or mislead recipients as to the
+ source of the material (such as spoofing);
+ </li>
+ <li>if the Content is machine- or randomly-generated, it is for purposes
+ of direct entertainment, information and/or utility for you or other
+ users, and not for spam,
+ </li>
+ <li>the Content is not libelous or defamatory (more info on what that
+ means), does not contain threats or incite violence towards individuals
+ or entities, and does not violate the privacy or publicity rights of
+ any third party;
+ </li>
+ <li>your notice stream is not getting advertised via unwanted electronic
+ messages such as spam links on newsgroups, email lists, other notice
+ streams and web sites, and similar unsolicited promotional methods;
+ </li>
+ <li>your notice stream is not named in a manner that misleads your
+ readers into thinking that you are another person or company. For
+ example, your notice stream’s URL or name is not the name of a person
+ other than yourself or company other than your own; and
+ </li>
+ <li>you have, in the case of Content that includes computer code,
+ accurately categorized and/or described the type, nature, uses and
+ effects of the materials, whether requested to do so by Operator or
+ otherwise.</li>
+ </ul>
+ By submitting Content to Operator for inclusion on your Website, you grant
+ Operator a world-wide, royalty-free, and non-exclusive license to
+ reproduce, modify, adapt and publish the Content solely for the purpose of
+ displaying, distributing and promoting your notice stream.
+ By submitting Content to Operator for inclusion on your Website, you grant
+ all readers the right to use, re-use, modify and/or re-distribute the
+ Content under the terms of the Creative Commons Attribution 3.0.
+ If you delete Content, Operator will use reasonable efforts to remove it
+ from the Website, but you acknowledge that caching or references to the
+ Content may not be made immediately unavailable.
+ Without limiting any of those representations or warranties, Operator has
+ the right (though not the obligation) to, in Operator’s sole discretion
+ (i) refuse or remove any content that, in Operator’s reasonable opinion,
+ violates any Operator policy or is in any way harmful or objectionable, or
+ (ii) terminate or deny access to and use of the Website to any individual
+ or entity for any reason, in Operator’s sole discretion.
+ </li>
+ <li><strong>Responsibility of Website Visitors.</strong> Operator has not
+ reviewed, and cannot
+ review, all of the material, including computer software, posted to the
+ Website, and cannot therefore be responsible for that material’s content,
+ use or effects. By operating the Website, Operator does not represent or
+ imply that it endorses the material there posted, or that it believes such
+ material to be accurate, useful or non-harmful. You are responsible for
+ taking precautions as necessary to protect yourself and your computer
+ systems from viruses, worms, Trojan horses, and other harmful or
+ destructive content. The Website may contain content that is offensive,
+ indecent, or otherwise objectionable, as well as content containing
+ technical inaccuracies, typographical mistakes, and other errors. The
+ Website may also contain material that violates the privacy or publicity
+ rights, or infringes the copyright, patent, trademark and other proprietary
+ rights, of third parties, or the downloading, copying or use of which is
+ subject to additional terms and conditions, stated or unstated. Operator
+ disclaims any responsibility for any harm resulting from the use by
+ visitors of the Website, or from any downloading by those visitors of
+ content there posted.
+ </li>
+ <li><strong>Content Posted on Other Websites.</strong> We have not reviewed,
+ and cannot
+ review, all of the material, including computer software, made available
+ through the websites and webpages to which {{ app_config['html_title'] }}
+ links, and that link to {{ app_config['html_title'] }}. Operator does not
+ have any control over those external websites and webpages, and is not
+ responsible for their contents or their use. By linking to a external
+ website or webpage, Operator does not represent or imply that it endorses
+ such website or webpage. You are responsible for taking precautions as
+ necessary to protect yourself and your computer systems from viruses,
+ worms, Trojan horses, and other harmful or destructive content. Operator
+ disclaims any responsibility for any harm resulting from your use of
+ external websites and webpages.
+ </li>
+ <li>
+ <strong>Copyright Infringement and DMCA Policy.</strong>
+ As Operator asks others to respect its copyrights and trademark rights,
+ it respects the copyright, patent, and trademark rights of others.
+ If you believe that material located on or linked to by
+ {{ app_config['html_title'] }} violates your copyright, you are encouraged
+ to notify Operator in accordance with Operator’s Digital Millennium
+ Copyright Act (”DMCA”) Policy. Operator will respond to all such notices,
+ including as required or appropriate by removing the infringing material or
+ disabling all links to the infringing material. In the case of a visitor who
+ may infringe or repeatedly infringes the copyrights or other trademark or
+ patent rights of Operator or others, Operator may, in its discretion,
+ terminate or deny access to and use of the Website. In the case of such
+ termination, Operator will have no obligation to provide a refund of any
+ amounts previously paid to Operator.</li>
+ <li>
+ <strong>Copyrights, patents, and trademarks.</strong>
+ This Agreement does not transfer from Operator to
+ you any Operator or third party copyrights, patents, or trademarks,
+ and all right, title and interest in and to such copyrights, patents,
+ and trademarks will remain (as between the
+ parties) solely with Operator. {{ app_config['html_title'] }}, the
+ {{ app_config['html_title'] }} logo, and all other trademarks, service
+ marks, graphics and logos used in connection with
+ {{ app_config['html_title'] }}, or the Website may be trademarks or
+ registered trademarks of Operator or Operator’s licensors. Other
+ trademarks, service marks, graphics and logos used in connection with the
+ Website may be the trademarks of other third parties. Your use of the
+ Website grants you no right or license to reproduce or otherwise use any
+ Operator or third-party trademarks.
+ </li>
+ <li><strong>Changes.</strong> Operator reserves the right, at its sole
+ discretion, to modify
+ or replace any part of this Agreement. It is your responsibility to check
+ this Agreement periodically for changes. Your continued use of or access
+ to the Website following the posting of any changes to this Agreement
+ constitutes acceptance of those changes. Operator may also, in the future,
+ offer new services and/or features through the Website (including, the
+ release of new tools and resources). Such new features and/or services
+ shall be subject to the terms and conditions of this Agreement.
+ </li>
+ <li><strong>Termination.</strong> Operator may terminate your access to all
+ or any part of
+ the Website at any time, with or without cause, with or without notice,
+ effective immediately. If you wish to terminate this Agreement or your
+ {{ app_config['html_title'] }} account (if you have one), you may simply
+ discontinue using the Website. All provisions of this Agreement which by
+ their nature should survive termination shall survive termination,
+ including, without limitation, ownership provisions, warranty disclaimers,
+ indemnity and limitations of liability.
+ </li>
+ <li><strong>Disclaimer of Warranties.</strong> The Website is provided
+ “as is”. Operator and
+ its suppliers and licensors hereby disclaim all warranties of any kind,
+ express or implied, including, without limitation, the warranties of
+ merchantability, fitness for a particular purpose and non-infringement.
+ Neither Operator nor its suppliers and licensors, makes any warranty that
+ the Website will be error free or that access thereto will be continuous
+ or uninterrupted. If you’re actually reading this, here’s a treat. You
+ understand that you download from, or otherwise obtain content or services
+ through, the Website at your own discretion and risk.
+ </li>
+ <li><strong>Limitation of Liability.</strong> In no event will Operator, or
+ its suppliers or
+ licensors, be liable with respect to any subject matter of this agreement
+ under any contract, negligence, strict liability or other legal or
+ equitable theory for: (i) any special, incidental or consequential damages;
+ (ii) the cost of procurement or substitute products or services; (iii) for
+ interruption of use or loss or corruption of data; or (iv) for any amounts
+ that exceed the fees paid by you to Operator under this agreement during
+ the twelve (12) month period prior to the cause of action. Operator shall
+ have no liability for any failure or delay due to matters beyond their
+ reasonable control. The foregoing shall not apply to the extent prohibited
+ by applicable law.
+ </li>
+ <li><strong>General Representation and Warranty.</strong> You represent and
+ warrant that (i)
+ your use of the Website will be in strict accordance with the Operator
+ Privacy Policy, with this Agreement and with all applicable laws and
+ regulations (including without limitation any local laws or regulations in
+ your country, state, city, or other governmental area, regarding online
+ conduct and acceptable content, and including all applicable laws regarding
+ the transmission of technical data exported from the United States or the
+ country in which you reside) and (ii) your use of the Website will not
+ infringe or misappropriate the copyrights, patents, and trademark rights of
+ any third party.
+ </li>
+ <li>
+ <strong>Indemnification.</strong>
+ You agree to indemnify and hold harmless Operator, its contractors, and its
+ licensors, and their respective directors, officers, employees and agents
+ from and against any and all claims and expenses, including attorneys’ fees,
+ arising out of your use of the Website, including but not limited to out of
+ your violation this Agreement.
+ </li>
+ <li><strong>Miscellaneous.</strong> This Agreement constitutes the entire
+ agreement between
+ Operator and you concerning the subject matter hereof, and they may only
+ be modified by a written amendment signed by an authorized executive of
+ Operator, or by the posting by Operator of a revised version. If any part
+ of this Agreement is held invalid or unenforceable, that part will be
+ construed to reflect the parties’ original intent, and the remaining
+ portions will remain in full force and effect. A waiver by either party of
+ any term or condition of this Agreement or any breach thereof, in any one
+ instance, will not waive such term or condition or any subsequent breach
+ thereof. You may assign your rights under this Agreement to any party that
+ consents to, and agrees to be bound by, its terms and conditions; Operator
+ may assign its rights under this Agreement without condition. This
+ Agreement will be binding upon and will inure to the benefit of the
+ parties, their successors and permitted assigns.
+ </li>
+</ol>
+
+<p>
+Originally published by Automattic, Inc. as the WordPress.com Terms of Service
+and made available by them under the Creative Commons Attribution-
+ShareAlike 3.0 License. Modifications to remove reference to "VIP services",
+rename "blog" to "notice stream", remove the choice-of-venue clause, and add
+variables specific to instances of this software made by Control Yourself, Inc.
+and made available under the terms of the same license.
+</p>
+
+{% endblock -%}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/blog_media.html b/mediagoblin/templates/mediagoblin/user_pages/blog_media.html
new file mode 100644
index 00000000..c6eedee0
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/user_pages/blog_media.html
@@ -0,0 +1,176 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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" %}
+
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{% from "mediagoblin/utils/pagination.html" import render_pagination %}
+
+{% block title %}{{ media.title }} &mdash; {{ super() }}{% endblock %}
+
+{% block mediagoblin_head %}
+<!--[if lte IE 8]><link rel="stylesheet"
+ href="{{ request.staticdirect('/extlib/leaflet/leaflet.ie.css') }}" /><![endif]-->
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/comment_show.js') }}"></script>
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/keyboard_navigation.js') }}"></script>
+
+ {% template_hook("media_head") %}
+{% endblock mediagoblin_head %}
+
+{% block mediagoblin_content %}
+ <p class="context">
+ {%- trans user_url=request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=media.get_uploader.username),
+ username=media.get_uploader.username -%}
+ ❖ Blog post by <a href="{{user_url}}">{{username}}</a>
+ {%- endtrans -%}
+ </p>
+ {% include "mediagoblin/utils/prev_next.html" %}
+ <div class="media_pane">
+ <div class="media_image_container">
+ {% block mediagoblin_media %}
+ {% set display_media = request.app.public_store.file_url(
+ media.get_display_media()[1]) %}
+ {# if there's a medium file size, that means the medium size
+ # isn't the original... so link to the original!
+ #}
+ {% if media.media_files.has_key('medium') %}
+ <a href="{{ request.app.public_store.file_url(
+ media.media_files['original']) }}">
+ <img class="media_image"
+ src="{{ display_media }}"
+ alt="{% trans media_title=media.title -%}
+ Image for {{ media_title }}{% endtrans %}" />
+ </a>
+ {% else %}
+ <img class="media_image"
+ src="{{ display_media }}"
+ alt="{% trans media_title=media.title -%}
+ Image for {{ media_title }}{% endtrans %}" />
+ {% endif %}
+ {% endblock %}
+ </div>
+ {% if request.user and
+ (media.uploader == request.user.id or
+ request.user.has_privilege('admin')) %}
+ {% set edit_url = request.urlgen('mediagoblin.media_types.blog.blogpost.edit',
+ blog_slug=media.media_manager.get_blog_by_blogpost().slug,
+ user=request.user.username, blog_post_slug=media.slug) %}
+ <a class="button_action" href="{{ edit_url }}">{% trans %}Edit{% endtrans %}</a>
+ {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete',
+ user= media.get_uploader.username,
+ media_id=media.id) %}
+ <a class="button_action" href="{{ delete_url }}">{% trans %}Delete{% endtrans %}</a>
+
+ {% endif %}
+ </br>
+ </br>
+ {% if comments %}
+ {% if app_config['allow_comments'] %}
+ <a
+ {% if not request.user %}
+ href="{{ request.urlgen('mediagoblin.auth.login') }}"
+ {% endif %}
+ class="button_action" id="button_addcomment" title="Add a comment">
+ {% trans %}Add a comment{% endtrans %}
+ </a>
+ {% include "mediagoblin/utils/comment-subscription.html" %}
+
+ {% endif %}
+ {% if request.user %}
+ <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
+ user= media.get_uploader.username,
+ media_id=media.id) }}" method="POST" id="form_comment">
+ {{ wtforms_util.render_divs(comment_form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
+ {{ csrf_token }}
+ </div>
+ </form>
+ {% endif %}
+ <ul style="list-style:none">
+ {% for comment in comments %}
+ {% set comment_author = comment.get_author %}
+ <li id="comment-{{ comment.id }}"
+ {%- if pagination.active_id == comment.id %}
+ class="comment_wrapper comment_active">
+ <a name="comment" id="comment"></a>
+ {%- else %}
+ class="comment_wrapper">
+ {%- endif %}
+ <div class="comment_author">
+ <img src="{{ request.staticdirect('/images/icon_comment.png') }}" />
+ <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
+ user=comment_author.username) }}"
+ class="comment_authorlink">
+ {{- comment_author.username -}}
+ </a>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
+ comment=comment.id,
+ user=media.get_uploader.username,
+ media=media.slug_or_id) }}#comment"
+ class="comment_whenlink">
+ <span title='{{- comment.created.strftime("%I:%M%p %Y-%m-%d") -}}'>
+ {%- trans formatted_time=timesince(comment.created) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span></a>:
+ </div>
+ <div class="comment_content">
+ {% autoescape False -%}
+ {{ comment.content_html }}
+ {%- endautoescape %}
+ </div>
+ </li>
+ {% endfor %}
+ </ul>
+ {{ render_pagination(request, pagination,
+ media.url_for_self(request.urlgen)) }}
+ {% endif %}
+ </div>
+ <div class="media_sidebar">
+ <h3>{% trans %}Added{% endtrans %}</h3>
+ <p><span title="{{ media.created.strftime("%I:%M%p %Y-%m-%d") }}">
+ {%- trans formatted_time=timesince(media.created) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span></p>
+
+ {% block mediagoblin_after_added_sidebar %}
+ {% endblock %}
+
+ {% if media.tags %}
+ {% include "mediagoblin/utils/tags.html" %}
+ {% endif %}
+
+ {% include "mediagoblin/utils/collections.html" %}
+
+ {% include "mediagoblin/utils/license.html" %}
+
+ {% include "mediagoblin/utils/exif.html" %}
+
+ {% template_hook("media_sideinfo") %}
+
+ {% block mediagoblin_sidebar %}
+ {% endblock %}
+
+ </div>
+ <div class="clear"></div>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/collection.html b/mediagoblin/templates/mediagoblin/user_pages/collection.html
index 5a7baadd..0f712c01 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/collection.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/collection.html
@@ -44,8 +44,8 @@
{{ collection_title }} by <a href="{{ user_url }}">{{ username }}</a>
{%- endtrans %}
</h1>
- {% if request.user and (collection.creator == request.user.id or
- request.user.is_admin) %}
+ {% if request.user and (collection.creator == request.user.id or
+ request.user.has_privilege('admin')) %}
{% set edit_url = request.urlgen('mediagoblin.edit.edit_collection',
user=collection.get_creator.username,
collection=collection.slug) %}
@@ -63,10 +63,10 @@
</p>
{{ collection_gallery(request, collection_items, pagination) }}
-
+
{% set feed_url = request.urlgen('mediagoblin.user_pages.collection_atom_feed',
- user=user.username,
+ user=user.username,
collection=collection.slug ) %}
{% include "mediagoblin/utils/feed_link.html" %}
-
-{% endblock %}
+
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html
index 2b790584..694eb979 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html
@@ -41,9 +41,10 @@
<div class="form_submit_buttons">
{# TODO: This isn't a button really... might do unexpected things :) #}
- <a class="button_action" href="{{ request.urlgen('mediagoblin.user_pages.user_collection',
- collection=collection.slug,
- user=request.user.username) }}">{% trans %}Cancel{% endtrans %}</a>
+ <a class="button_action" href="
+ {{- collection.url_for_self(request.urlgen) }}">
+ {%- trans %}Cancel{% endtrans -%}
+ </a>
<input type="submit" value="{% trans %}Delete permanently{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html b/mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html
index 449cc3ce..dc31d90f 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html
@@ -47,9 +47,10 @@
<div class="form_submit_buttons">
{# TODO: This isn't a button really... might do unexpected things :) #}
- <a class="button_action" href="{{ request.urlgen('mediagoblin.user_pages.user_collection',
- collection=collection_item.in_collection.slug,
- user=request.user.username) }}">{% trans %}Cancel{% endtrans %}</a>
+ <a class="button_action" href="
+ {{- collection_item.in_collection.url_for_self(request.urlgen) }}">
+ {%- trans %}Cancel{% endtrans -%}
+ </a>
<input type="submit" value="{% trans %}Remove{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/collection_list.html b/mediagoblin/templates/mediagoblin/user_pages/collection_list.html
index abf22623..4b449c76 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/collection_list.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/collection_list.html
@@ -15,7 +15,7 @@
# 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" %}
+{%- extends "mediagoblin/base.html" %}
{% block title %}
{%- trans username=user.username -%}
@@ -34,22 +34,22 @@
</h1>
{% if request.user %}
- {% if request.user.status == 'active' %}
+ {% if request.user.has_privilege('active') %}
<p>
<a href="{{ request.urlgen('mediagoblin.submit.collection',
user=user.username) }}">
{%- trans %}Create new collection{% endtrans -%}
+ </a>
</p>
{% endif %}
{% endif %}
<ul>
{% for coll in collections %}
- {% set coll_url = request.urlgen(
- 'mediagoblin.user_pages.user_collection',
- user=user.username,
- collection=coll.slug) %}
- <li><a href="{{ coll_url }}">{{ coll.title }}</li>
+ {%- set coll_url = coll.url_for_self(request.urlgen) %}
+ <li>
+ <a href="{{ coll_url }}">{{ coll.title }}</a>
+ </li>
{% endfor %}
</ul>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html
index 7dea3f09..81e5013e 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media.html
@@ -43,7 +43,7 @@
{%- endtrans -%}
</p>
{% include "mediagoblin/utils/prev_next.html" %}
- <div class="media_pane">
+ <div class="media_pane">
<div class="media_image_container">
{% block mediagoblin_media %}
{% set display_media = request.app.public_store.file_url(
@@ -71,8 +71,8 @@
{{ media.title }}
</h2>
{% if request.user and
- (media.uploader == request.user.id or
- request.user.is_admin) %}
+ (media.uploader == request.user.id or
+ request.user.has_privilege('admin')) %}
{% set edit_url = request.urlgen('mediagoblin.edit.edit_media',
user= media.get_uploader.username,
media_id=media.id) %}
@@ -81,20 +81,26 @@
user= media.get_uploader.username,
media_id=media.id) %}
<a class="button_action" href="{{ delete_url }}">{% trans %}Delete{% endtrans %}</a>
+
{% endif %}
{% autoescape False %}
<p>{{ media.description_html }}</p>
{% endautoescape %}
- {% if comments %}
- <a
- {% if not request.user %}
- href="{{ request.urlgen('mediagoblin.auth.login') }}"
- {% endif %}
- class="button_action" id="button_addcomment" title="Add a comment">
- {% trans %}Add a comment{% endtrans %}
- </a>
+ {% if comments and request.user and request.user.has_privilege('commenter') %}
+ {% if app_config['allow_comments'] %}
+ <a
+ {% if not request.user %}
+ href="{{ request.urlgen('mediagoblin.auth.login') }}?next={{
+ request.base_url|urlencode }}"
+ {% endif %}
+ class="button_action" id="button_addcomment" title="Add a comment">
+ {% trans %}Add a comment{% endtrans %}
+ </a>
+ {% include "mediagoblin/utils/comment-subscription.html" %}
+
+ {% endif %}
{% if request.user %}
- <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
+ <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
user= media.get_uploader.username,
media_id=media.id) }}" method="POST" id="form_comment">
{{ wtforms_util.render_divs(comment_form) }}
@@ -102,7 +108,10 @@
<input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
{{ csrf_token }}
</div>
+ <input type="hidden" value="{{ request.urlgen('mediagoblin.user_pages.media_preview_comment') }}" id="previewURL" />
+ <input type="hidden" value="{% trans %}Comment Preview{% endtrans %}" id="previewText"/>
</form>
+ <div id="comment_preview"></div>
{% endif %}
<ul style="list-style:none">
{% for comment in comments %}
@@ -137,6 +146,15 @@
{{ comment.content_html }}
{%- endautoescape %}
</div>
+ <div>
+ {% if app_config.allow_reporting %}
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.report_comment',
+ user=media.get_uploader.username,
+ media=media.slug_or_id,
+ comment=comment.id) }}">
+ {% trans %}Report{% endtrans %}</a>
+ {% endif %}
+ </div>
</li>
{% endfor %}
</ul>
@@ -145,22 +163,30 @@
{% endif %}
</div>
<div class="media_sidebar">
- <h3>Added</h3>
+ <h3>{% trans %}Added{% endtrans %}</h3>
<p><span title="{{ media.created.strftime("%I:%M%p %Y-%m-%d") }}">
- {%- trans formatted_time=timesince(media.created) -%}
+ {%- trans formatted_time=timesince(media.created) -%}
{{ formatted_time }} ago
{%- endtrans -%}
</span></p>
+
+ {% block mediagoblin_after_added_sidebar %}
+ {% endblock %}
+
{% if media.tags %}
{% include "mediagoblin/utils/tags.html" %}
{% endif %}
{% include "mediagoblin/utils/collections.html" %}
+ {% if app_config.allow_reporting %}
+ {% include "mediagoblin/utils/report.html" %}
+ {% endif %}
+
{% include "mediagoblin/utils/license.html" %}
{% include "mediagoblin/utils/exif.html" %}
-
+
{%- if media.attachment_files|count %}
<h3>{% trans %}Attachments{% endtrans %}</h3>
<ul>
@@ -176,7 +202,7 @@
{%- if app_config['allow_attachments']
and request.user
and (media.uploader == request.user.id
- or request.user.is_admin) %}
+ or request.user.has_privilege('admin')) %}
{%- if not media.attachment_files|count %}
<h3>{% trans %}Attachments{% endtrans %}</h3>
{%- endif %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/report.html b/mediagoblin/templates/mediagoblin/user_pages/report.html
new file mode 100644
index 00000000..ce0fb1bc
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/user_pages/report.html
@@ -0,0 +1,83 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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" %}
+{%- import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{%- block mediagoblin_content -%}
+{% trans %}<h2>File a Report</h2>{% endtrans %}
+<form action="" method=POST >
+ {% if comment is defined %}
+ <h3>{% trans %}Reporting this Comment{% endtrans %}</h3>
+ {%- set comment_author = comment.get_author %}
+ {%- set comment_author_url = request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=comment_author.username) %}
+ {%- set comment_url = request.urlgen(
+ 'mediagoblin.user_pages.media_home.view_comment',
+ comment=comment.id,
+ user=media.get_uploader.username,
+ media=media.slug_or_id) %}
+ <div id="comment-{{ comment.id }}"
+ class="comment_wrapper">
+ <div class="comment_author">
+ <img
+ src="{{ request.staticdirect('/images/icon_comment.png') }}" />
+ <a href="{{ comment_author_url }}"
+ class="comment_authorlink">
+ {{- comment_author.username -}}
+ </a>
+ <a href="{{ comment_url }}"
+ class="comment_whenlink">
+ <span
+ title='{{- comment.created.strftime("%I:%M%p %Y-%m-%d") -}}'>
+
+ {%- trans formatted_time=timesince(comment.created) -%}
+ {{ formatted_time }} ago
+ {%- endtrans -%}
+ </span></a>:
+ </div>
+ <div class="comment_content">
+ {% autoescape False -%}
+ {{ comment.content_html }}
+ {%- endautoescape %}
+ </div>
+ </div>
+ {% elif media is defined %}
+ <h3>{% trans %}Reporting this Media Entry{% endtrans %}</h3>
+ <div class="media_thumbnail">
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home',
+ user=media.get_uploader.username,
+ media=media.slug_or_id) }}">
+ <img src="{{ media.thumb_url }}"/></a>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home',
+ user=media.get_uploader.username,
+ media=media.slug_or_id) }}"
+ class=thumb_entry_title>{{ media.title }}</a>
+ </div>
+ <div class=clear></div>
+ {%- trans user_url = request.urlgen('mediagoblin.user_pages.user_home', user=media.get_uploader.username),
+ username = media.get_uploader.username %}
+ ❖ Published by <a href="{{ user_url }}"
+ class="comment_authorlink">{{ username }}</a>
+ {% endtrans %}
+ {%- endif %}
+
+ {{- wtforms_util.render_divs(form) }}
+ {{ csrf_token }}
+ <input type=submit value="{% trans %}File Report {% endtrans %}" />
+</form>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html
index 71acd66c..14a67431 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/user.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/user.html
@@ -14,6 +14,9 @@
#
# 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/>.
+#
+
+# This is the main user homepage for active users
#}
{% extends "mediagoblin/base.html" %}
@@ -38,134 +41,87 @@
{% block mediagoblin_content -%}
- {# If no user... #}
- {% if not user %}
- <p>{% trans %}Sorry, no such user found.{% endtrans %}</p>
-
- {# User exists, but needs verification #}
- {% elif user.status == "needs_email_verification" %}
- {% if user == request.user %}
- {# this should only be visible when you are this user #}
- <div class="form_box">
- <h1>{% trans %}Email verification needed{% endtrans %}</h1>
+ <h1>
+ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%}
+ </h1>
+ {% if not user.url and not user.bio %}
+ {% if request.user and (request.user.id == user.id) %}
+ <div class="profile_sidebar empty_space">
<p>
- {% trans -%}
- Almost done! Your account still needs to be activated.
- {%- endtrans %}
- </p>
- <p>
- {% trans -%}
- An email should arrive in a few moments with instructions on how to do so.
- {%- endtrans %}
+ {% trans %}Here's a spot to tell others about yourself.{% endtrans %}
</p>
- <p>{% trans %}In case it doesn't:{% endtrans %}</p>
-
- <a href="{{ request.urlgen('mediagoblin.auth.resend_verification') }}"
- class="button_action_highlight">{% trans %}Resend verification email{% endtrans %}</a>
- </div>
+ <a href="{{ request.urlgen('mediagoblin.edit.profile',
+ user=user.username) }}" class="button_action">
+ {%- trans %}Edit profile{% endtrans -%}
+ </a>
{% else %}
- {# if the user is not you, but still needs to verify their email #}
- <div class="form_box">
- <h1>{% trans %}Email verification needed{% endtrans %}</h1>
-
+ <div class="profile_sidebar empty_space">
<p>
{% trans -%}
- Someone has registered an account with this username, but it still has to be activated.
- {%- endtrans %}
- </p>
-
- <p>
- {% trans login_url=request.urlgen('mediagoblin.auth.login') -%}
- If you are that person but you've lost your verification email, you can <a href="{{ login_url }}">log in</a> and resend it.
+ This user hasn't filled in their profile (yet).
{%- endtrans %}
</p>
- </div>
{% endif %}
-
- {# Active(?) (or at least verified at some point) user, horray! #}
{% else %}
- <h1>
- {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%}
- </h1>
-
- {% if not user.url and not user.bio %}
- {% if request.user and (request.user.id == user.id) %}
- <div class="profile_sidebar empty_space">
- <p>
- {% trans %}Here's a spot to tell others about yourself.{% endtrans %}
- </p>
- <a href="{{ request.urlgen('mediagoblin.edit.profile',
- user=user.username) }}" class="button_action">
- {%- trans %}Edit profile{% endtrans -%}
- </a>
- {% else %}
- <div class="profile_sidebar empty_space">
- <p>
- {% trans -%}
- This user hasn't filled in their profile (yet).
- {%- endtrans %}
- </p>
+ <div class="profile_sidebar">
+ {% include "mediagoblin/utils/profile.html" %}
+ {% if request.user and
+ (request.user.id == user.id or request.user.has_privilege('admin')) %}
+ <a href="{{ request.urlgen('mediagoblin.edit.profile',
+ user=user.username) }}">
+ {%- trans %}Edit profile{% endtrans -%}
+ </a>
{% endif %}
- {% else %}
- <div class="profile_sidebar">
- {% include "mediagoblin/utils/profile.html" %}
- {% if request.user and
- (request.user.id == user.id or request.user.is_admin) %}
- <a href="{{ request.urlgen('mediagoblin.edit.profile',
- user=user.username) }}">
- {%- trans %}Edit profile{% endtrans -%}
- </a>
- {% endif %}
- {% endif %}
+ {% endif %}
+ <p>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.collection_list',
+ user=user.username) }}">
+ {%- trans %}Browse collections{% endtrans -%}
+ </a>
+ </p>
+ </div>
+
+ {% if media_entries.count() %}
+ <div class="profile_showcase">
+ {{ object_gallery(request, media_entries, pagination,
+ pagination_base_url=user_gallery_url, col_number=3) }}
+ {% include "mediagoblin/utils/object_gallery.html" %}
+ <div class="clear"></div>
<p>
- <a href="{{ request.urlgen('mediagoblin.user_pages.collection_list',
- user=user.username) }}">
- {%- trans %}Browse collections{% endtrans -%}
+ <a href="{{ user_gallery_url }}">
+ {% trans username=user.username -%}
+ View all of {{ username }}'s media{% endtrans -%}
</a>
</p>
+ {% set feed_url = request.urlgen(
+ 'mediagoblin.user_pages.atom_feed',
+ user=user.username) %}
+ {% include "mediagoblin/utils/feed_link.html" %}
</div>
-
- {% if media_entries.count() %}
- <div class="profile_showcase">
- {{ object_gallery(request, media_entries, pagination,
- pagination_base_url=user_gallery_url, col_number=3) }}
- {% include "mediagoblin/utils/object_gallery.html" %}
- <div class="clear"></div>
+ {% else %}
+ {% if request.user and (request.user.id == user.id) %}
+ <div class="profile_showcase empty_space">
<p>
- <a href="{{ user_gallery_url }}">
- {% trans username=user.username -%}
- View all of {{ username }}'s media{% endtrans -%}
- </a>
+ {% trans -%}
+ This is where your media will appear, but you don't seem to have added anything yet.
+ {%- endtrans %}
</p>
- {% set feed_url = request.urlgen(
- 'mediagoblin.user_pages.atom_feed',
- user=user.username) %}
- {% include "mediagoblin/utils/feed_link.html" %}
+ <a class="button_action"
+ href="{{ request.urlgen('mediagoblin.submit.start') }}">
+ {%- trans %}Add media{% endtrans -%}
+ </a>
</div>
{% else %}
- {% if request.user and (request.user.id == user.id) %}
- <div class="profile_showcase empty_space">
- <p>
- {% trans -%}
- This is where your media will appear, but you don't seem to have added anything yet.
- {%- endtrans %}
- </p>
- <a class="button_action"
- href="{{ request.urlgen('mediagoblin.submit.start') }}">
- {%- trans %}Add media{% endtrans -%}
- </a>
- </div>
- {% else %}
- <div class="profile_showcase empty_space">
- <p>
- {% trans -%}
- There doesn't seem to be any media here yet...
- {%- endtrans %}
- </p>
- </div>
- {% endif %}
+ <div class="profile_showcase empty_space">
+ <p>
+ {% trans -%}
+ There doesn't seem to be any media here yet...
+ {%- endtrans %}
+ </p>
+ </div>
{% endif %}
- <div class="clear"></div>
{% endif %}
+ {% template_hook("user_profile") %}
+ <div class="clear"></div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user_nonactive.html b/mediagoblin/templates/mediagoblin/user_pages/user_nonactive.html
new file mode 100644
index 00000000..6c9b5b8c
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/user_pages/user_nonactive.html
@@ -0,0 +1,81 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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/>.
+
+# This is the main user homepage for non-active users that still need
+# registration etc.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% block title %}
+ {%- if user -%}
+ {%- trans username=user.username -%}
+ {{ username }}'s profile
+ {%- endtrans %} &mdash; {{ super() }}
+ {%- else -%}
+ {{ super() }}
+ {%- endif -%}
+{% endblock %}
+
+
+{% block mediagoblin_content -%}
+ {# User exists, but needs verification #}
+ {% if not user.has_privilege('active') %}
+ {% if user == request.user %}
+ {# this should only be visible when you are this user #}
+ <div class="form_box">
+ <h1>{% trans %}Email verification needed{% endtrans %}</h1>
+
+ <p>
+ {% trans -%}
+ Almost done! Your account still needs to be activated.
+ {%- endtrans %}
+ </p>
+ <p>
+ {% trans -%}
+ An email should arrive in a few moments with instructions on how to do so.
+ {%- endtrans %}
+ </p>
+ <p>{% trans %}In case it doesn't:{% endtrans %}</p>
+
+ <a href="{{ request.urlgen('mediagoblin.auth.resend_verification') }}"
+ class="button_action_highlight">{% trans %}Resend verification email{% endtrans %}</a>
+ </div>
+ {% else %}
+ {# if the user is not you, but still needs to verify their email #}
+ <div class="form_box">
+ <h1>{% trans %}Email verification needed{% endtrans %}</h1>
+
+ <p>
+ {% trans -%}
+ Someone has registered an account with this username, but it still has to be activated.
+ {%- endtrans %}
+ </p>
+ <p>
+ {% trans login_url=request.urlgen('mediagoblin.auth.login') -%}
+ If you are that person but you've lost your verification email, you can <a href="{{ login_url }}">log in</a> and resend it.
+ {%- endtrans %}
+ </p>
+ </div>
+ {% endif %}
+
+ {# Active(?) (or at least verified at some point) user, horray! #}
+ {% else %}
+ <h1>{{ username }}</h1>
+ <p>{{ username }} is not active.</p>
+ <div class="clear"></div>
+ {% endif %}
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/utils/collection_gallery.html b/mediagoblin/templates/mediagoblin/utils/collection_gallery.html
index dcc59244..dfe2ebe2 100644
--- a/mediagoblin/templates/mediagoblin/utils/collection_gallery.html
+++ b/mediagoblin/templates/mediagoblin/utils/collection_gallery.html
@@ -38,8 +38,8 @@
<a href="{{ entry_url }}">{{ item.note }}</a>
{% endif %}
{% if request.user and
- (item.in_collection.creator == request.user.id or
- request.user.is_admin) %}
+ (item.in_collection.creator == request.user.id or
+ request.user.has_privilege('admin')) %}
{%- set remove_url=request.urlgen(
'mediagoblin.user_pages.collection_item_confirm_remove',
user=item.in_collection.get_creator.username,
diff --git a/mediagoblin/templates/mediagoblin/utils/comment-subscription.html b/mediagoblin/templates/mediagoblin/utils/comment-subscription.html
new file mode 100644
index 00000000..75da5e89
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/utils/comment-subscription.html
@@ -0,0 +1,33 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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/>.
+#}
+{%- if request.user %}
+ {% set subscription = get_comment_subscription(request.user.id, media.id) %}
+ {% if not subscription or not subscription.notify %}
+ <a type="submit" href="{{ request.urlgen('mediagoblin.notifications.subscribe_comments',
+ user=media.get_uploader.username,
+ media=media.slug_or_id)}}"
+ class="button_action">Subscribe to comments
+ </a>
+ {% else %}
+ <a type="submit" href="{{ request.urlgen('mediagoblin.notifications.silence_comments',
+ user=media.get_uploader.username,
+ media=media.slug_or_id)}}"
+ class="button_action">Silence comments
+ </a>
+ {% endif %}
+{%- endif %}
diff --git a/mediagoblin/templates/mediagoblin/utils/exif.html b/mediagoblin/templates/mediagoblin/utils/exif.html
index a89e69c8..b62208e1 100644
--- a/mediagoblin/templates/mediagoblin/utils/exif.html
+++ b/mediagoblin/templates/mediagoblin/utils/exif.html
@@ -17,18 +17,51 @@
#}
{% block exif_content %}
+<noscript>
+ <style type="text/css">
+ #exif_additional_info {
+ display: block;
+ }
+ </style>
+</noscript>
+<div id="exif_content">
{% if app_config['exif_visible']
and media.media_data
and media.media_data.exif_all is defined
and media.media_data.exif_all %}
- <h3>EXIF</h3>
- <table>
+ <h3>Camera Information</h3>
+ <table id="exif_camera_information">
+ <tbody>
+ {% for label, value in media.exif_display_data_short().iteritems() %}
+ <tr>
+ <td class="col1">{{ label }}</td>
+ <td>{{ value }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ <h3 id="exif_additional_info_button" class="button_action">
+ Additional Information
+ </h3>
+ <div id="exif_additional_info">
+ <table class="exif_info">
{% for key, tag in media.exif_display_iter() %}
<tr>
- <td>{{ key }}</td>
+ <td class="col1">{{ key }}</td>
<td>{{ tag.printable }}</td>
</tr>
{% endfor %}
</table>
+ </div>
{% endif %}
+<script type="text/javascript">
+$(document).ready(function(){
+
+$("#exif_additional_info_button").click(function(){
+ $("#exif_additional_info").slideToggle("slow");
+});
+
+});
+</script>
+</div> <!-- end exif_content div -->
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/utils/report.html b/mediagoblin/templates/mediagoblin/utils/report.html
new file mode 100644
index 00000000..3829de97
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/utils/report.html
@@ -0,0 +1,28 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# 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/>.
+#}
+
+{% block report_content -%}
+ <p>
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.report_media',
+ user=media.get_uploader.username,
+ media=media.slug_or_id) }}"
+ class="button_action" id="button_reportmedia" title="Report media">
+ {% trans %}Report media{% endtrans %}
+ </a>
+ </p>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html
index be6976c2..e079274e 100644
--- a/mediagoblin/templates/mediagoblin/utils/wtforms.html
+++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html
@@ -33,25 +33,37 @@
{%- endmacro %}
{# Generically render a field #}
-{% macro render_field_div(field) %}
- {{- render_label_p(field) }}
- <div class="form_field_input">
- {{ field }}
- {%- if field.errors -%}
- {% for error in field.errors %}
- <p class="form_field_error">{{ error }}</p>
- {% endfor %}
- {%- endif %}
- {%- if field.description %}
- <p class="form_field_description">{{ field.description|safe }}</p>
- {%- endif %}
- </div>
+{% macro render_field_div(field, autofocus_first=False) %}
+ {% if field.type == 'BooleanField' %}
+ {{ render_bool(field) }}
+ {% else %}
+ {{- render_label_p(field) }}
+ <div class="form_field_input">
+ {% if autofocus_first %}
+ {{ field(autofocus=True) }}
+ {% else %}
+ {{ field }}
+ {% endif %}
+ {%- if field.errors -%}
+ {% for error in field.errors %}
+ <p class="form_field_error">{{ error }}</p>
+ {% endfor %}
+ {%- endif %}
+ {%- if field.description %}
+ <p class="form_field_description">{{ field.description|safe }}</p>
+ {%- endif %}
+ </div>
+ {% endif %}
{%- endmacro %}
{# Auto-render a form as a series of divs #}
-{% macro render_divs(form) -%}
+{% macro render_divs(form, autofocus_first=False) -%}
{% for field in form %}
- {{ render_field_div(field) }}
+ {% if autofocus_first and loop.first %}
+ {{ render_field_div(field, True) }}
+ {% else %}
+ {{ render_field_div(field) }}
+ {% endif %}
{% endfor %}
{%- endmacro %}
@@ -74,3 +86,19 @@
</tr>
{% endfor %}
{%- endmacro %}
+
+{# Render a boolean field #}
+{% macro render_bool(field) %}
+ <div class="boolean">
+ <label for="{{ field.label.field_id }}">
+ {{ field }}</input>
+ {{ field.description|safe }}
+ </label>
+ {%- if field.errors -%}
+ {% for error in field.errors %}
+ <p class="form_field_error">{{ error }}</p>
+ {% endfor %}
+ {% endif %}
+ </div>
+{% endmacro %}
+