Automated merge with ssh://openslides.de/openslides

This commit is contained in:
Oskar Hahn 2012-02-21 13:17:58 +01:00
commit e9299625ae
12 changed files with 197 additions and 145 deletions

View File

@ -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'

View File

@ -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>

View File

@ -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>

View File

@ -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',
),
)

View File

@ -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 = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" * ancestors.count()
story.append(Paragraph("%s%s" % (space, item.title), stylesheet['Subitem']))
else:
story.append(Paragraph(item.title, stylesheet['Item']))

View File

@ -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>

View File

@ -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'),
)

View File

@ -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);

View File

@ -1,3 +1,3 @@
from system.models import Config
# TODO: Test that this is not thead-save
config = Config()

View File

@ -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')),
)

View File

@ -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 += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
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')

View File

@ -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'):
"""