Automated merge with ssh://openslides.de/openslides
This commit is contained in:
commit
e9299625ae
@ -31,6 +31,8 @@ from agenda.api import is_summary
|
||||
class Item(MPTTModel, Slide):
|
||||
"""
|
||||
An Agenda Item
|
||||
|
||||
MPTT-model. See http://django-mptt.github.com/django-mptt/
|
||||
"""
|
||||
prefix = 'item'
|
||||
|
||||
|
@ -50,21 +50,37 @@
|
||||
|
||||
<div style="text-align: right; padding: 0 5px 5px 0; margin-top:-20px;">
|
||||
<!-- countdown -->
|
||||
<input type="checkbox" name="countdown" onchange="document.location='{% if countdown_visible == "True" %}{% url countdown_close %}{% else %}{% url countdown_open %}{% endif %}'"
|
||||
{% if countdown_visible == "True" %}checked{% endif %}>
|
||||
{% trans "Countdown" %} (<a href="{% url config_agenda %}">{{countdown_time}}{% trans "sec" %}</a>){% if countdown_visible == "True" %}:
|
||||
<a class="projector_countdown" href="{% url countdown_reset countdown_time %}" title="{% trans 'Reset countdown' %}"><img src="/static/images/icons/media-skip-backward.png"></a>
|
||||
<a class="projector_countdown" href="{% url countdown_start %}" title="{% trans 'Start countdown' %}"><img src="/static/images/icons/media-playback-start.png"></a>
|
||||
<a class="projector_countdown" href="{% url countdown_stop %}" title="{% trans 'Stop countdown' %}"><img src="/static/images/icons/media-playback-pause.png"></a>
|
||||
<input type="checkbox" name="countdown" onchange="document.location='{% if countdown_visible %}{% url countdown_close %}{% else %}{% url countdown_open %}{% endif %}'"{% if countdown_visible %} checked{% endif %}>
|
||||
{% trans "Countdown" %} (<a href="{% url config_agenda %}">{{countdown_time}}{% trans "sec" %}</a>)
|
||||
{% if countdown_visible == "True" %}:
|
||||
<a class="projector_countdown" href="{% url countdown_reset countdown_time %}" title="{% trans 'Reset countdown' %}">
|
||||
<img src="/static/images/icons/media-skip-backward.png" />
|
||||
</a>
|
||||
<a class="projector_countdown" href="{% url countdown_start %}" title="{% trans 'Start countdown' %}">
|
||||
<img src="/static/images/icons/media-playback-start.png" />
|
||||
</a>
|
||||
<a class="projector_countdown" href="{% url countdown_stop %}" title="{% trans 'Stop countdown' %}">
|
||||
<img src="/static/images/icons/media-playback-pause.png" />
|
||||
</a>
|
||||
{% endif %}
|
||||
<p></p>
|
||||
<!-- projector control -->
|
||||
{% trans "Adjust projector view" %}:
|
||||
<a class="projector_edit" href="{% url projector_bigger %}" title="{% trans 'Zoom in' %}"><img src="/static/images/icons/zoom-in.png"></a>
|
||||
<a class="projector_edit" href="{% url projector_smaller %}" title="{% trans 'Zoom out' %}"><img src="/static/images/icons/zoom-out.png"></a>
|
||||
<a class="projector_edit" href="{% url projector_up %}" title="{% trans 'Scroll text up' %}"><img src="/static/images/icons/go-up.png"></a>
|
||||
<a class="projector_edit" href="{% url projector_down %}" title="{% trans 'Scroll text down' %}"><img src="/static/images/icons/go-down.png"></a>
|
||||
<a class="projector_edit" href="{% url projector_clean %}" title="{% trans 'Reset projector view' %}"><img src="/static/images/icons/view-restore.png"></a>
|
||||
<a class="projector_edit" href="{% url projector_bigger %}" title="{% trans 'Zoom in' %}">
|
||||
<img src="/static/images/icons/zoom-in.png" />
|
||||
</a>
|
||||
<a class="projector_edit" href="{% url projector_smaller %}" title="{% trans 'Zoom out' %}">
|
||||
<img src="/static/images/icons/zoom-out.png" />
|
||||
</a>
|
||||
<a class="projector_edit" href="{% url projector_up %}" title="{% trans 'Scroll text up' %}">
|
||||
<img src="/static/images/icons/go-up.png" />
|
||||
</a>
|
||||
<a class="projector_edit" href="{% url projector_down %}" title="{% trans 'Scroll text down' %}">
|
||||
<img src="/static/images/icons/go-down.png" />
|
||||
</a>
|
||||
<a class="projector_edit" href="{% url projector_clean %}" title="{% trans 'Reset projector view' %}">
|
||||
<img src="/static/images/icons/view-restore.png" />
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@ -91,8 +107,11 @@
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
<td><b>{% trans "Agenda" %} ({{ items|length }} {% trans "items" %}<span id="hiddencount"></span>)</b></td>
|
||||
<td><span id="action_field" style="width: 1px;white-space: nowrap;">
|
||||
<td>
|
||||
<b>{% trans "Agenda" %} ({{ items|length }} {% trans "items" %}<span id="hiddencount"></span>)</b>
|
||||
</td>
|
||||
<td>
|
||||
<span id="action_field" style="width: 1px;white-space: nowrap;">
|
||||
<span></span>
|
||||
<a href="{% url print_agenda %}" title="{%trans 'Print agenda' %}"><img src="/static/images/icons/application-pdf.png"></a>
|
||||
</span>
|
||||
@ -157,7 +176,6 @@
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
</form>
|
||||
{% else %}
|
||||
<i>{% trans "No items available." %}</i>
|
||||
|
@ -1,5 +1,9 @@
|
||||
{% extends "base-projector.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ block.super }} - {{ item.title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% if item.text %}
|
||||
<h1>{{ item.title }}</h1>
|
||||
|
@ -11,7 +11,7 @@
|
||||
"""
|
||||
|
||||
from django.conf.urls.defaults import *
|
||||
from agenda.views import Overview, View, SetActive, SetClosed, ItemUpdate, ItemCreate, ItemDelete
|
||||
from agenda.views import Overview, View, SetActive, SetClosed, ItemUpdate, ItemCreate, ItemDelete, ItemPDF
|
||||
|
||||
urlpatterns = patterns('agenda.views',
|
||||
url(r'^$',
|
||||
@ -64,7 +64,7 @@ urlpatterns = patterns('agenda.views',
|
||||
),
|
||||
|
||||
url(r'^print/$',
|
||||
'print_agenda',
|
||||
ItemPDF.as_view(),
|
||||
name='print_agenda',
|
||||
),
|
||||
)
|
||||
|
@ -9,14 +9,16 @@
|
||||
:copyright: 2011 by the OpenSlides team, see AUTHORS.
|
||||
:license: GNU GPL, see LICENSE for more details.
|
||||
"""
|
||||
from reportlab.platypus import Paragraph
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.contrib import messages
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.context_processors import csrf
|
||||
from django.views.generic.detail import SingleObjectMixin
|
||||
|
||||
from utils.pdf import print_agenda
|
||||
from utils.views import TemplateView, RedirectView, UpdateView, CreateView, DeleteView
|
||||
from utils.pdf import stylesheet
|
||||
from utils.views import TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView
|
||||
|
||||
from system import config
|
||||
|
||||
@ -181,3 +183,17 @@ class ItemDelete(DeleteView):
|
||||
self.gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % name, object.get_absolute_url('delete'), False)
|
||||
else:
|
||||
self.gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % name, object.get_absolute_url('delete'), True)
|
||||
|
||||
|
||||
class ItemPDF(PDFView):
|
||||
permission_required = 'agenda.can_see_agenda'
|
||||
filename = _('Agenda')
|
||||
|
||||
def append_to_pdf(self, story):
|
||||
for item in Item.objects.all():
|
||||
ancestors = item.get_ancestors()
|
||||
if ancestors:
|
||||
space = " " * ancestors.count()
|
||||
story.append(Paragraph("%s%s" % (space, item.title), stylesheet['Subitem']))
|
||||
else:
|
||||
story.append(Paragraph(item.title, stylesheet['Item']))
|
||||
|
@ -1,9 +1,10 @@
|
||||
{% load tags %}
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
{% load tags %}
|
||||
<head>
|
||||
<head>
|
||||
<link type="text/css" rel="stylesheet" href="/static/styles/projector.css">
|
||||
<link rel="shortcut icon" href="/static/images/favicon.png" type="image/png" />
|
||||
<script type="text/javascript" src="/static/javascript/jquery.js"></script>
|
||||
@ -11,8 +12,8 @@
|
||||
<title>{% block title %} {% get_config 'event_name' %} {% endblock %}</title>
|
||||
{% block header %}
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div id="config" style="display:none;">
|
||||
<div id="ajax">{{ ajax }}</div>
|
||||
</div>
|
||||
@ -34,5 +35,5 @@
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -16,33 +16,33 @@ urlpatterns = patterns('projector.views',
|
||||
url(r'^$', 'active_slide',
|
||||
name='projector_show'),
|
||||
|
||||
url(r'^bigger$', 'projector_edit', {'direction': 'bigger'},
|
||||
url(r'^bigger/$', 'projector_edit', {'direction': 'bigger'},
|
||||
name='projector_bigger'),
|
||||
|
||||
url(r'^smaller$', 'projector_edit', {'direction': 'smaller'},
|
||||
url(r'^smaller/$', 'projector_edit', {'direction': 'smaller'},
|
||||
name='projector_smaller'),
|
||||
|
||||
url(r'^up$', 'projector_edit', {'direction': 'up'},
|
||||
url(r'^up/$', 'projector_edit', {'direction': 'up'},
|
||||
name='projector_up'),
|
||||
|
||||
url(r'^projector/down$', 'projector_edit', {'direction': 'down'},
|
||||
url(r'^down/$', 'projector_edit', {'direction': 'down'},
|
||||
name='projector_down'),
|
||||
|
||||
url(r'^projector/clean$', 'projector_edit', {'direction': 'clean'},
|
||||
url(r'^clean/$', 'projector_edit', {'direction': 'clean'},
|
||||
name='projector_clean'),
|
||||
|
||||
url(r'^projector/countdown/show$', 'projector_countdown', {'command': 'show'},
|
||||
url(r'^countdown/show/$', 'projector_countdown', {'command': 'show'},
|
||||
name='countdown_open'),
|
||||
|
||||
url(r'^projector/countdown/hide$', 'projector_countdown', {'command': 'hide'},
|
||||
url(r'^countdown/hide/$', 'projector_countdown', {'command': 'hide'},
|
||||
name='countdown_close'),
|
||||
|
||||
url(r'^projector/countdown/reset/(?P<time>\d+)$', 'projector_countdown', {'command': 'reset'},
|
||||
url(r'^countdown/reset/(?P<time>\d+)/$', 'projector_countdown', {'command': 'reset'},
|
||||
name='countdown_reset'),
|
||||
|
||||
url(r'^projector/countdown/start$', 'projector_countdown', {'command': 'start'},
|
||||
url(r'^countdown/start/$', 'projector_countdown', {'command': 'start'},
|
||||
name='countdown_start'),
|
||||
|
||||
url(r'^projector/countdown/stop$', 'projector_countdown', {'command': 'stop'},
|
||||
url(r'^countdown/stop/$', 'projector_countdown', {'command': 'stop'},
|
||||
name='countdown_stop'),
|
||||
)
|
||||
|
@ -2,7 +2,7 @@ function presentation_reload() {
|
||||
if ($('#config > #ajax').html() == 'on') {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: '/projector',
|
||||
url: '/projector/',
|
||||
dataType: 'json',
|
||||
data: '',
|
||||
success: function(data) {
|
||||
@ -14,9 +14,10 @@ function presentation_reload() {
|
||||
$('#content li').css({'font-size': data.bigger + '%'}, 200);
|
||||
$('#content #sidebar').css({'font-size': '16px'}, 0);
|
||||
$('#content').animate({'margin-top': data.up + 'em'}, 200);
|
||||
if (data.countdown_visible == "True")
|
||||
|
||||
if (data.countdown_visible == true)
|
||||
$('#countdown').slideDown();
|
||||
if (data.countdown_visible == "False")
|
||||
if (data.countdown_visible == false)
|
||||
$('#countdown').slideUp();
|
||||
if (data.countdown_control == "reset")
|
||||
resetTimer(data.countdown_time);
|
||||
|
@ -1,3 +1,3 @@
|
||||
from system.models import Config
|
||||
|
||||
# TODO: Test that this is not thead-save
|
||||
config = Config()
|
||||
|
@ -31,7 +31,7 @@ urlpatterns = patterns('',
|
||||
(r'', include('participant.urls')),
|
||||
(r'', include('assignment.urls')),
|
||||
(r'', include('system.urls')),
|
||||
(r'projector', include('projector.urls')),
|
||||
(r'projector/', include('projector.urls')),
|
||||
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT}),
|
||||
(r'^i18n/', include('django.conf.urls.i18n')),
|
||||
)
|
||||
|
@ -183,8 +183,6 @@ event_date = config["event_date"]
|
||||
event_location = config["event_location"]
|
||||
event_organizer = config["event_organizer"]
|
||||
|
||||
# set print time
|
||||
time = datetime.now().strftime(str(_("%Y-%m-%d %H:%Mh")))
|
||||
|
||||
|
||||
def firstPage(canvas, doc):
|
||||
@ -197,6 +195,7 @@ def firstPage(canvas, doc):
|
||||
canvas.drawString(2.75*cm, 27.6*cm, "%s, %s" % (event_date, event_location))
|
||||
# time
|
||||
canvas.setFont('Ubuntu',7)
|
||||
time = datetime.now().strftime(str(_("%Y-%m-%d %H:%Mh")))
|
||||
canvas.drawString(15*cm, 28*cm, _("Printed")+": %s" % time)
|
||||
# title
|
||||
if doc.title:
|
||||
@ -217,36 +216,7 @@ def laterPages(canvas, doc):
|
||||
canvas.setFont('Ubuntu',7)
|
||||
canvas.setFillGray(0.4)
|
||||
canvas.drawString(10*cm, 1*cm, _("Page")+" %s" % doc.page)
|
||||
canvas.restoreState()
|
||||
|
||||
|
||||
@permission_required('agenda.can_see_agenda')
|
||||
def print_agenda(request):
|
||||
response = HttpResponse(mimetype='application/pdf')
|
||||
filename = u'filename=%s.pdf;' % _("Agenda")
|
||||
response['Content-Disposition'] = filename.encode('utf-8')
|
||||
doc = SimpleDocTemplate(response)
|
||||
story = [Spacer(1,3*cm)]
|
||||
|
||||
doc.title = _("Agenda")
|
||||
# print item list
|
||||
items = Item.objects.all()
|
||||
for item in items:
|
||||
if item.hidden is False:
|
||||
# print all items"
|
||||
if item.parents:
|
||||
space = ""
|
||||
counter = 0
|
||||
for p in item.parents:
|
||||
if counter != 0:
|
||||
space += " "
|
||||
counter += 1
|
||||
story.append(Paragraph(space+item.title, stylesheet['Subitem']))
|
||||
else:
|
||||
story.append(Paragraph(item.title, stylesheet['Item']))
|
||||
|
||||
doc.build(story, onFirstPage=firstPage, onLaterPages=laterPages)
|
||||
return response
|
||||
canvas.restoreState()s
|
||||
|
||||
|
||||
@permission_required('participant.can_see_participant')
|
||||
|
@ -3,6 +3,14 @@ try:
|
||||
except ImportError:
|
||||
import simplejson as json
|
||||
|
||||
try:
|
||||
from cStringIO import StringIO
|
||||
except ImportError:
|
||||
from StringIO import StringIO
|
||||
|
||||
from reportlab.platypus import SimpleDocTemplate, Paragraph, Frame, PageBreak, Spacer, Table, LongTable, TableStyle, Image
|
||||
from reportlab.lib.units import cm
|
||||
|
||||
from django.conf import settings
|
||||
from django.http import HttpResponseServerError, HttpResponse
|
||||
from django.core.urlresolvers import reverse
|
||||
@ -13,10 +21,12 @@ from django.utils.decorators import method_decorator
|
||||
from django.views.generic import (TemplateView as _TemplateView,
|
||||
RedirectView as _RedirectView,
|
||||
UpdateView as _UpdateView,
|
||||
CreateView as _CreateView,)
|
||||
CreateView as _CreateView,
|
||||
View,)
|
||||
from django.views.generic.detail import SingleObjectMixin
|
||||
|
||||
from utils import render_to_forbitten
|
||||
from pdf import firstPage, laterPages
|
||||
|
||||
FREE_TO_GO = 'free to go'
|
||||
|
||||
@ -98,6 +108,36 @@ class DeleteView(RedirectView, SingleObjectMixin):
|
||||
def pre_post_redirect(self, request, *args, **kwargs):
|
||||
pass
|
||||
|
||||
class PDFView(View, PermissionMixin):
|
||||
filename = 'No_Name'
|
||||
|
||||
def render_to_response(self, filename):
|
||||
response = HttpResponse(mimetype='application/pdf')
|
||||
filename = u'filename=%s.pdf;' % filename
|
||||
response['Content-Disposition'] = filename.encode('utf-8')
|
||||
|
||||
buffer = StringIO()
|
||||
pdf_document = SimpleDocTemplate(buffer)
|
||||
story = [Spacer(1,3*cm)]
|
||||
|
||||
self.append_to_pdf(story)
|
||||
|
||||
pdf_document.build(story, onFirstPage=firstPage, onLaterPages=laterPages)
|
||||
|
||||
pdf = buffer.getvalue()
|
||||
buffer.close()
|
||||
response.write(pdf)
|
||||
return response
|
||||
|
||||
def append_to_pdf(self, story):
|
||||
pass
|
||||
|
||||
def get_filename(self):
|
||||
return self.filename
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
return self.render_to_response(self.get_filename())
|
||||
|
||||
|
||||
def server_error(request, template_name='500.html'):
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user