Use python3

python3.3 and python3.4 are supported
This commit is contained in:
Oskar Hahn 2014-08-16 09:25:18 +02:00
parent 66426ad29b
commit 32137b6523
182 changed files with 291 additions and 609 deletions

View File

@ -1,6 +1,9 @@
language: python language: python
python: python:
- "2.6" - "3.3"
- "2.7" - "3.4"
install: "pip install --allow-external argparse -r requirements.txt" install: "pip install -r requirements.txt"
script: "fab travis_ci" script:
- "DJANGO_SETTINGS_MODULE='tests.settings' coverage run ./manage.py django test"
- "coverage report -m --fail-under=80"
- "flake8 --max-line-length=150 --statistics openslides tests"

View File

@ -4,6 +4,11 @@
http://openslides.org http://openslides.org
Version 2.0.0 (unreleased)
==========================
- Changed supported Python version to >= 3.3
Version 1.6.1 (unreleased) Version 1.6.1 (unreleased)
========================== ==========================
[https://github.com/OpenSlides/OpenSlides/issues?milestone=16] [https://github.com/OpenSlides/OpenSlides/issues?milestone=16]

View File

@ -26,12 +26,12 @@ Installation on GNU/Linux or Mac OS X
1. Check requirements 1. Check requirements
Make sure that you have installed Python Programming Language 2 (>= 2.6.9) Make sure that you have installed Python Programming Language 3 (>= 3.3)
on your system. You will also need the Python development headers. on your system. You will also need the Python development headers.
For example for Ubuntu run:: For example for Ubuntu run::
$ sudo apt-get install python-dev $ sudo apt-get install python3-dev
2. Setup a virtual environment with Virtual Python Environment builder 2. Setup a virtual environment with Virtual Python Environment builder
(optional) (optional)
@ -49,7 +49,7 @@ Installation on GNU/Linux or Mac OS X
$ mkdir OpenSlides $ mkdir OpenSlides
$ cd OpenSlides $ cd OpenSlides
$ virtualenv .virtualenv $ virtualenv -p /usr/bin/python3 .virtualenv
$ source .virtualenv/bin/activate $ source .virtualenv/bin/activate
3. Install OpenSlides 3. Install OpenSlides
@ -67,11 +67,6 @@ Installation on GNU/Linux or Mac OS X
OpenSlides will install all required python packages (see OpenSlides will install all required python packages (see
requirements_production.txt). requirements_production.txt).
If you use Python 2.6.x, you have to add the option `--allow-external
argparse` to the pip command::
$ pip install --allow-external argparse openslides
Installation on Windows Installation on Windows
----------------------- -----------------------
@ -82,18 +77,18 @@ portable version you should observe the following install steps.*
1. Check requirements 1. Check requirements
Make sure that you have installed Python Programming Language 2 (>= 2.6.9) Make sure that you have installed Python Programming Language 3 (>= 3.3)
and Setuptools on your system. and Setuptools on your system.
a. Download and run the `Python 32-bit MSI installer a. Download and run the `Python 32-bit MSI installer
<http://www.python.org/ftp/python/2.7.6/python-2.7.6.msi>`_. Note <https://www.python.org/ftp/python/3.4.1/python-3.4.1.msi>`_. Note
that the 32-bit MSI installer is required even on a 64-bit Windows that the 32-bit MSI installer is required even on a 64-bit Windows
system. If you use the 64-bit MSI installer, step 3 of this system. If you use the 64-bit MSI installer, step 3 of this
instruction will fail unless you installed the package reportlab instruction will fail unless you installed the package reportlab
manually. manually.
b. Add python directories to PATH (via Control Panel > System > b. Add python directories to PATH (via Control Panel > System >
Advanced): ``";C:\\Python27;C:\\Python27\\Scripts"``. Note that the path Advanced): ``";C:\\Python34;C:\\Python34\\Scripts"``. Note that the path
can differ if you customized the install of Python in the first step. can differ if you customized the install of Python in the first step.
c. Download and run (via double click) the last `install script c. Download and run (via double click) the last `install script
@ -214,11 +209,6 @@ Installation and start of the development version
$ pip install -r requirements.txt $ pip install -r requirements.txt
If you use Python 2.6.x, you have to add the option `--allow-external
argparse` to the pip command::
$ pip install --allow-external argparse -r requirements.txt
For Windows run:: For Windows run::
> easy_install # Insert all packages from requirements.txt and requirements_production.txt here > easy_install # Insert all packages from requirements.txt and requirements_production.txt here

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# #
# OpenSlides documentation build configuration file, created by # OpenSlides documentation build configuration file, created by
# sphinx-quickstart on Mon Mar 12 08:08:56 2012. # sphinx-quickstart on Mon Mar 12 08:08:56 2012.

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# #
# Extension for Sphinx to add new directive 'autoimage' which works as subclass # Extension for Sphinx to add new directive 'autoimage' which works as subclass
# of the internal Image directive. # of the internal Image directive.

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import argparse import argparse
import multiprocessing import multiprocessing
import random import random

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
import Queue import Queue

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import sys import sys
import csv import csv
import argparse import argparse

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from random import randint, choice from random import randint, choice
# Import the openslide settings. Has has to be done before any other openslides # Import the openslide settings. Has has to be done before any other openslides

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
import errno import errno
import glob import glob

1
fabfile.py vendored
View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
import os import os
import sys import sys

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys import sys

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
VERSION = (2, 0, 0, 'alpha', 1) # During development it is the next release VERSION = (2, 0, 0, 'alpha', 1) # During development it is the next release
RELEASE = False RELEASE = False
@ -38,9 +36,10 @@ def get_git_commit_id():
try: try:
git_head = open('.git/HEAD', 'r').read().rstrip() git_head = open('.git/HEAD', 'r').read().rstrip()
if git_head[:5] == 'ref: ': if git_head[:5] == 'ref: ':
# The file is a reference. We have to follow it to get the commit id
git_commit_id = open('.git/%s' % git_head[5:], 'r').read().rstrip() git_commit_id = open('.git/%s' % git_head[5:], 'r').read().rstrip()
else: else:
git_commit_id = git_head git_commit_id = git_head
return git_commit_id
except IOError: except IOError:
git_commit_id = 'unknown' return 'unknown'
return str(git_commit_id)

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse import argparse
import os import os
@ -13,7 +12,6 @@ from openslides import get_version
from openslides.utils.main import ( from openslides.utils.main import (
detect_openslides_type, detect_openslides_type,
ensure_settings, ensure_settings,
filesystem2unicode,
get_browser_url, get_browser_url,
get_database_path_from_settings, get_database_path_from_settings,
get_default_settings_path, get_default_settings_path,
@ -244,10 +242,9 @@ def syncdb(settings, args):
Run syncdb to create or update the database. Run syncdb to create or update the database.
""" """
ensure_settings(settings, args) ensure_settings(settings, args)
# TODO: Check use of filesystem2unicode here.
db_file = get_database_path_from_settings() db_file = get_database_path_from_settings()
if db_file is not None: if db_file is not None:
db_dir = filesystem2unicode(os.path.dirname(db_file)) db_dir = os.path.dirname(db_file)
if not os.path.exists(db_dir): if not os.path.exists(db_dir):
os.makedirs(db_dir) os.makedirs(db_dir)
if not os.path.exists(db_file): if not os.path.exists(db_file):

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import widgets # noqa from . import widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu, personal_info, signals, slides, widgets # noqa from . import main_menu, personal_info, signals, slides, widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import csv import csv
import re import re
@ -23,14 +21,15 @@ def import_agenda_items(csvfile):
else: else:
csvfile.seek(0) csvfile.seek(0)
# Check dialect # Check dialect
dialect = csv.Sniffer().sniff(csvfile.readline()) dialect = csv.Sniffer().sniff(csvfile.readline().decode('utf8'))
dialect = csv_ext.patchup(dialect) dialect = csv_ext.patchup(dialect)
csvfile.seek(0) csvfile.seek(0)
# Parse CSV file # Parse CSV file
with transaction.commit_on_success(): with transaction.commit_on_success():
success_lines = [] success_lines = []
error_lines = [] error_lines = []
for (line_no, line) in enumerate(csv.reader(csvfile, dialect=dialect)): for (line_no, line) in enumerate(csv.reader(
(line.decode('utf8') for line in csvfile.readlines()), dialect=dialect)):
if line_no == 0: if line_no == 0:
# Do not read the header line # Do not read the header line
continue continue

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import re import re
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
@ -77,5 +75,5 @@ class AppendSpeakerForm(CssClassMixin, forms.Form):
if Speaker.objects.filter(person=speaker, item=self.item, begin_time=None).exists(): if Speaker.objects.filter(person=speaker, item=self.item, begin_time=None).exists():
raise forms.ValidationError(ugettext_lazy( raise forms.ValidationError(ugettext_lazy(
'%s is already on the list of speakers.' '%s is already on the list of speakers.'
% unicode(speaker))) % str(speaker)))
return speaker return speaker

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from datetime import datetime from datetime import datetime
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
@ -133,7 +131,7 @@ class Item(SlideMixin, AbsoluteUrlMixin, MPTTModel):
raise ValidationError(_('Organizational items can not have agenda items as child elements.')) raise ValidationError(_('Organizational items can not have agenda items as child elements.'))
return super(Item, self).clean() return super(Item, self).clean()
def __unicode__(self): def __str__(self):
return self.get_title() return self.get_title()
def get_absolute_url(self, link='detail'): def get_absolute_url(self, link='detail'):
@ -397,8 +395,8 @@ class Speaker(AbsoluteUrlMixin, models.Model):
super(Speaker, self).delete(*args, **kwargs) super(Speaker, self).delete(*args, **kwargs)
self.check_and_update_projector() self.check_and_update_projector()
def __unicode__(self): def __str__(self):
return unicode(self.person) return str(self.person)
def get_absolute_url(self, link='detail'): def get_absolute_url(self, link='detail'):
if link == 'detail': if link == 'detail':

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.personal_info import PersonalInfo from openslides.utils.personal_info import PersonalInfo

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from haystack import indexes from haystack import indexes
from .models import Item from .models import Item

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from datetime import datetime from datetime import datetime
from django import forms from django import forms

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.template.loader import render_to_string from django.template.loader import render_to_string
from openslides.config.api import config from openslides.config.api import config

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from . import views from . import views

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# TODO: Rename all views and template names # TODO: Rename all views and template names
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -394,7 +393,7 @@ class SpeakerAppendView(SingleObjectMixin, RedirectView):
else: else:
try: try:
Speaker.objects.add(item=self.object, person=request.user) Speaker.objects.add(item=self.object, person=request.user)
except OpenSlidesError, e: except OpenSlidesError as e:
messages.error(request, e) messages.error(request, e)
else: else:
messages.success(request, _('You were successfully added to the list of speakers.')) messages.success(request, _('You were successfully added to the list of speakers.'))
@ -627,7 +626,7 @@ class CurrentListOfSpeakersView(RedirectView):
if self.request.user.has_perm('agenda.can_be_speaker'): if self.request.user.has_perm('agenda.can_be_speaker'):
try: try:
Speaker.objects.add(self.request.user, item) Speaker.objects.add(self.request.user, item)
except OpenSlidesError, e: except OpenSlidesError as e:
messages.error(request, e) messages.error(request, e)
else: else:
messages.success(request, _('You were successfully added to the list of speakers.')) messages.success(request, _('You were successfully added to the list of speakers.'))

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.widgets import Widget from openslides.utils.widgets import Widget

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu, personal_info, signals, slides, template, widgets # noqa from . import main_menu, personal_info, signals, slides, template, widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
@ -32,8 +30,8 @@ class AssignmentCandidate(RelatedModelMixin, models.Model):
class Meta: class Meta:
unique_together = ("assignment", "person") unique_together = ("assignment", "person")
def __unicode__(self): def __str__(self):
return unicode(self.person) return str(self.person)
def get_related_model(self): def get_related_model(self):
""" """
@ -69,7 +67,7 @@ class Assignment(SlideMixin, AbsoluteUrlMixin, models.Model):
ordering = ('name',) ordering = ('name',)
verbose_name = ugettext_noop('Election') verbose_name = ugettext_noop('Election')
def __unicode__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self, link='detail'): def get_absolute_url(self, link='detail'):
@ -289,8 +287,8 @@ class AssignmentOption(BaseOption):
candidate = PersonField() candidate = PersonField()
vote_class = AssignmentVote vote_class = AssignmentVote
def __unicode__(self): def __str__(self):
return unicode(self.candidate) return str(self.candidate)
class AssignmentPoll(SlideMixin, RelatedModelMixin, CollectDefaultVotesMixin, class AssignmentPoll(SlideMixin, RelatedModelMixin, CollectDefaultVotesMixin,
@ -306,7 +304,7 @@ class AssignmentPoll(SlideMixin, RelatedModelMixin, CollectDefaultVotesMixin,
max_length=79, null=True, blank=True, max_length=79, null=True, blank=True,
verbose_name=ugettext_lazy("Comment on the ballot paper")) verbose_name=ugettext_lazy("Comment on the ballot paper"))
def __unicode__(self): def __str__(self):
return _("Ballot %d") % self.get_ballot() return _("Ballot %d") % self.get_ballot()
def get_absolute_url(self, link='update'): def get_absolute_url(self, link='update'):

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.personal_info import PersonalInfo from openslides.utils.personal_info import PersonalInfo

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from haystack import indexes from haystack import indexes
from .models import Assignment from .models import Assignment

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import Assignment, AssignmentPoll from .models import Assignment, AssignmentPoll

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.dispatch import receiver from django.dispatch import receiver
from openslides.utils.signals import template_manipulation from openslides.utils.signals import template_manipulation

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from . import views from . import views

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.shortcuts import redirect from django.shortcuts import redirect
@ -68,7 +66,7 @@ class AssignmentDetail(DetailView):
user = form.cleaned_data['candidate'] user = form.cleaned_data['candidate']
try: try:
self.object.run(user, self.request.user) self.object.run(user, self.request.user)
except NameError, e: except NameError as e:
messages.error(self.request, e) messages.error(self.request, e)
else: else:
messages.success(self.request, _( messages.success(self.request, _(
@ -106,7 +104,7 @@ class AssignmentSetStatusView(SingleObjectMixin, RedirectView):
if status is not None: if status is not None:
try: try:
self.object.set_status(status) self.object.set_status(status)
except ValueError, e: except ValueError as e:
messages.error(self.request, e) messages.error(self.request, e)
else: else:
messages.success( messages.success(
@ -124,7 +122,7 @@ class AssignmentRunView(SingleObjectMixin, PermissionMixin, View):
assignment = self.get_object() assignment = self.get_object()
try: try:
assignment.run(self.request.user, self.request.user) assignment.run(self.request.user, self.request.user)
except NameError, e: except NameError as e:
messages.error(self.request, e) messages.error(self.request, e)
else: else:
messages.success( messages.success(
@ -142,7 +140,8 @@ class AssignmentRunDeleteView(SingleObjectMixin, RedirectView):
"assignment.can_manage_assignment"): "assignment.can_manage_assignment"):
try: try:
self.object.delrun(self.request.user, blocked=True) self.object.delrun(self.request.user, blocked=True)
except Exception, e: except Exception as e:
# TODO: only catch relevant exception
messages.error(self.request, e) messages.error(self.request, e)
else: else:
messages.success(self.request, _( messages.success(self.request, _(
@ -168,7 +167,8 @@ class AssignmentRunOtherDeleteView(SingleObjectMixin, QuestionView):
self._get_person_information() self._get_person_information()
try: try:
self.object.delrun(self.person, blocked=False) self.object.delrun(self.person, blocked=False)
except Exception, e: except Exception as e:
# TODO: only catch relevant exception
self.error = e self.error = e
else: else:
self.error = False self.error = False
@ -400,7 +400,7 @@ class AssignmentPDF(PDFView):
# Add result rows # Add result rows
elected_candidates = list(assignment.elected) elected_candidates = list(assignment.elected)
for candidate, poll_list in vote_results.iteritems(): for candidate, poll_list in vote_results.items():
row = [] row = []
candidate_string = candidate.clean_name candidate_string = candidate.clean_name
@ -595,7 +595,7 @@ class AssignmentPollPDF(PDFView):
cell.append(Spacer(0, 1.3 * cm)) cell.append(Spacer(0, 1.3 * cm))
# print ballot papers # print ballot papers
for user in xrange(number / 2): for user in range(number // 2):
if len(options) > 13: if len(options) > 13:
data.append([cellcolumnA, cell]) data.append([cellcolumnA, cell])
else: else:
@ -629,7 +629,7 @@ class AssignmentPollPDF(PDFView):
cell.append(Spacer(0, 0.75 * cm)) cell.append(Spacer(0, 0.75 * cm))
# print ballot papers # print ballot papers
for user in xrange(number / 2): for user in range(number // 2):
if len(options) > 22: if len(options) > 22:
data.append([cellcolumnA, cell]) data.append([cellcolumnA, cell])
else: else:

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.widgets import Widget from openslides.utils.widgets import Widget

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu # noqa from . import main_menu # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from .exceptions import ConfigError, ConfigNotFound from .exceptions import ConfigError, ConfigNotFound
from .models import ConfigStore from .models import ConfigStore
from .signals import config_signal from .signals import config_signal

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.utils.exceptions import OpenSlidesError from openslides.utils.exceptions import OpenSlidesError

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.config.api import config from openslides.config.api import config

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.db import models from django.db import models
from django.utils.translation import ugettext_noop from django.utils.translation import ugettext_noop

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.dispatch import Signal from django.dispatch import Signal
config_signal = Signal(providing_args=[]) config_signal = Signal(providing_args=[])

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from openslides.utils.views import RedirectView from openslides.utils.views import RedirectView

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu, signals, slides, widgets # noqa from . import main_menu, signals, slides, widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from datetime import datetime from datetime import datetime
from django.conf import settings from django.conf import settings

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from openslides.utils.forms import CssClassMixin from openslides.utils.forms import CssClassMixin

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.core.management.commands.syncdb import Command as _Command from django.core.management.commands.syncdb import Command as _Command
from openslides.core.signals import post_database_setup from openslides.core.signals import post_database_setup

View File

@ -27,7 +27,7 @@ class CustomSlide(SlideMixin, AbsoluteUrlMixin, models.Model):
('can_use_chat', ugettext_noop('Can use the chat')), ('can_use_chat', ugettext_noop('Can use the chat')),
) )
def __unicode__(self): def __str__(self):
return self.title return self.title
def get_absolute_url(self, link='update'): def get_absolute_url(self, link='update'):

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.dispatch import receiver, Signal from django.dispatch import receiver, Signal
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import CustomSlide from .models import CustomSlide

View File

@ -35,9 +35,11 @@
{% if forloop.first %} {% if forloop.first %}
<ol class="searchresults"> <ol class="searchresults">
{% endif %} {% endif %}
{% with result_template=result.app_label|add:"-results.html" %} {% if result.app_label %}
{% include "search/"|add:result_template %} {% with result_template=result.app_label|add:"-results.html" %}
{% endwith %} {% include "search/"|add:result_template %}
{% endwith %}
{% endif %}
{% if forloop.last %} {% if forloop.last %}
</ol> </ol>
{% endif %} {% endif %}

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import template from django import template
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from openslides.utils.views import RedirectView from openslides.utils.views import RedirectView

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.config.api import config from openslides.config.api import config

View File

@ -1,11 +1,8 @@
# -*- coding: utf-8 -*-
import os import os
import copy import copy
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main import filesystem2unicode
from openslides.utils.plugins import collect_plugins from openslides.utils.plugins import collect_plugins
SITE_ROOT = os.path.realpath(os.path.dirname(__file__)) SITE_ROOT = os.path.realpath(os.path.dirname(__file__))
@ -36,7 +33,7 @@ USE_I18N = True
USE_L10N = True USE_L10N = True
LOCALE_PATHS = ( LOCALE_PATHS = (
filesystem2unicode(os.path.join(SITE_ROOT, 'locale')), os.path.join(SITE_ROOT, 'locale'),
) )
# URL that handles the media served from MEDIA_ROOT. Make sure to use a # URL that handles the media served from MEDIA_ROOT. Make sure to use a
@ -46,7 +43,7 @@ MEDIA_URL = '/media/'
# Absolute path to the directory that holds static media from ``collectstatic`` # Absolute path to the directory that holds static media from ``collectstatic``
# Example: "/home/media/static.lawrence.com/" # Example: "/home/media/static.lawrence.com/"
STATIC_ROOT = filesystem2unicode(os.path.join(SITE_ROOT, '../collected-site-static')) STATIC_ROOT = os.path.join(SITE_ROOT, '../collected-site-static')
# URL that handles the media served from STATIC_ROOT. Make sure to use a # URL that handles the media served from STATIC_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases). # trailing slash if there is a path component (optional in other cases).

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu, slides, template, widgets # noqa from . import main_menu, slides, template, widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.forms import ModelForm from django.forms import ModelForm
from openslides.utils.forms import CssClassMixin from openslides.utils.forms import CssClassMixin

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import mimetypes import mimetypes
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@ -53,7 +51,7 @@ class Mediafile(SlideMixin, AbsoluteUrlMixin, models.Model):
('can_upload', ugettext_noop('Can upload files')), ('can_upload', ugettext_noop('Can upload files')),
('can_manage', ugettext_noop('Can manage files')),) ('can_manage', ugettext_noop('Can manage files')),)
def __unicode__(self): def __str__(self):
""" """
Method for representation. Method for representation.
""" """

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from haystack import indexes from haystack import indexes
from .models import Mediafile from .models import Mediafile

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.template.loader import render_to_string from django.template.loader import render_to_string

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.dispatch import receiver from django.dispatch import receiver
from openslides.utils.signals import template_manipulation from openslides.utils.signals import template_manipulation

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from . import views from . import views

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.http import HttpResponse from django.http import HttpResponse
from openslides.config.api import config from openslides.config.api import config

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.widgets import Widget from openslides.utils.widgets import Widget

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu, personal_info, signals, slides, widgets # noqa from . import main_menu, personal_info, signals, slides, widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
# TODO: Rename the file to 'csv.py' when we drop python2 support. At the moment # TODO: Rename the file to 'csv.py' when we drop python2 support. At the moment
# the name csv has a conflict with the core-module. See: # the name csv has a conflict with the core-module. See:
# http://docs.python.org/2/tutorial/modules.html#intra-package-references # http://docs.python.org/2/tutorial/modules.html#intra-package-references
@ -38,12 +36,13 @@ def import_motions(csvfile, default_submitter, override, importing_person=None):
csvfile.seek(0) csvfile.seek(0)
with transaction.commit_on_success(): with transaction.commit_on_success():
dialect = csv.Sniffer().sniff(csvfile.readline()) dialect = csv.Sniffer().sniff(csvfile.readline().decode('utf8'))
dialect = csv_ext.patchup(dialect) dialect = csv_ext.patchup(dialect)
csvfile.seek(0) csvfile.seek(0)
all_error_messages = [] all_error_messages = []
all_warning_messages = [] all_warning_messages = []
for (line_no, line) in enumerate(csv.reader(csvfile, dialect=dialect)): for (line_no, line) in enumerate(csv.reader(
(line.decode('utf8') for line in csvfile.readlines()), dialect=dialect)):
warning = [] warning = []
if line_no < 1: if line_no < 1:
# Do not read the header line # Do not read the header line
@ -92,7 +91,7 @@ def import_motions(csvfile, default_submitter, override, importing_person=None):
person_found = False person_found = False
if submitter: if submitter:
for person in Persons(): for person in Persons():
if person.clean_name == submitter.decode('utf8'): if person.clean_name == submitter:
if person_found: if person_found:
warning.append(_('Several suitable submitters found.')) warning.append(_('Several suitable submitters found.'))
person_found = False person_found = False

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.utils.exceptions import OpenSlidesError from openslides.utils.exceptions import OpenSlidesError

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.db.models import Max from django.db.models import Max
@ -84,7 +82,7 @@ class Motion(SlideMixin, AbsoluteUrlMixin, models.Model):
ordering = ('identifier', ) ordering = ('identifier', )
verbose_name = ugettext_noop('Motion') verbose_name = ugettext_noop('Motion')
def __unicode__(self): def __str__(self):
""" """
Return a human readable name of this motion. Return a human readable name of this motion.
""" """
@ -125,7 +123,7 @@ class Motion(SlideMixin, AbsoluteUrlMixin, models.Model):
# Solves the problem, that there can only be one motion with an empty # Solves the problem, that there can only be one motion with an empty
# string as identifier. # string as identifier.
if not self.identifier and isinstance(self.identifier, basestring): if not self.identifier and isinstance(self.identifier, str):
self.identifier = None self.identifier = None
super(Motion, self).save(*args, **kwargs) super(Motion, self).save(*args, **kwargs)
@ -461,7 +459,7 @@ class Motion(SlideMixin, AbsoluteUrlMixin, models.Model):
""" """
Return a title for the agenda. Return a title for the agenda.
""" """
return unicode(self) return str(self)
def get_agenda_title_supplement(self): def get_agenda_title_supplement(self):
""" """
@ -551,7 +549,7 @@ class MotionVersion(AbsoluteUrlMixin, models.Model):
class Meta: class Meta:
unique_together = ("motion", "version_number") unique_together = ("motion", "version_number")
def __unicode__(self): def __str__(self):
"""Return a string, representing this object.""" """Return a string, representing this object."""
counter = self.version_number or ugettext_lazy('new') counter = self.version_number or ugettext_lazy('new')
return "Motion %s, Version %s" % (self.motion_id, counter) return "Motion %s, Version %s" % (self.motion_id, counter)
@ -587,9 +585,9 @@ class MotionSubmitter(RelatedModelMixin, models.Model):
person = PersonField() person = PersonField()
"""The person, who is the submitter.""" """The person, who is the submitter."""
def __unicode__(self): def __str__(self):
"""Return the name of the submitter as string.""" """Return the name of the submitter as string."""
return unicode(self.person) return str(self.person)
def get_related_model(self): def get_related_model(self):
return self.motion return self.motion
@ -604,9 +602,9 @@ class MotionSupporter(models.Model):
person = PersonField() person = PersonField()
"""The person, who is the supporter.""" """The person, who is the supporter."""
def __unicode__(self): def __str__(self):
"""Return the name of the supporter as string.""" """Return the name of the supporter as string."""
return unicode(self.person) return str(self.person)
class Category(AbsoluteUrlMixin, models.Model): class Category(AbsoluteUrlMixin, models.Model):
@ -619,7 +617,7 @@ class Category(AbsoluteUrlMixin, models.Model):
Used to build the identifier of a motion. Used to build the identifier of a motion.
""" """
def __unicode__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self, link='update'): def get_absolute_url(self, link='update'):
@ -661,7 +659,7 @@ class MotionLog(models.Model):
class Meta: class Meta:
ordering = ['-time'] ordering = ['-time']
def __unicode__(self): def __str__(self):
""" """
Return a string, representing the log message. Return a string, representing the log message.
""" """
@ -721,7 +719,7 @@ class MotionPoll(SlideMixin, RelatedModelMixin, CollectDefaultVotesMixin,
class Meta: class Meta:
unique_together = ("motion", "poll_number") unique_together = ("motion", "poll_number")
def __unicode__(self): def __str__(self):
"""Return a string, representing the poll.""" """Return a string, representing the poll."""
return _('Vote %d') % self.poll_number return _('Vote %d') % self.poll_number
@ -808,7 +806,7 @@ class State(models.Model):
If true, the motion does not get an identifier if the state change to If true, the motion does not get an identifier if the state change to
this one, else it does.""" this one, else it does."""
def __unicode__(self): def __str__(self):
"""Returns the name of the state.""" """Returns the name of the state."""
return self.name return self.name
@ -843,7 +841,7 @@ class Workflow(models.Model):
first_state = models.OneToOneField(State, related_name='+', null=True) first_state = models.OneToOneField(State, related_name='+', null=True)
"""A one-to-one relation to a state, the starting point for the workflow.""" """A one-to-one relation to a state, the starting point for the workflow."""
def __unicode__(self): def __str__(self):
"""Returns the name of the workflow.""" """Returns the name of the workflow."""
return self.name return self.name

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from operator import attrgetter from operator import attrgetter
import random import random
@ -51,7 +49,7 @@ def motion_to_pdf(pdf, motion):
cell1b = [] cell1b = []
cell1b.append(Spacer(0, 0.2 * cm)) cell1b.append(Spacer(0, 0.2 * cm))
for submitter in motion.submitter.all(): for submitter in motion.submitter.all():
cell1b.append(Paragraph(unicode(submitter), stylesheet['Normal'])) cell1b.append(Paragraph(str(submitter), stylesheet['Normal']))
motion_data.append([cell1a, cell1b]) motion_data.append([cell1a, cell1b])
# TODO: choose this in workflow # TODO: choose this in workflow
@ -74,7 +72,7 @@ def motion_to_pdf(pdf, motion):
% _("Supporters"), stylesheet['Heading4'])) % _("Supporters"), stylesheet['Heading4']))
supporters = motion.supporter.all() supporters = motion.supporter.all()
for supporter in supporters: for supporter in supporters:
cell3b.append(Paragraph("<seq id='counter'/>.&nbsp; %s" % unicode(supporter), cell3b.append(Paragraph("<seq id='counter'/>.&nbsp; %s" % str(supporter),
stylesheet['Normal'])) stylesheet['Normal']))
cell3b.append(Spacer(0, 0.2 * cm)) cell3b.append(Spacer(0, 0.2 * cm))
motion_data.append([cell3a, cell3b]) motion_data.append([cell3a, cell3b])
@ -200,7 +198,7 @@ def convert_html_to_reportlab(pdf, text):
text = soup.body.contents text = soup.body.contents
paragraph_number = 1 paragraph_number = 1
for paragraph in text: for paragraph in text:
paragraph = unicode(paragraph) paragraph = str(paragraph)
# ignore empty paragraphs (created by newlines/tabs of ckeditor) # ignore empty paragraphs (created by newlines/tabs of ckeditor)
if paragraph == '\n' or paragraph == '\n\n' or paragraph == '\n\t': if paragraph == '\n' or paragraph == '\n\n' or paragraph == '\n\t':
continue continue
@ -271,11 +269,11 @@ def motion_poll_to_pdf(pdf, poll):
cell.append(Paragraph(_("%d. Vote") % poll.poll_number, stylesheet['Ballot_description'])) cell.append(Paragraph(_("%d. Vote") % poll.poll_number, stylesheet['Ballot_description']))
cell.append(Spacer(0, 0.5 * cm)) cell.append(Spacer(0, 0.5 * cm))
cell.append(Paragraph("<font name='circlefont' size='15'>%s</font> <font name='Ubuntu'>%s</font>" cell.append(Paragraph("<font name='circlefont' size='15'>%s</font> <font name='Ubuntu'>%s</font>"
% (circle, unicode(_("Yes"))), stylesheet['Ballot_option'])) % (circle, _("Yes")), stylesheet['Ballot_option']))
cell.append(Paragraph("<font name='circlefont' size='15'>%s</font> <font name='Ubuntu'>%s</font>" cell.append(Paragraph("<font name='circlefont' size='15'>%s</font> <font name='Ubuntu'>%s</font>"
% (circle, unicode(_("No"))), stylesheet['Ballot_option'])) % (circle, _("No")), stylesheet['Ballot_option']))
cell.append(Paragraph("<font name='circlefont' size='15'>%s</font> <font name='Ubuntu'>%s</font>" cell.append(Paragraph("<font name='circlefont' size='15'>%s</font> <font name='Ubuntu'>%s</font>"
% (circle, unicode(_("Abstention"))), stylesheet['Ballot_option'])) % (circle, _("Abstention")), stylesheet['Ballot_option']))
data = [] data = []
# get ballot papers config values # get ballot papers config values
ballot_papers_selection = config["motion_pdf_ballot_papers_selection"] ballot_papers_selection = config["motion_pdf_ballot_papers_selection"]
@ -299,7 +297,7 @@ def motion_poll_to_pdf(pdf, poll):
# print ballot papers # print ballot papers
if number > 0: if number > 0:
# TODO: try [cell, cell] * (number / 2) # TODO: try [cell, cell] * (number / 2)
for user in xrange(number / 2): for user in range(number / 2):
data.append([cell, cell]) data.append([cell, cell])
rest = number % 2 rest = number % 2
if rest: if rest:

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.config.api import config from openslides.config.api import config

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from haystack import indexes from haystack import indexes
from .models import Motion from .models import Motion

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import Motion, MotionPoll from .models import Motion, MotionPoll

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
# TODO: define the Views inhere # TODO: define the Views inhere

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect from django.http import Http404, HttpResponseRedirect
@ -121,7 +119,7 @@ class MotionEditMixin(object):
active_slide = get_active_slide() active_slide = get_active_slide()
active_slide_pk = active_slide.get('pk', None) active_slide_pk = active_slide.get('pk', None)
if (active_slide['callback'] == 'motion' and if (active_slide['callback'] == 'motion' and
unicode(self.object.pk) == unicode(active_slide_pk)): str(self.object.pk) == str(active_slide_pk)):
update_projector() update_projector()
messages.success(self.request, self.get_success_message()) messages.success(self.request, self.get_success_message())

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.widgets import Widget from openslides.utils.widgets import Widget

View File

@ -1,3 +1 @@
# -*- coding: utf-8 -*-
from . import main_menu, signals, slides, widgets # noqa from . import main_menu, signals, slides, widgets # noqa

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from random import choice from random import choice
from .models import Group, User from .models import Group, User

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import csv import csv
from django.db import transaction from django.db import transaction
@ -21,12 +19,12 @@ def import_users(csvfile):
csvfile.seek(0) csvfile.seek(0)
with transaction.commit_on_success(): with transaction.commit_on_success():
dialect = csv.Sniffer().sniff(csvfile.readline()) dialect = csv.Sniffer().sniff(csvfile.readline().decode('utf-8'))
dialect = csv_ext.patchup(dialect) dialect = csv_ext.patchup(dialect)
csvfile.seek(0) csvfile.seek(0)
for (line_no, line) in enumerate(csv.reader(csvfile, for (line_no, line) in enumerate(csv.reader(
dialect=dialect)): (line.decode('utf8') for line in csvfile.readlines()), dialect=dialect)):
if line_no: if line_no:
try: try:
(title, first_name, last_name, gender, email, groups, (title, first_name, last_name, gender, email, groups,

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.utils.main_menu import MainMenuEntry from openslides.utils.main_menu import MainMenuEntry

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib.auth.middleware import AuthenticationMiddleware as _AuthenticationMiddleware from django.contrib.auth.middleware import AuthenticationMiddleware as _AuthenticationMiddleware
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib.auth.models import Group as DjangoGroup from django.contrib.auth.models import Group as DjangoGroup
from django.contrib.auth.models import User as DjangoUser from django.contrib.auth.models import User as DjangoUser
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
@ -56,7 +54,7 @@ class User(SlideMixin, PersonMixin, Person, AbsoluteUrlMixin, DjangoUser):
) )
ordering = ('last_name',) ordering = ('last_name',)
def __unicode__(self): def __str__(self):
if self.name_suffix: if self.name_suffix:
return u"%s (%s)" % (self.clean_name, self.name_suffix) return u"%s (%s)" % (self.clean_name, self.name_suffix)
return u"%s" % self.clean_name return u"%s" % self.clean_name
@ -125,8 +123,8 @@ class Group(SlideMixin, PersonMixin, Person, AbsoluteUrlMixin, DjangoGroup):
class Meta: class Meta:
ordering = ('name',) ordering = ('name',)
def __unicode__(self): def __str__(self):
return unicode(self.name) return str(self.name)
def get_absolute_url(self, link='detail'): def get_absolute_url(self, link='detail'):
""" """

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from reportlab.graphics.barcode.qr import QrCodeWidget from reportlab.graphics.barcode.qr import QrCodeWidget
from reportlab.graphics.shapes import Drawing from reportlab.graphics.shapes import Drawing
@ -30,7 +28,7 @@ def participants_to_pdf(pdf):
groups = '' groups = ''
for group in user.groups.all(): for group in user.groups.all():
if group.pk != 2: if group.pk != 2:
groups += "%s<br/>" % unicode(_(group.name)) groups += "%s<br/>" % _(group.name)
data.append([ data.append([
counter, counter,
Paragraph(user.title, stylesheet['Tablecell']), Paragraph(user.title, stylesheet['Tablecell']),
@ -82,7 +80,7 @@ def participants_passwords_to_pdf(pdf):
qrcode_wlan_draw.add(qrcode_wlan) qrcode_wlan_draw.add(qrcode_wlan)
for user in User.objects.all().order_by(sort): for user in User.objects.all().order_by(sort):
pdf.append(Paragraph(unicode(user), stylesheet['h1'])) pdf.append(Paragraph(user, stylesheet['h1']))
pdf.append(Spacer(0, 1 * cm)) pdf.append(Spacer(0, 1 * cm))
data = [] data = []
# WLAN access data # WLAN access data

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from haystack import indexes from haystack import indexes
from .models import User from .models import User

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django import forms from django import forms
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import Group, User from .models import Group, User

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from . import views from . import views

View File

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.forms import PasswordChangeForm

Some files were not shown because too many files have changed in this diff Show More