Merge pull request #894 from ostcar/pylint

Cleanups
This commit is contained in:
Oskar Hahn 2013-10-14 09:47:02 -07:00
commit 21da6c24a8
94 changed files with 600 additions and 726 deletions

10
fabfile.py vendored
View File

@ -45,12 +45,12 @@ def coverage():
webbrowser.open(os.path.join(os.path.dirname(__file__), 'htmlcov', 'index.html')) webbrowser.open(os.path.join(os.path.dirname(__file__), 'htmlcov', 'index.html'))
def pep8(): def check():
""" """
Checks for PEP 8 errors in openslides and in tests. Checks for PEP 8 errors in openslides and in tests.
""" """
local('pep8 --max-line-length=150 --exclude="urls.py," --statistics openslides') local('flake8 --max-line-length=150 --statistics openslides')
local('pep8 --max-line-length=150 --statistics tests') local('flake8 --max-line-length=150 --statistics tests')
def prepare_commit(): def prepare_commit():
@ -60,7 +60,7 @@ def prepare_commit():
At the moment it is running the tests and check for PEP 8 errors. At the moment it is running the tests and check for PEP 8 errors.
""" """
test() test()
pep8() check()
def travis_ci(): def travis_ci():
@ -68,7 +68,7 @@ def travis_ci():
Command that is run by Travis CI. Command that is run by Travis CI.
""" """
coverage_report_plain() coverage_report_plain()
pep8() check()
def run_script(script): def run_script(script):

View File

@ -10,8 +10,8 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.utils.translation import ugettext as _
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.utils.translation import ugettext as _
from openslides.config.api import config from openslides.config.api import config
from openslides.projector.projector import Widget from openslides.projector.projector import Widget

View File

@ -12,4 +12,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from . import signals, slides from . import signals, slides # noqa

View File

@ -18,6 +18,7 @@ from mptt.forms import TreeNodeChoiceField
from openslides.utils.forms import CssClassMixin from openslides.utils.forms import CssClassMixin
from openslides.utils.person.forms import PersonFormField from openslides.utils.person.forms import PersonFormField
from .models import Item, Speaker from .models import Item, Speaker

View File

@ -12,21 +12,20 @@
from datetime import datetime from datetime import datetime
from django.db import models
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ from django.db import models
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from mptt.models import MPTTModel, TreeForeignKey from mptt.models import MPTTModel, TreeForeignKey
from openslides.utils.exceptions import OpenSlidesError from openslides.projector.api import (get_active_slide, update_projector,
from openslides.config.api import config update_projector_overlay)
from openslides.utils.person.models import PersonField
from openslides.projector.api import (
update_projector, get_active_slide, update_projector_overlay)
from openslides.projector.models import SlideMixin from openslides.projector.models import SlideMixin
from openslides.utils.exceptions import OpenSlidesError
from openslides.utils.person.models import PersonField
class Item(SlideMixin, MPTTModel): class Item(SlideMixin, MPTTModel):

View File

@ -12,22 +12,22 @@
from datetime import datetime from datetime import datetime
from django import forms
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.db.models.signals import pre_delete from django.db.models.signals import pre_delete
from django.dispatch import receiver from django.dispatch import receiver
from django import forms
from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.core.exceptions import ValidationError from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.config.api import config, ConfigPage, ConfigVariable
from openslides.config.signals import config_signal from openslides.config.signals import config_signal
from openslides.config.api import config, ConfigVariable, ConfigPage
from openslides.projector.signals import projector_overlays
from openslides.projector.projector import Overlay
from openslides.projector.api import get_active_slide from openslides.projector.api import get_active_slide
from openslides.projector.projector import Overlay
from openslides.projector.signals import projector_overlays
from .models import Speaker, Item from .models import Item
def validate_start_time(value): def validate_start_time(value):

View File

@ -13,7 +13,7 @@
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
from openslides.projector.api import register_slide, get_projector_content from openslides.projector.api import get_projector_content, register_slide
from .models import Item from .models import Item

View File

@ -10,114 +10,92 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.conf.urls import url, patterns from django.conf.urls import patterns, url
from openslides.agenda.views import (
Overview, AgendaItemView, SetClosed, ItemUpdate, SpeakerSpeakView, SpeakerEndSpeachView, from . import views
ItemCreate, ItemDelete, AgendaPDF, SpeakerAppendView, SpeakerDeleteView,
SpeakerListCloseView, SpeakerChangeOrderView, CurrentListOfSpeakersView)
urlpatterns = patterns( urlpatterns = patterns(
'', '',
url(r'^$', url(r'^$',
Overview.as_view(), views.Overview.as_view(),
name='item_overview', name='item_overview'),
),
url(r'^(?P<pk>\d+)/$', url(r'^(?P<pk>\d+)/$',
AgendaItemView.as_view(), views.AgendaItemView.as_view(),
name='item_view', name='item_view'),
),
url(r'^(?P<pk>\d+)/close/$', url(r'^(?P<pk>\d+)/close/$',
SetClosed.as_view(), views.SetClosed.as_view(),
{'closed': True}, {'closed': True},
name='item_close', name='item_close'),
),
url(r'^(?P<pk>\d+)/open/$', url(r'^(?P<pk>\d+)/open/$',
SetClosed.as_view(), views.SetClosed.as_view(),
{'closed': False}, {'closed': False},
name='item_open', name='item_open'),
),
url(r'^(?P<pk>\d+)/edit/$', url(r'^(?P<pk>\d+)/edit/$',
ItemUpdate.as_view(), views.ItemUpdate.as_view(),
name='item_edit', name='item_edit'),
),
url(r'^new/$', url(r'^new/$',
ItemCreate.as_view(), views.ItemCreate.as_view(),
name='item_new', name='item_new'),
),
url(r'^(?P<pk>\d+)/del/$', url(r'^(?P<pk>\d+)/del/$',
ItemDelete.as_view(), views.ItemDelete.as_view(),
name='item_delete', name='item_delete'),
),
url(r'^print/$', url(r'^print/$',
AgendaPDF.as_view(), views.AgendaPDF.as_view(),
name='print_agenda', name='print_agenda'),
),
# List of speakers # List of speakers
url(r'^(?P<pk>\d+)/speaker/$', url(r'^(?P<pk>\d+)/speaker/$',
SpeakerAppendView.as_view(), views.SpeakerAppendView.as_view(),
name='agenda_speaker_append', name='agenda_speaker_append'),
),
url(r'^(?P<pk>\d+)/speaker/close/$', url(r'^(?P<pk>\d+)/speaker/close/$',
SpeakerListCloseView.as_view(), views.SpeakerListCloseView.as_view(),
name='agenda_speaker_close', name='agenda_speaker_close'),
),
url(r'^(?P<pk>\d+)/speaker/reopen/$', url(r'^(?P<pk>\d+)/speaker/reopen/$',
SpeakerListCloseView.as_view(reopen=True), views.SpeakerListCloseView.as_view(reopen=True),
name='agenda_speaker_reopen', name='agenda_speaker_reopen'),
),
url(r'^(?P<pk>\d+)/speaker/del/$', url(r'^(?P<pk>\d+)/speaker/del/$',
SpeakerDeleteView.as_view(), views.SpeakerDeleteView.as_view(),
name='agenda_speaker_delete', name='agenda_speaker_delete'),
),
url(r'^(?P<pk>\d+)/speaker/(?P<speaker>\d+)/del/$', url(r'^(?P<pk>\d+)/speaker/(?P<speaker>\d+)/del/$',
SpeakerDeleteView.as_view(), views.SpeakerDeleteView.as_view(),
name='agenda_speaker_delete', name='agenda_speaker_delete'),
),
url(r'^(?P<pk>\d+)/speaker/(?P<person_id>[^/]+)/speak/$', url(r'^(?P<pk>\d+)/speaker/(?P<person_id>[^/]+)/speak/$',
SpeakerSpeakView.as_view(), views.SpeakerSpeakView.as_view(),
name='agenda_speaker_speak', name='agenda_speaker_speak'),
),
url(r'^(?P<pk>\d+)/speaker/end_speach/$', url(r'^(?P<pk>\d+)/speaker/end_speach/$',
SpeakerEndSpeachView.as_view(), views.SpeakerEndSpeachView.as_view(),
name='agenda_speaker_end_speach', name='agenda_speaker_end_speach'),
),
url(r'^(?P<pk>\d+)/speaker/change_order/$', url(r'^(?P<pk>\d+)/speaker/change_order/$',
SpeakerChangeOrderView.as_view(), views.SpeakerChangeOrderView.as_view(),
name='agenda_speaker_change_order', name='agenda_speaker_change_order'),
),
url(r'^list_of_speakers/$', url(r'^list_of_speakers/$',
CurrentListOfSpeakersView.as_view(), views.CurrentListOfSpeakersView.as_view(),
name='agenda_current_list_of_speakers', name='agenda_current_list_of_speakers'),
),
url(r'^list_of_speakers/add/$', url(r'^list_of_speakers/add/$',
CurrentListOfSpeakersView.as_view(set_speaker=True), views.CurrentListOfSpeakersView.as_view(set_speaker=True),
name='agenda_add_to_current_list_of_speakers', name='agenda_add_to_current_list_of_speakers'),
),
url(r'^list_of_speakers/next/$', url(r'^list_of_speakers/next/$',
CurrentListOfSpeakersView.as_view(next_speaker=True), views.CurrentListOfSpeakersView.as_view(next_speaker=True),
name='agenda_next_on_current_list_of_speakers', name='agenda_next_on_current_list_of_speakers'),
),
url(r'^list_of_speakers/end_speach/$', url(r'^list_of_speakers/end_speach/$',
CurrentListOfSpeakersView.as_view(end_speach=True), views.CurrentListOfSpeakersView.as_view(end_speach=True),
name='agenda_end_speach_on_current_list_of_speakers', name='agenda_end_speach_on_current_list_of_speakers')
)
) )

View File

@ -11,28 +11,29 @@
""" """
# TODO: Rename all views and template names # TODO: Rename all views and template names
from reportlab.platypus import Paragraph
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.core.urlresolvers import reverse
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse
from django.db import transaction from django.db import transaction
from django.db.models import Model from django.db.models import Model
from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.translation import ugettext as _
from django.views.generic.detail import SingleObjectMixin from django.utils.translation import ugettext_lazy
from reportlab.platypus import Paragraph
from openslides.config.api import config from openslides.config.api import config
from openslides.utils.pdf import stylesheet
from openslides.utils.exceptions import OpenSlidesError
from openslides.utils.views import (
TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView,
DetailView, FormView, SingleObjectMixin)
from openslides.utils.template import Tab
from openslides.utils.utils import html_strong
from openslides.projector.api import get_active_slide, update_projector from openslides.projector.api import get_active_slide, update_projector
from openslides.projector.projector import Widget from openslides.projector.projector import Widget
from openslides.utils.exceptions import OpenSlidesError
from openslides.utils.pdf import stylesheet
from openslides.utils.template import Tab
from openslides.utils.utils import html_strong
from openslides.utils.views import (CreateView, DeleteView, FormView, PDFView,
RedirectView, SingleObjectMixin,
TemplateView, UpdateView)
from .forms import AppendSpeakerForm, ItemForm, ItemOrderForm, RelatedItemForm
from .models import Item, Speaker from .models import Item, Speaker
from .forms import ItemOrderForm, ItemForm, AppendSpeakerForm, RelatedItemForm
class Overview(TemplateView): class Overview(TemplateView):
@ -106,6 +107,7 @@ class Overview(TemplateView):
messages.error( messages.error(
request, request,
_('You are not authorized to manage the agenda.')) _('You are not authorized to manage the agenda.'))
context = self.get_context_data(**kwargs)
return self.render_to_response(context) return self.render_to_response(context)
transaction.commit() transaction.commit()

View File

@ -10,5 +10,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from . import signals from . import signals, slides # noqa
from . import slides

View File

@ -16,7 +16,7 @@ from django.utils.translation import ugettext_lazy
from openslides.utils.forms import CssClassMixin from openslides.utils.forms import CssClassMixin
from openslides.utils.person import PersonFormField from openslides.utils.person import PersonFormField
from openslides.assignment.models import Assignment from .models import Assignment
class AssignmentForm(forms.ModelForm, CssClassMixin): class AssignmentForm(forms.ModelForm, CssClassMixin):

View File

@ -12,15 +12,17 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.config.api import config
from openslides.poll.models import (BaseOption, BasePoll, BaseVote,
CountInvalid, CountVotesCast,
PublishPollMixin)
from openslides.projector.models import RelatedModelMixin, SlideMixin
from openslides.utils.person import PersonField from openslides.utils.person import PersonField
from openslides.utils.utils import html_strong from openslides.utils.utils import html_strong
from openslides.config.api import config
from openslides.projector.models import SlideMixin, RelatedModelMixin
from openslides.poll.models import (
BasePoll, CountInvalid, CountVotesCast, BaseOption, PublishPollMixin, BaseVote)
class AssignmentCandidate(RelatedModelMixin, models.Model): class AssignmentCandidate(RelatedModelMixin, models.Model):

View File

@ -10,12 +10,13 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.dispatch import receiver
from django import forms from django import forms
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.dispatch import receiver
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.config.api import ConfigPage, ConfigVariable
from openslides.config.signals import config_signal from openslides.config.signals import config_signal
from openslides.config.api import ConfigVariable, ConfigPage
@receiver(config_signal, dispatch_uid='setup_assignment_config_page') @receiver(config_signal, dispatch_uid='setup_assignment_config_page')

View File

@ -11,7 +11,7 @@
""" """
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import Assignment from .models import Assignment
register_slide_model(Assignment, 'assignment/slide.html') register_slide_model(Assignment, 'assignment/slide.html')

View File

@ -10,111 +10,89 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.conf.urls import url, patterns from django.conf.urls import patterns, url
from openslides.assignment.views import (AssignmentListView, AssignmentDetail, from . import views
AssignmentCreateView, AssignmentUpdateView, AssignmentDeleteView,
AssignmentSetStatusView, AssignmentRunView, AssignmentRunDeleteView,
AssignmentRunOtherDeleteView, PollCreateView, PollUpdateView, AssignmentPDF,
AssignmentPollPDF, AssignmentPollDeleteView, SetPublishStatusView,
SetElectedView, CreateRelatedAgendaItemView)
urlpatterns = patterns('openslides.assignment.views', urlpatterns = patterns(
'',
url(r'^$', url(r'^$',
AssignmentListView.as_view(), views.AssignmentListView.as_view(),
name='assignment_list', name='assignment_list'),
),
url(r'^(?P<pk>\d+)/$', url(r'^(?P<pk>\d+)/$',
AssignmentDetail.as_view(), views.AssignmentDetail.as_view(),
name='assignment_detail'), name='assignment_detail'),
url(r'^new/$', url(r'^new/$',
AssignmentCreateView.as_view(), views.AssignmentCreateView.as_view(),
name='assignment_create', name='assignment_create'),
),
url(r'^(?P<pk>\d+)/edit/$', url(r'^(?P<pk>\d+)/edit/$',
AssignmentUpdateView.as_view(), views.AssignmentUpdateView.as_view(),
name='assignment_update', name='assignment_update'),
),
url(r'^(?P<pk>\d+)/del/$', url(r'^(?P<pk>\d+)/del/$',
AssignmentDeleteView.as_view(), views.AssignmentDeleteView.as_view(),
name='assignment_delete', name='assignment_delete'),
),
url(r'^(?P<pk>\d+)/setstatus/(?P<status>[a-z]{3})/$', url(r'^(?P<pk>\d+)/setstatus/(?P<status>[a-z]{3})/$',
AssignmentSetStatusView.as_view(), views.AssignmentSetStatusView.as_view(),
name='assignment_set_status', name='assignment_set_status'),
),
url(r'^(?P<pk>\d+)/run/$', url(r'^(?P<pk>\d+)/run/$',
AssignmentRunView.as_view(), views.AssignmentRunView.as_view(),
name='assignment_run', name='assignment_run'),
),
url(r'^(?P<pk>\d+)/delrun/$', url(r'^(?P<pk>\d+)/delrun/$',
AssignmentRunDeleteView.as_view(), views.AssignmentRunDeleteView.as_view(),
name='assignment_delrun', name='assignment_delrun'),
),
url(r'^(?P<pk>\d+)/delother/(?P<user_id>[^/]+)/$', url(r'^(?P<pk>\d+)/delother/(?P<user_id>[^/]+)/$',
AssignmentRunOtherDeleteView.as_view(), views.AssignmentRunOtherDeleteView.as_view(),
name='assignment_delother', name='assignment_delother'),
),
url(r'^poll/(?P<poll_id>\d+)/print/$', url(r'^poll/(?P<poll_id>\d+)/print/$',
AssignmentPollPDF.as_view(), views.AssignmentPollPDF.as_view(),
name='assignment_poll_pdf', name='assignment_poll_pdf'),
),
url(r'^(?P<pk>\d+)/agenda/$', url(r'^(?P<pk>\d+)/agenda/$',
CreateRelatedAgendaItemView.as_view(), views.CreateRelatedAgendaItemView.as_view(),
name='assignment_create_agenda', name='assignment_create_agenda'),
),
url(r'^print/$', url(r'^print/$',
AssignmentPDF.as_view(), views.AssignmentPDF.as_view(),
name='assignment_list_pdf', name='assignment_list_pdf'),
),
url(r'^(?P<pk>\d+)/print/$', url(r'^(?P<pk>\d+)/print/$',
AssignmentPDF.as_view(), views.AssignmentPDF.as_view(),
name='assignment_pdf', name='assignment_pdf'),
),
url(r'^(?P<pk>\d+)/gen_poll/$', url(r'^(?P<pk>\d+)/gen_poll/$',
PollCreateView.as_view(), views.PollCreateView.as_view(),
name='assignment_poll_create', name='assignment_poll_create'),
),
url(r'^poll/(?P<poll_id>\d+)/$', url(r'^poll/(?P<poll_id>\d+)/$',
PollUpdateView.as_view(), views.PollUpdateView.as_view(),
name='assignment_poll_view', name='assignment_poll_view'),
),
url(r'^poll/(?P<pk>\d+)/del/$', url(r'^poll/(?P<pk>\d+)/del/$',
AssignmentPollDeleteView.as_view(), views.AssignmentPollDeleteView.as_view(),
name='assignment_poll_delete', name='assignment_poll_delete'),
),
# TODO: use seperate urls to publish and unpublish the poll # TODO: use seperate urls to publish and unpublish the poll
# see assignment_user_elected # see assignment_user_elected
url(r'^poll/(?P<pk>\d+)/pub/$', url(r'^poll/(?P<pk>\d+)/pub/$',
SetPublishStatusView.as_view(), views.SetPublishStatusView.as_view(),
name='assignment_poll_publish_status', name='assignment_poll_publish_status'),
),
url(r'^(?P<pk>\d+)/elected/(?P<user_id>[^/]+)/$', url(r'^(?P<pk>\d+)/elected/(?P<user_id>[^/]+)/$',
SetElectedView.as_view(), views.SetElectedView.as_view(),
{'elected': True}, {'elected': True},
name='assignment_user_elected', name='assignment_user_elected'),
),
url(r'^(?P<pk>\d+)/notelected/(?P<user_id>[^/]+)/$', url(r'^(?P<pk>\d+)/notelected/(?P<user_id>[^/]+)/$',
SetElectedView.as_view(), views.SetElectedView.as_view(),
{'elected': False}, {'elected': False},
name='assignment_user_not_elected', name='assignment_user_not_elected')
),
) )

View File

@ -12,32 +12,33 @@
import os import os
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, PageBreak, Paragraph, Spacer, Table, TableStyle)
from reportlab.lib.units import cm
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.translation import ungettext, ugettext as _ from django.utils.translation import ugettext as _
from django.utils.translation import ungettext
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (PageBreak, Paragraph, SimpleDocTemplate, Spacer,
Table, TableStyle)
from openslides.utils.pdf import stylesheet
from openslides.utils.template import Tab
from openslides.utils.views import (
CreateView, DeleteView, RedirectView, UpdateView, ListView, PDFView,
DetailView, View, PermissionMixin, SingleObjectMixin, QuestionView)
from openslides.utils.person import get_person
from openslides.utils.utils import html_strong
from openslides.config.api import config
from openslides.participant.models import User, Group
from openslides.projector.projector import Widget
from openslides.poll.views import PollFormView
from openslides.agenda.views import CreateRelatedAgendaItemView as _CreateRelatedAgendaItemView from openslides.agenda.views import CreateRelatedAgendaItemView as _CreateRelatedAgendaItemView
from openslides.assignment.models import Assignment, AssignmentPoll from openslides.config.api import config
from openslides.assignment.forms import AssignmentForm, AssignmentRunForm from openslides.participant.models import Group, User
from openslides.poll.views import PollFormView
from openslides.projector.projector import Widget
from openslides.utils.pdf import stylesheet
from openslides.utils.person import get_person
from openslides.utils.template import Tab
from openslides.utils.utils import html_strong
from openslides.utils.views import (CreateView, DeleteView, DetailView,
ListView, PDFView, PermissionMixin,
QuestionView, RedirectView,
SingleObjectMixin, UpdateView, View)
from .forms import AssignmentForm, AssignmentRunForm
from .models import Assignment, AssignmentPoll
class AssignmentListView(ListView): class AssignmentListView(ListView):

View File

@ -10,8 +10,8 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from .models import ConfigStore
from .exceptions import ConfigError, ConfigNotFound from .exceptions import ConfigError, ConfigNotFound
from .models import ConfigStore
from .signals import config_signal from .signals import config_signal

View File

@ -12,6 +12,5 @@
from django.dispatch import Signal from django.dispatch import Signal
config_signal = Signal(providing_args=[]) config_signal = Signal(providing_args=[])
"""Signal to get all config tabs from all apps.""" """Signal to get all config tabs from all apps."""

View File

@ -13,15 +13,15 @@
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
from .signals import config_signal from .signals import config_signal
from .views import ConfigView from .views import ConfigView
urlpatterns = patterns(
urlpatterns = patterns('', '',
url(r'^$', url(r'^$',
RedirectView.as_view(url_name='config_general'), RedirectView.as_view(url_name='config_general'),
name='config_first_config_page', name='config_first_config_page')
),
) )
for receiver, config_page in config_signal.send(sender='config_urls'): for receiver, config_page in config_signal.send(sender='config_urls'):

View File

@ -11,12 +11,13 @@
""" """
from django import forms from django import forms
from django.core.urlresolvers import reverse
from django.contrib import messages from django.contrib import messages
from django.utils.translation import ugettext as _, ugettext_lazy from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _
from openslides.utils.views import FormView
from openslides.utils.template import Tab from openslides.utils.template import Tab
from openslides.utils.views import FormView
from .api import config from .api import config
from .signals import config_signal from .signals import config_signal

View File

@ -10,4 +10,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from . import signals from . import signals # noqa

View File

@ -4,7 +4,7 @@ from optparse import make_option
import django.conf import django.conf
import django.db import django.db
import django.db.transaction import django.db.transaction
from django.core.management.base import NoArgsCommand, CommandError from django.core.management.base import CommandError, NoArgsCommand
class Command(NoArgsCommand): class Command(NoArgsCommand):

View File

@ -10,13 +10,13 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.dispatch import Signal, receiver
from django import forms from django import forms
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.dispatch import receiver, Signal
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.config.api import ConfigGroup, ConfigGroupedPage, ConfigVariable
from openslides.config.signals import config_signal from openslides.config.signals import config_signal
from openslides.config.api import ConfigVariable, ConfigGroup, ConfigGroupedPage
post_database_setup = Signal() post_database_setup = Signal()

View File

@ -14,18 +14,19 @@ import warnings
from django import template from django import template
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from openslides.config.api import config
from openslides.config.api import config
register = template.Library() register = template.Library()
# TODO: remove the tag get_config
@register.simple_tag @register.simple_tag
def get_config(key): def get_config(key):
return config[key] return config[key]
@register.filter @register.filter # noqa
def get_config(key): def get_config(key):
return config[key] return config[key]

View File

@ -13,17 +13,17 @@
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
from .views import VersionView
from . import views
urlpatterns = patterns('', urlpatterns = patterns(
'',
# Redirect to dashboard URL # Redirect to dashboard URL
url(r'^$', url(r'^$',
RedirectView.as_view(url='projector/dashboard/'), RedirectView.as_view(url='projector/dashboard/'),
name='home',), name='home',),
url(r'^version/$', url(r'^version/$',
VersionView.as_view(), views.VersionView.as_view(),
name='core_version',), name='core_version',),
) )

View File

@ -13,7 +13,7 @@
from django.conf import settings from django.conf import settings
from django.utils.importlib import import_module from django.utils.importlib import import_module
from openslides import get_version, get_git_commit_id, RELEASE from openslides import get_git_commit_id, get_version, RELEASE
from openslides.utils.views import TemplateView from openslides.utils.views import TemplateView

View File

@ -11,8 +11,6 @@
""" """
import os import os
import sys
from openslides.main import fs2unicode from openslides.main import fs2unicode

View File

@ -34,6 +34,7 @@ CONFIG_TEMPLATE = """#!/usr/bin/env python
import openslides.main import openslides.main
from openslides.global_settings import * from openslides.global_settings import *
# Use 'DEBUG = True' to get more details for server errors # Use 'DEBUG = True' to get more details for server errors
# (Default for releases: 'False') # (Default for releases: 'False')
DEBUG = False DEBUG = False

View File

@ -10,31 +10,25 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.conf.urls import url, patterns from django.conf.urls import patterns, url
from .models import Mediafile from . import views
from .views import (MediafileListView, MediafileCreateView,
MediafileUpdateView, MediafileDeleteView)
urlpatterns = patterns(
urlpatterns = patterns('', '',
url(r'^$', url(r'^$',
MediafileListView.as_view(), views.MediafileListView.as_view(),
name='mediafile_list', name='mediafile_list'),
),
url(r'^new/$', url(r'^new/$',
MediafileCreateView.as_view(), views.MediafileCreateView.as_view(),
name='mediafile_create', name='mediafile_create'),
),
url(r'^(?P<pk>\d+)/edit/$', url(r'^(?P<pk>\d+)/edit/$',
MediafileUpdateView.as_view(), views.MediafileUpdateView.as_view(),
name='mediafile_update', name='mediafile_update'),
),
url(r'^(?P<pk>\d+)/del/$', url(r'^(?P<pk>\d+)/del/$',
MediafileDeleteView.as_view(), views.MediafileDeleteView.as_view(),
name='mediafile_delete', name='mediafile_delete'),
),
) )

View File

@ -14,10 +14,10 @@ from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from openslides.utils.template import Tab from openslides.utils.template import Tab
from openslides.utils.views import ListView, CreateView, UpdateView, DeleteView from openslides.utils.views import CreateView, DeleteView, ListView, UpdateView
from .models import Mediafile
from .forms import MediafileNormalUserCreateForm, MediafileUpdateForm from .forms import MediafileNormalUserCreateForm, MediafileUpdateForm
from .models import Mediafile
class MediafileListView(ListView): class MediafileListView(ListView):

View File

@ -11,4 +11,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from . import signals, slides from . import signals, slides # noqa

View File

@ -17,13 +17,14 @@
import csv import csv
from django.db import transaction from django.db import transaction
from django.utils.translation import ugettext as _, ugettext_noop from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_noop
from openslides.utils import csv_ext from openslides.utils import csv_ext
from openslides.utils.person.api import Persons from openslides.utils.person.api import Persons
from openslides.utils.utils import html_strong from openslides.utils.utils import html_strong
from .models import Motion, Category from .models import Category, Motion
def import_motions(csv_file, default_submitter, override=False, importing_person=None): def import_motions(csv_file, default_submitter, override=False, importing_person=None):

View File

@ -13,11 +13,6 @@
from openslides.utils.exceptions import OpenSlidesError from openslides.utils.exceptions import OpenSlidesError
class MotionError(OpenSlidesError):
"""Exception raised when errors in the motion accure."""
pass
class WorkflowError(OpenSlidesError): class WorkflowError(OpenSlidesError):
"""Exception raised when errors in a workflow or state accure.""" """Exception raised when errors in a workflow or state accure."""
pass pass

View File

@ -11,12 +11,14 @@
""" """
from django import forms from django import forms
from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.translation import ugettext_lazy
from openslides.config.api import config from openslides.config.api import config
from openslides.utils.forms import CssClassMixin, CleanHtmlFormMixin, LocalizedModelChoiceField from openslides.utils.forms import (CleanHtmlFormMixin, CssClassMixin,
from openslides.utils.person import PersonFormField, MultiplePersonFormField LocalizedModelChoiceField)
from .models import Motion, Category, Workflow from openslides.utils.person import MultiplePersonFormField, PersonFormField
from .models import Category, Motion, Workflow
class BaseMotionForm(CleanHtmlFormMixin, CssClassMixin, forms.ModelForm): class BaseMotionForm(CleanHtmlFormMixin, CssClassMixin, forms.ModelForm):

View File

@ -13,27 +13,21 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from datetime import datetime
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models, IntegrityError from django.db import models
from django.db.models import Max from django.db.models import Max
from django.dispatch import receiver
from django.utils import formats from django.utils import formats
from django.utils.translation import pgettext from django.utils.translation import ugettext as _
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.agenda.models import Item
from openslides.config.api import config from openslides.config.api import config
from openslides.participant.models import User from openslides.poll.models import (BaseOption, BasePoll, BaseVote,
from openslides.poll.models import ( CountInvalid, CountVotesCast)
BaseOption, BasePoll, CountVotesCast, CountInvalid, BaseVote) from openslides.projector.models import RelatedModelMixin, SlideMixin
from openslides.projector.models import SlideMixin, RelatedModelMixin
from openslides.projector.api import (update_projector, get_active_slide)
from openslides.utils.jsonfield import JSONField from openslides.utils.jsonfield import JSONField
from openslides.utils.person import PersonField from openslides.utils.person import PersonField
from .exceptions import MotionError, WorkflowError from .exceptions import WorkflowError
class Motion(SlideMixin, models.Model): class Motion(SlideMixin, models.Model):

View File

@ -10,24 +10,24 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
import random
import os import os
from bs4 import BeautifulSoup import random
from bs4 import BeautifulSoup
from django.conf import settings
from django.utils.translation import ugettext as _
from reportlab.lib import colors from reportlab.lib import colors
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.platypus import ( from reportlab.platypus import PageBreak, Paragraph, Spacer, Table, TableStyle
SimpleDocTemplate, PageBreak, Paragraph, Spacer, Table, TableStyle)
from django.utils.translation import ugettext as _
from django.conf import settings
from openslides.config.api import config from openslides.config.api import config
from openslides.participant.models import Group, User
from openslides.utils.pdf import stylesheet from openslides.utils.pdf import stylesheet
from .models import Motion, Category
from .models import Category, Motion
# Needed to count the delegates # Needed to count the delegates
# TODO: find another way to do this. # TODO: find another way to do this.
from openslides.participant.models import User, Group
def motions_to_pdf(pdf): def motions_to_pdf(pdf):

View File

@ -10,15 +10,16 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.dispatch import receiver
from django import forms from django import forms
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.dispatch import receiver
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.config.api import ConfigPage, ConfigVariable
from openslides.config.signals import config_signal from openslides.config.signals import config_signal
from openslides.config.api import ConfigVariable, ConfigPage
from openslides.core.signals import post_database_setup from openslides.core.signals import post_database_setup
from .models import Workflow, State from .models import State, Workflow
@receiver(config_signal, dispatch_uid='setup_motion_config_page') @receiver(config_signal, dispatch_uid='setup_motion_config_page')

View File

@ -11,6 +11,7 @@
""" """
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import Motion from .models import Motion
register_slide_model(Motion, 'motion/slide.html') register_slide_model(Motion, 'motion/slide.html')

View File

@ -10,133 +10,109 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.conf.urls import url, patterns from django.conf.urls import patterns, url
# TODO: define the Views inhere
urlpatterns = patterns('openslides.motion.views', urlpatterns = patterns(
'openslides.motion.views',
url(r'^$', url(r'^$',
'motion_list', 'motion_list',
name='motion_list', name='motion_list'),
),
url(r'^new/$', url(r'^new/$',
'motion_create', 'motion_create',
# TODO: rename to motion_create # TODO: rename to motion_create
name='motion_new', name='motion_new'),
),
url(r'^(?P<pk>\d+)/$', url(r'^(?P<pk>\d+)/$',
'motion_detail', 'motion_detail',
name='motion_detail', name='motion_detail'),
),
url(r'^(?P<pk>\d+)/edit/$', url(r'^(?P<pk>\d+)/edit/$',
'motion_update', 'motion_update',
name='motion_update', name='motion_update'),
),
url(r'^(?P<pk>\d+)/del/$', url(r'^(?P<pk>\d+)/del/$',
'motion_delete', 'motion_delete',
name='motion_delete', name='motion_delete'),
),
url(r'^(?P<pk>\d+)/version/(?P<version_number>\d+)/$', url(r'^(?P<pk>\d+)/version/(?P<version_number>\d+)/$',
'motion_detail', 'motion_detail',
name='motion_version_detail', name='motion_version_detail'),
),
url(r'^(?P<pk>\d+)/version/(?P<version_number>\d+)/permit/$', url(r'^(?P<pk>\d+)/version/(?P<version_number>\d+)/permit/$',
'version_permit', 'version_permit',
name='motion_version_permit', name='motion_version_permit'),
),
url(r'^(?P<pk>\d+)/version/(?P<version_number>\d+)/del/$', url(r'^(?P<pk>\d+)/version/(?P<version_number>\d+)/del/$',
'version_delete', 'version_delete',
name='motion_version_delete', name='motion_version_delete'),
),
url(r'^(?P<pk>\d+)/diff/$', url(r'^(?P<pk>\d+)/diff/$',
'version_diff', 'version_diff',
name='motion_version_diff', name='motion_version_diff'),
),
url(r'^(?P<pk>\d+)/support/$', url(r'^(?P<pk>\d+)/support/$',
'motion_support', 'motion_support',
name='motion_support', name='motion_support'),
),
url(r'^(?P<pk>\d+)/unsupport/$', url(r'^(?P<pk>\d+)/unsupport/$',
'motion_unsupport', 'motion_unsupport',
name='motion_unsupport', name='motion_unsupport'),
),
url(r'^(?P<pk>\d+)/create_poll/$', url(r'^(?P<pk>\d+)/create_poll/$',
'poll_create', 'poll_create',
name='motion_poll_create', name='motion_poll_create'),
),
url(r'^(?P<pk>\d+)/poll/(?P<poll_number>\d+)/edit/$', url(r'^(?P<pk>\d+)/poll/(?P<poll_number>\d+)/edit/$',
'poll_update', 'poll_update',
name='motion_poll_update', name='motion_poll_update'),
),
url(r'^(?P<pk>\d+)/poll/(?P<poll_number>\d+)/del/$', url(r'^(?P<pk>\d+)/poll/(?P<poll_number>\d+)/del/$',
'poll_delete', 'poll_delete',
name='motion_poll_delete', name='motion_poll_delete'),
),
url(r'^(?P<pk>\d+)/poll/(?P<poll_number>\d+)/pdf/$', url(r'^(?P<pk>\d+)/poll/(?P<poll_number>\d+)/pdf/$',
'poll_pdf', 'poll_pdf',
name='motion_poll_pdf', name='motion_poll_pdf'),
),
url(r'^(?P<pk>\d+)/set_state/(?P<state>\d+)/$', url(r'^(?P<pk>\d+)/set_state/(?P<state>\d+)/$',
'set_state', 'set_state',
name='motion_set_state', name='motion_set_state'),
),
url(r'^(?P<pk>\d+)/reset_state/$', url(r'^(?P<pk>\d+)/reset_state/$',
'reset_state', 'reset_state',
name='motion_reset_state', name='motion_reset_state'),
),
url(r'^(?P<pk>\d+)/agenda/$', url(r'^(?P<pk>\d+)/agenda/$',
'create_agenda_item', 'create_agenda_item',
name='motion_create_agenda', name='motion_create_agenda'),
),
url(r'^pdf/$', url(r'^pdf/$',
'motion_list_pdf', 'motion_list_pdf',
name='motion_list_pdf', name='motion_list_pdf'),
),
url(r'^(?P<pk>\d+)/pdf/$', url(r'^(?P<pk>\d+)/pdf/$',
'motion_detail_pdf', 'motion_detail_pdf',
name='motion_detail_pdf', name='motion_detail_pdf'),
),
url(r'^category/$', url(r'^category/$',
'category_list', 'category_list',
name='motion_category_list', name='motion_category_list'),
),
url(r'^category/new/$', url(r'^category/new/$',
'category_create', 'category_create',
name='motion_category_create', name='motion_category_create'),
),
url(r'^category/(?P<pk>\d+)/edit/$', url(r'^category/(?P<pk>\d+)/edit/$',
'category_update', 'category_update',
name='motion_category_update', name='motion_category_update'),
),
url(r'^category/(?P<pk>\d+)/del/$', url(r'^category/(?P<pk>\d+)/del/$',
'category_delete', 'category_delete',
name='motion_category_delete', name='motion_category_delete'),
),
url(r'^csv_import/$', url(r'^csv_import/$',
'motion_csv_import', 'motion_csv_import',
name='motion_csv_import', name='motion_csv_import'),
),
) )

View File

@ -12,34 +12,33 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.core.urlresolvers import reverse
from django.contrib import messages from django.contrib import messages
from django.db import transaction from django.core.urlresolvers import reverse
from django.db.models import Model
from django.http import Http404, HttpResponseRedirect from django.http import Http404, HttpResponseRedirect
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from reportlab.platypus import SimpleDocTemplate from reportlab.platypus import SimpleDocTemplate
from openslides.utils.pdf import stylesheet from openslides.agenda.views import CreateRelatedAgendaItemView as _CreateRelatedAgendaItemView
from openslides.utils.views import ( from openslides.config.api import config
TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView, from openslides.poll.views import PollFormView
DetailView, ListView, FormView, QuestionView, SingleObjectMixin) from openslides.projector.api import get_active_slide, update_projector
from openslides.projector.projector import Widget
from openslides.utils.template import Tab from openslides.utils.template import Tab
from openslides.utils.utils import html_strong, htmldiff from openslides.utils.utils import html_strong, htmldiff
from openslides.poll.views import PollFormView from openslides.utils.views import (CreateView, DeleteView, DetailView,
from openslides.projector.api import get_active_slide FormView, ListView, PDFView, QuestionView,
from openslides.projector.projector import Widget RedirectView, SingleObjectMixin, UpdateView)
from openslides.config.api import config
from openslides.agenda.views import CreateRelatedAgendaItemView as _CreateRelatedAgendaItemView
from .csv_import import import_motions from .csv_import import import_motions
from .models import (Motion, MotionSubmitter, MotionSupporter, MotionPoll, from .forms import (BaseMotionForm, MotionCategoryMixin,
MotionVersion, State, WorkflowError, Category) MotionDisableVersioningMixin, MotionIdentifierMixin,
from .forms import (BaseMotionForm, MotionSubmitterMixin, MotionSupporterMixin, MotionImportForm, MotionSubmitterMixin,
MotionDisableVersioningMixin, MotionCategoryMixin, MotionSupporterMixin, MotionWorkflowMixin)
MotionIdentifierMixin, MotionWorkflowMixin, MotionImportForm) from .models import (Category, Motion, MotionPoll, MotionSubmitter,
from .pdf import motions_to_pdf, motion_to_pdf, motion_poll_to_pdf MotionSupporter, MotionVersion, WorkflowError)
from .pdf import motion_poll_to_pdf, motion_to_pdf, motions_to_pdf
class MotionListView(ListView): class MotionListView(ListView):

View File

@ -10,10 +10,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.utils.translation import ugettext_noop from . import signals, slides # noqa
from . import signals
from . import slides
NAME = ugettext_noop('Participant')

View File

@ -10,15 +10,15 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from random import choice
import csv import csv
from random import choice
from django.db import transaction from django.db import transaction
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from openslides.utils import csv_ext from openslides.utils import csv_ext
from openslides.participant.models import User, Group from .models import Group, User
def gen_password(): def gen_password():

View File

@ -11,15 +11,16 @@
""" """
from django import forms from django import forms
from django.contrib import messages
from django.contrib.auth.models import Permission
from django.utils.translation import ugettext as _, ugettext_lazy
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import Permission
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy
from openslides.utils.forms import CssClassMixin, LocalizedModelMultipleChoiceField
from openslides.participant.models import User, Group, get_protected_perm
from openslides.participant.api import get_registered_group
from openslides.config.api import config from openslides.config.api import config
from openslides.utils.forms import (CssClassMixin,
LocalizedModelMultipleChoiceField)
from .models import get_protected_perm, Group, User
class UserCreateForm(CssClassMixin, forms.ModelForm): class UserCreateForm(CssClassMixin, forms.ModelForm):

View File

@ -10,18 +10,20 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.core.urlresolvers import reverse from django.contrib.auth.models import Group as DjangoGroup
from django.contrib.auth.models import User as DjangoUser, Group as DjangoGroup, Permission from django.contrib.auth.models import User as DjangoUser
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.db.models import signals from django.db.models import signals
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import ugettext_lazy, ugettext_noop from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.utils.person import PersonMixin, Person
from openslides.utils.person.signals import receive_persons
from openslides.config.api import config from openslides.config.api import config
from openslides.projector.models import SlideMixin from openslides.projector.models import SlideMixin
from openslides.utils.person import Person, PersonMixin
from openslides.utils.person.signals import receive_persons
class User(SlideMixin, PersonMixin, Person, DjangoUser): class User(SlideMixin, PersonMixin, Person, DjangoUser):

View File

@ -10,18 +10,19 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.dispatch import receiver
from django import forms from django import forms
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.dispatch import receiver
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.core.signals import post_database_setup from openslides.config.api import ConfigPage, ConfigVariable
from openslides.config.signals import config_signal from openslides.config.signals import config_signal
from openslides.config.api import ConfigVariable, ConfigPage from openslides.core.signals import post_database_setup
from .models import Group
from .api import create_or_reset_admin_user from .api import create_or_reset_admin_user
from .models import Group
@receiver(config_signal, dispatch_uid='setup_participant_config_page') @receiver(config_signal, dispatch_uid='setup_participant_config_page')

View File

@ -11,7 +11,8 @@
""" """
from openslides.projector.api import register_slide_model from openslides.projector.api import register_slide_model
from .models import User, Group
from .models import Group, User
register_slide_model(User, 'participant/user_slide.html') register_slide_model(User, 'participant/user_slide.html')
register_slide_model(Group, 'participant/group_slide.html') register_slide_model(Group, 'participant/group_slide.html')

View File

@ -10,104 +10,83 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.conf.urls import url, patterns from django.conf.urls import patterns, url
from openslides.participant.views import ( from . import views
UserOverview, UserCreateView, UserDetailView, UserUpdateView,
UserDeleteView, ResetPasswordView, SetUserStatusView, UserImportView,
GroupOverview, GroupCreateView, GroupDetailView, GroupUpdateView, GroupDeleteView,
ParticipantsListPDF, ParticipantsPasswordsPDF)
urlpatterns = patterns('',
urlpatterns = patterns(
'',
# User # User
url(r'^$', url(r'^$',
UserOverview.as_view(), views.UserOverview.as_view(),
name='user_overview', name='user_overview'),
),
url(r'^new/$', url(r'^new/$',
UserCreateView.as_view(), views.UserCreateView.as_view(),
name='user_new', name='user_new'),
),
url(r'^(?P<pk>\d+)/$', url(r'^(?P<pk>\d+)/$',
UserDetailView.as_view(), views.UserDetailView.as_view(),
name='user_view', name='user_view'),
),
url(r'^(?P<pk>\d+)/edit/$', url(r'^(?P<pk>\d+)/edit/$',
UserUpdateView.as_view(), views.UserUpdateView.as_view(),
name='user_edit', name='user_edit'),
),
url(r'^(?P<pk>\d+)/del/$', url(r'^(?P<pk>\d+)/del/$',
UserDeleteView.as_view(), views.UserDeleteView.as_view(),
name='user_delete', name='user_delete'),
),
url(r'^(?P<pk>\d+)/reset_password/$', url(r'^(?P<pk>\d+)/reset_password/$',
ResetPasswordView.as_view(), views.ResetPasswordView.as_view(),
name='user_reset_password', name='user_reset_password'),
),
url(r'^(?P<pk>\d+)/status/activate/$', url(r'^(?P<pk>\d+)/status/activate/$',
SetUserStatusView.as_view(), views.SetUserStatusView.as_view(),
{'action': 'activate'}, {'action': 'activate'},
name='user_status_activate', name='user_status_activate'),
),
url(r'^(?P<pk>\d+)/status/deactivate/$', url(r'^(?P<pk>\d+)/status/deactivate/$',
SetUserStatusView.as_view(), views.SetUserStatusView.as_view(),
{'action': 'deactivate'}, {'action': 'deactivate'},
name='user_status_deactivate', name='user_status_deactivate'),
),
url(r'^(?P<pk>\d+)/status/toggle/$', url(r'^(?P<pk>\d+)/status/toggle/$',
SetUserStatusView.as_view(), views.SetUserStatusView.as_view(),
{'action': 'toggle'}, {'action': 'toggle'},
name='user_status_toggle', name='user_status_toggle'),
),
url(r'^import/$', url(r'^import/$',
UserImportView.as_view(), views.UserImportView.as_view(),
name='user_import', name='user_import'),
),
# Group # Group
url(r'^group/$', url(r'^group/$',
GroupOverview.as_view(), views.GroupOverview.as_view(),
name='user_group_overview', name='user_group_overview'),
),
url(r'^group/new/$', url(r'^group/new/$',
GroupCreateView.as_view(), views.GroupCreateView.as_view(),
name='user_group_new', name='user_group_new'),
),
url(r'^group/(?P<pk>\d+)/$', url(r'^group/(?P<pk>\d+)/$',
GroupDetailView.as_view(), views.GroupDetailView.as_view(),
name='user_group_view', name='user_group_view'),
),
url(r'^group/(?P<pk>\d+)/edit/$', url(r'^group/(?P<pk>\d+)/edit/$',
GroupUpdateView.as_view(), views.GroupUpdateView.as_view(),
name='user_group_edit', name='user_group_edit'),
),
url(r'^group/(?P<pk>\d+)/del/$', url(r'^group/(?P<pk>\d+)/del/$',
GroupDeleteView.as_view(), views.GroupDeleteView.as_view(),
name='user_group_delete', name='user_group_delete'),
),
# PDF # PDF
url(r'^print/$', url(r'^print/$',
ParticipantsListPDF.as_view(), views.ParticipantsListPDF.as_view(),
name='user_print', name='user_print'),
),
url(r'^passwords/print/$', url(r'^passwords/print/$',
ParticipantsPasswordsPDF.as_view(), views.ParticipantsPasswordsPDF.as_view(),
name='print_passwords', name='print_passwords'),
),
) )

View File

@ -18,13 +18,6 @@ else:
draw_qrcode = True draw_qrcode = True
from cStringIO import StringIO from cStringIO import StringIO
from urllib import urlencode
from urlparse import parse_qs
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, LongTable, Spacer, Table, TableStyle, Image)
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
@ -32,23 +25,28 @@ from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth.views import login as django_login from django.contrib.auth.views import login as django_login
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.translation import ugettext as _, ugettext_lazy, activate from django.utils.translation import ugettext as _
from django.utils.translation import activate, ugettext_lazy
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (Image, LongTable, Paragraph, SimpleDocTemplate,
Spacer, Table, TableStyle)
from openslides.utils.pdf import stylesheet
from openslides.utils.template import Tab
from openslides.utils.utils import (
template, delete_default_permissions, html_strong)
from openslides.utils.views import (
FormView, PDFView, CreateView, UpdateView, DeleteView, PermissionMixin,
RedirectView, SingleObjectMixin, ListView, QuestionView, DetailView)
from openslides.config.api import config from openslides.config.api import config
from openslides.projector.projector import Widget from openslides.projector.projector import Widget
from openslides.utils.pdf import stylesheet
from openslides.utils.template import Tab
from openslides.utils.utils import (delete_default_permissions, html_strong,
template)
from openslides.utils.views import (CreateView, DeleteView, DetailView,
FormView, ListView, PDFView,
PermissionMixin, QuestionView,
RedirectView, SingleObjectMixin, UpdateView)
from .api import gen_username, gen_password, import_users from .api import gen_password, gen_username, import_users
from .forms import ( from .forms import (GroupForm, UserCreateForm, UserImportForm, UsersettingsForm,
UserCreateForm, UserUpdateForm, UsersettingsForm, UserUpdateForm)
UserImportForm, GroupForm) from .models import get_protected_perm, Group, User
from .models import User, Group, get_protected_perm
class UserOverview(ListView): class UserOverview(ListView):
@ -448,7 +446,7 @@ class GroupDeleteView(DeleteView):
Checks whether the group is protected. Checks whether the group is protected.
""" """
if self.object.pk in [1, 2]: if self.object.pk in [1, 2]:
messages.error(request, _('You can not delete this group.')) messages.error(self.request, _('You can not delete this group.'))
return True return True
if (not self.request.user.is_superuser and if (not self.request.user.is_superuser and
get_protected_perm() in self.object.permissions.all() and get_protected_perm() in self.object.permissions.all() and

View File

@ -12,7 +12,8 @@
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _, ugettext_noop from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext_noop
from openslides.utils.models import MinMaxIntegerField from openslides.utils.models import MinMaxIntegerField

View File

@ -10,9 +10,9 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.http import HttpResponseRedirect
from django.forms.models import modelform_factory
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.forms.models import modelform_factory
from django.http import HttpResponseRedirect
from openslides.utils.views import TemplateView, FormMixin from openslides.utils.views import TemplateView, FormMixin

View File

@ -10,4 +10,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from . import signals, slides from . import signals, slides # noqa

View File

@ -13,15 +13,14 @@
import json import json
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.template.loader import render_to_string
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.template.loader import render_to_string
from openslides.config.api import config from openslides.config.api import config
from openslides.utils.tornado_webserver import ProjectorSocketHandler from openslides.utils.tornado_webserver import ProjectorSocketHandler
from .signals import projector_overlays
from .signals import projector_overlays
slide_callback = {} slide_callback = {}
""" """
@ -48,7 +47,7 @@ def update_projector_overlay(overlay):
ovleray or None. If it is None, all overlays will be updated. ovleray or None. If it is None, all overlays will be updated.
""" """
if overlay is None: if overlay is None:
overlays = [overlay for overlay in get_overlays().values()] overlays = [item for item in get_overlays().values()]
elif isinstance(overlay, basestring): elif isinstance(overlay, basestring):
overlays = [get_overlays()[overlay]] overlays = [get_overlays()[overlay]]
else: else:
@ -115,13 +114,13 @@ def get_projector_overlays_js():
The retuned value is a list of json objects. The retuned value is a list of json objects.
""" """
js = [] javascript = []
for key, overlay in get_overlays().items(): for overlay in get_overlays().values():
if overlay.is_active(): if overlay.is_active():
overlay_js = overlay.get_javascript() overlay_js = overlay.get_javascript()
if overlay_js: if overlay_js:
js.append(json.dumps(overlay_js)) javascript.append(json.dumps(overlay_js))
return js return javascript
def register_slide(name, callback): def register_slide(name, callback):
@ -158,13 +157,14 @@ def register_slide_model(SlideModel, template):
register_slide(SlideModel.slide_callback_name, model_slide) register_slide(SlideModel.slide_callback_name, model_slide)
def set_active_slide(callback, kwargs={}): def set_active_slide(callback, kwargs=None):
""" """
Set the active Slide. Set the active Slide.
callback: The name of the slide callback. callback: The name of the slide callback.
kwargs: Keyword arguments for the slide callback. kwargs: Keyword arguments for the slide callback.
""" """
kwargs = kwargs or {}
kwargs.update(callback=callback) kwargs.update(callback=callback)
config['projector_active_slide'] = kwargs config['projector_active_slide'] = kwargs
update_projector() update_projector()

View File

@ -15,7 +15,7 @@ from django import forms
from openslides.utils.forms import CssClassMixin from openslides.utils.forms import CssClassMixin
class SelectWidgetsForm(forms.Form, CssClassMixin): class SelectWidgetsForm(CssClassMixin, forms.Form):
""" """
Form to select the widgets. Form to select the widgets.
""" """

View File

@ -10,11 +10,10 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.db import models
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy, ugettext_noop
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models
from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.utils.utils import int_or_none from openslides.utils.utils import int_or_none
@ -64,7 +63,7 @@ class SlideMixin(object):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
""" """
Updates the projector, if 'self' is the active slide. Updates the projector, if the object is on the projector and changed.
""" """
from openslides.projector.api import update_projector from openslides.projector.api import update_projector
value = super(SlideMixin, self).save(*args, **kwargs) value = super(SlideMixin, self).save(*args, **kwargs)
@ -73,6 +72,9 @@ class SlideMixin(object):
return value return value
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
"""
Updates the projector, if the object is on the projector and is deleted.
"""
from openslides.projector.api import update_projector from openslides.projector.api import update_projector
value = super(SlideMixin, self).delete(*args, **kwargs) value = super(SlideMixin, self).delete(*args, **kwargs)
if self.is_active_slide(): if self.is_active_slide():
@ -100,9 +102,9 @@ class SlideMixin(object):
""" """
from openslides.projector.api import get_active_slide from openslides.projector.api import get_active_slide
active_slide = get_active_slide() active_slide = get_active_slide()
pk = int_or_none(active_slide.get('pk', None)) slide_pk = int_or_none(active_slide.get('pk', None))
return (active_slide['callback'] == self.slide_callback_name and return (active_slide['callback'] == self.slide_callback_name and
self.pk == pk) self.pk == slide_pk)
def get_slide_context(self, **context): def get_slide_context(self, **context):
""" """

View File

@ -10,13 +10,10 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from time import time from django.template import RequestContext
from django.dispatch import receiver
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
from django.template import RequestContext
from openslides.utils.exceptions import OpenSlidesError from openslides.utils.exceptions import OpenSlidesError
@ -24,7 +21,7 @@ class Widget(object):
""" """
Class for a Widget for the Projector-Tab. Class for a Widget for the Projector-Tab.
""" """
def __init__(self, request, name, html=None, template=None, context={}, def __init__(self, request, name, html=None, template=None, context=None,
permission_required=None, display_name=None, default_column=1, permission_required=None, display_name=None, default_column=1,
default_weight=0): default_weight=0):
self.name = name self.name = name
@ -38,7 +35,7 @@ class Widget(object):
elif template is not None: elif template is not None:
self.html = render_to_string( self.html = render_to_string(
template_name=template, template_name=template,
dictionary=context, dictionary=context or {},
context_instance=RequestContext(request)) context_instance=RequestContext(request))
else: else:
raise OpenSlidesError('A Widget must have either a html or a template argument.') raise OpenSlidesError('A Widget must have either a html or a template argument.')
@ -47,12 +44,21 @@ class Widget(object):
self.default_weight = default_weight self.default_weight = default_weight
def get_name(self): def get_name(self):
"""
Returns the lower case of the widget name.
"""
return self.name.lower() return self.name.lower()
def get_html(self): def get_html(self):
"""
Returns the html code of the widget.
"""
return self.html return self.html
def get_title(self): def get_title(self):
"""
Returns the title of the widget.
"""
return self.display_name return self.display_name
def __repr__(self): def __repr__(self):
@ -76,15 +82,26 @@ class Overlay(object):
self.allways_active = allways_active self.allways_active = allways_active
def get_widget_html(self): def get_widget_html(self):
"""
Returns the html code for the overlay widget.
Can return None, if the widget does not want to be in the widget.
"""
value = None value = None
if self.widget_html_callback is not None: if self.widget_html_callback is not None:
value = self.widget_html_callback() value = self.widget_html_callback()
return value return value
def get_projector_html(self): def get_projector_html(self):
"""
Returns the html code for the projector.
"""
return self.get_html_wrapper(self.projector_html_callback()) return self.get_html_wrapper(self.projector_html_callback())
def get_javascript(self): def get_javascript(self):
"""
Returns the java-script code for the projector.
"""
if self.javascript_callback is None: if self.javascript_callback is None:
value = {} value = {}
else: else:
@ -92,12 +109,20 @@ class Overlay(object):
return value return value
def get_html_wrapper(self, inner_html): def get_html_wrapper(self, inner_html):
"""
Returns the inner_html wrapped in a div.
The html-id of the div is "overlay_OVERLAYNAME"
"""
full_html = '' full_html = ''
if inner_html is not None: if inner_html is not None:
full_html = '<div id="overlay_%s">%s</div>' % (self.name, inner_html) full_html = '<div id="overlay_%s">%s</div>' % (self.name, inner_html)
return full_html return full_html
def is_active(self): def is_active(self):
"""
Returns True if the overlay is activated. False in other case.
"""
return self.allways_active or self.name in config['projector_active_overlays'] return self.allways_active or self.name in config['projector_active_overlays']
def set_active(self, active): def set_active(self, active):
@ -115,4 +140,7 @@ class Overlay(object):
config['projector_active_overlays'] = list(active_overlays) config['projector_active_overlays'] = list(active_overlays)
def show_on_projector(self): def show_on_projector(self):
"""
Retruns True if the overlay should be shoun on the projector.
"""
return self.is_active() and self.get_projector_html() is not None return self.is_active() and self.get_projector_html() is not None

View File

@ -9,37 +9,31 @@
:copyright: 20112013 by OpenSlides team, see AUTHORS. :copyright: 20112013 by OpenSlides team, see AUTHORS.
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from time import time
from django.dispatch import Signal, receiver
from django import forms
from django.template.loader import render_to_string
from django.core.context_processors import csrf
from django.contrib.staticfiles.templatetags.staticfiles import static from django.contrib.staticfiles.templatetags.staticfiles import static
from django.core.context_processors import csrf
from django.dispatch import receiver, Signal
from django.template.loader import render_to_string
from openslides.config.api import config, ConfigVariable, ConfigPage from openslides.config.api import config, ConfigPage, ConfigVariable
from openslides.config.signals import config_signal from openslides.config.signals import config_signal
from .projector import Overlay from .projector import Overlay
projector_overlays = Signal(providing_args=['request']) projector_overlays = Signal(providing_args=['request'])
@receiver(config_signal, dispatch_uid='setup_projector_config_variables') @receiver(config_signal, dispatch_uid='setup_projector_config_variables')
def setup_projector_config_variables(sender, **kwargs): def config_variables(sender, **kwargs):
""" """
Projector config variables for OpenSlides. They are not shown on a Projector config variables for OpenSlides. They are not shown on a
config page. config page.
""" """
# The active slide. The config-value is a dictonary with at least the entry
# 'callback'.
projector = ConfigVariable( projector = ConfigVariable(
name='projector_active_slide', name='projector_active_slide',
default_value={'callback': None}) default_value={'callback': None})
"""
The active slide. The config-value is a dictonary with at least the entrie
'callback'.
"""
projector_message = ConfigVariable( projector_message = ConfigVariable(
name='projector_message', name='projector_message',
@ -65,7 +59,7 @@ def setup_projector_config_variables(sender, **kwargs):
name='bigger', name='bigger',
default_value=100) default_value=100)
up = ConfigVariable( projector_up = ConfigVariable(
name='up', name='up',
default_value=0) default_value=0)
@ -77,7 +71,7 @@ def setup_projector_config_variables(sender, **kwargs):
title='No title here', url='bar', required_permission=None, variables=( title='No title here', url='bar', required_permission=None, variables=(
projector, projector_message, projector, projector_message,
countdown_time, countdown_start_stamp, countdown_pause_stamp, countdown_time, countdown_start_stamp, countdown_pause_stamp,
countdown_state, bigger, up, projector_active_overlays)) countdown_state, bigger, projector_up, projector_active_overlays))
@receiver(projector_overlays, dispatch_uid="projector_countdown") @receiver(projector_overlays, dispatch_uid="projector_countdown")
@ -124,8 +118,8 @@ def countdown(sender, **kwargs):
return Overlay(name, get_widget_html, get_projector_html, get_projector_js) return Overlay(name, get_widget_html, get_projector_html, get_projector_js)
@receiver(projector_overlays, dispatch_uid="projector_message") @receiver(projector_overlays, dispatch_uid="projector_overlay_message")
def projector_message(sender, **kwargs): def projector_overlay_message(sender, **kwargs):
""" """
Receiver to show the overlay_message on the projector or the form in the Receiver to show the overlay_message on the projector or the form in the
overlay-widget on the dashboard. overlay-widget on the dashboard.

View File

@ -14,5 +14,4 @@ from openslides.projector.api import register_slide_model
from .models import ProjectorSlide from .models import ProjectorSlide
register_slide_model(ProjectorSlide, 'projector/slide_projectorslide.html') register_slide_model(ProjectorSlide, 'projector/slide_projectorslide.html')

View File

@ -12,127 +12,103 @@
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from openslides.projector.views import (DashboardView, ActivateView, from . import views
CustomSlideCreateView, CustomSlideUpdateView, CustomSlideDeleteView,
CountdownEdit, ProjectorEdit, Projector, ActivateOverlay, SelectWidgetsView,
OverlayMessageView)
urlpatterns = patterns(
urlpatterns = patterns('', '',
url(r'^$', url(r'^$',
Projector.as_view(), views.Projector.as_view(),
name='projector_show', name='projector_show'),
),
url(r'^preview/$', url(r'^preview/$',
Projector.as_view(), views.Projector.as_view(),
{'callback': None}, {'callback': None},
name='projctor_preview_welcomepage', name='projctor_preview_welcomepage'),
),
url(r'^preview/(?P<callback>[^/]*)/$', url(r'^preview/(?P<callback>[^/]*)/$',
Projector.as_view(), views.Projector.as_view(),
name='projector_preview', name='projector_preview'),
),
url(r'^activate/(?P<callback>[^/]*)/$', url(r'^activate/(?P<callback>[^/]*)/$',
ActivateView.as_view(), views.ActivateView.as_view(),
name='projector_activate_slide', name='projector_activate_slide'),
),
url(r'^dashboard/$', url(r'^dashboard/$',
DashboardView.as_view(), views.DashboardView.as_view(),
name='dashboard', name='dashboard'),
),
url(r'^widgets/$', url(r'^widgets/$',
SelectWidgetsView.as_view(), views.SelectWidgetsView.as_view(),
name='projector_select_widgets', name='projector_select_widgets'),
),
url(r'^overlay_message/$', url(r'^overlay_message/$',
OverlayMessageView.as_view(), views.OverlayMessageView.as_view(),
name='projector_overlay_message', name='projector_overlay_message'),
),
url(r'^new/$', url(r'^new/$',
CustomSlideCreateView.as_view(), views.CustomSlideCreateView.as_view(),
name='customslide_new', name='customslide_new'),
),
url(r'^(?P<pk>\d+)/edit/$', url(r'^(?P<pk>\d+)/edit/$',
CustomSlideUpdateView.as_view(), views.CustomSlideUpdateView.as_view(),
name='customslide_edit', name='customslide_edit'),
),
url(r'^(?P<pk>\d+)/del/$', url(r'^(?P<pk>\d+)/del/$',
CustomSlideDeleteView.as_view(), views.CustomSlideDeleteView.as_view(),
name='customslide_delete', name='customslide_delete'),
),
url(r'^bigger/$', url(r'^bigger/$',
ProjectorEdit.as_view(), views.ProjectorEdit.as_view(),
{'direction': 'bigger'}, {'direction': 'bigger'},
name='projector_bigger', name='projector_bigger'),
),
url(r'^smaller/$', url(r'^smaller/$',
ProjectorEdit.as_view(), views.ProjectorEdit.as_view(),
{'direction': 'smaller'}, {'direction': 'smaller'},
name='projector_smaller', name='projector_smaller'),
),
url(r'^up/$', url(r'^up/$',
ProjectorEdit.as_view(), views.ProjectorEdit.as_view(),
{'direction': 'up'}, {'direction': 'up'},
name='projector_up', name='projector_up'),
),
url(r'^down/$', url(r'^down/$',
ProjectorEdit.as_view(), views.ProjectorEdit.as_view(),
{'direction': 'down'}, {'direction': 'down'},
name='projector_down', name='projector_down'),
),
url(r'^clean/$', url(r'^clean/$',
ProjectorEdit.as_view(), views.ProjectorEdit.as_view(),
{'direction': 'clean'}, {'direction': 'clean'},
name='projector_clean', name='projector_clean'),
),
url(r'^countdown/reset/$', url(r'^countdown/reset/$',
CountdownEdit.as_view(), views.CountdownEdit.as_view(),
{'command': 'reset'}, {'command': 'reset'},
name='countdown_reset', name='countdown_reset'),
),
url(r'^countdown/start/$', url(r'^countdown/start/$',
CountdownEdit.as_view(), views.CountdownEdit.as_view(),
{'command': 'start'}, {'command': 'start'},
name='countdown_start', name='countdown_start'),
),
url(r'^countdown/stop/$', url(r'^countdown/stop/$',
CountdownEdit.as_view(), views.CountdownEdit.as_view(),
{'command': 'stop'}, {'command': 'stop'},
name='countdown_stop', name='countdown_stop'),
),
url(r'^countdown/set-default/$', url(r'^countdown/set-default/$',
CountdownEdit.as_view(), views.CountdownEdit.as_view(),
{'command': 'set-default'}, {'command': 'set-default'},
name='countdown_set_default', name='countdown_set_default'),
),
url('^overlay/(?P<name>[^/]*)/activate/$', url('^overlay/(?P<name>[^/]*)/activate/$',
ActivateOverlay.as_view(), views.ActivateOverlay.as_view(),
{'activate': True}, {'activate': True},
name='projector_overlay_activate', name='projector_overlay_activate'),
),
url('^overlay/(?P<name>[^/]*)/deactivate/$', url('^overlay/(?P<name>[^/]*)/deactivate/$',
ActivateOverlay.as_view(), views.ActivateOverlay.as_view(),
{'activate': False}, {'activate': False},
name='projector_overlay_deactivate', name='projector_overlay_deactivate'),
),
) )

View File

@ -10,27 +10,24 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from datetime import datetime
from time import time from time import time
from django.contrib import messages from django.contrib import messages
from django.core.cache import cache
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import transaction from django.db import transaction
from django.db.models import Q
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template import RequestContext
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from openslides.utils.template import Tab
from openslides.utils.views import (
TemplateView, RedirectView, CreateView, UpdateView, DeleteView, AjaxMixin)
from openslides.config.api import config from openslides.config.api import config
from .api import ( from openslides.utils.template import Tab
get_projector_content, get_projector_overlays, get_all_widgets, from openslides.utils.views import (AjaxMixin, CreateView, DeleteView,
set_active_slide, update_projector, get_active_slide, update_projector_overlay, RedirectView, TemplateView, UpdateView)
get_overlays, get_projector_overlays_js)
from .api import (get_active_slide, get_all_widgets, get_overlays,
get_projector_content, get_projector_overlays,
get_projector_overlays_js, set_active_slide,
update_projector_overlay)
from .forms import SelectWidgetsForm from .forms import SelectWidgetsForm
from .models import ProjectorSlide from .models import ProjectorSlide
from .projector import Widget from .projector import Widget
@ -118,6 +115,9 @@ class SelectWidgetsView(TemplateView):
@transaction.commit_manually @transaction.commit_manually
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
"""
Activates or deactivates the widgets in a post request.
"""
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
activated_widgets = self.request.session.get('widgets', {}) activated_widgets = self.request.session.get('widgets', {})

View File

@ -11,13 +11,13 @@
""" """
from django.conf import settings from django.conf import settings
from django.conf.urls import patterns, url, include from django.conf.urls import include, patterns, url
from django.utils.importlib import import_module from django.utils.importlib import import_module
handler500 = 'openslides.utils.views.server_error' handler500 = 'openslides.utils.views.server_error'
urlpatterns = patterns('', urlpatterns = patterns(
'',
(r'^agenda/', include('openslides.agenda.urls')), (r'^agenda/', include('openslides.agenda.urls')),
(r'^motion/', include('openslides.motion.urls')), (r'^motion/', include('openslides.motion.urls')),
(r'^assignment/', include('openslides.assignment.urls')), (r'^assignment/', include('openslides.assignment.urls')),
@ -28,7 +28,7 @@ urlpatterns = patterns('',
(r'^i18n/', include('django.conf.urls.i18n')), (r'^i18n/', include('django.conf.urls.i18n')),
) )
js_info_dict = {'packages': [],} js_info_dict = {'packages': []}
for plugin in settings.INSTALLED_PLUGINS: for plugin in settings.INSTALLED_PLUGINS:
try: try:
@ -41,30 +41,29 @@ for plugin in settings.INSTALLED_PLUGINS:
% plugin))) % plugin)))
js_info_dict['packages'].append(plugin) js_info_dict['packages'].append(plugin)
urlpatterns += patterns('', # TODO: move this patterns into core or the participant app
urlpatterns += patterns(
'',
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict), (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
url(r'^login/$', url(r'^login/$',
'openslides.participant.views.login', 'openslides.participant.views.login',
name='user_login', name='user_login'),
),
url(r'^logout/$', url(r'^logout/$',
'django.contrib.auth.views.logout_then_login', 'django.contrib.auth.views.logout_then_login',
name='user_logout', name='user_logout'),
),
url(r'^usersettings/$', url(r'^usersettings/$',
'openslides.participant.views.user_settings', 'openslides.participant.views.user_settings',
name='user_settings', name='user_settings'),
),
url(r'^usersettings/changepassword/$', url(r'^usersettings/changepassword/$',
'openslides.participant.views.user_settings_password', 'openslides.participant.views.user_settings_password',
name='password_change', name='password_change'),
),
) )
urlpatterns += patterns('', urlpatterns += patterns(
'',
(r'^', include('openslides.core.urls')), (r'^', include('openslides.core.urls')),
) )

View File

@ -11,6 +11,7 @@
""" """
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from openslides.config.api import config from openslides.config.api import config

View File

@ -5,4 +5,4 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from AnonymousAuth import * from AnonymousAuth import * # noqa

View File

@ -11,10 +11,9 @@
""" """
import bleach import bleach
from django import forms from django import forms
from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy
# Allowed tags, attributes and styles allowed in textareas edited with a JS # Allowed tags, attributes and styles allowed in textareas edited with a JS
# editor. Everything not in these whitelists is stripped. # editor. Everything not in these whitelists is stripped.

View File

@ -1,10 +1,10 @@
import json import json
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
from django.utils.translation import ugettext as _ from django.db import models
from django.forms.fields import Field from django.forms.fields import Field
from django.forms.util import ValidationError as FormValidationError from django.forms.util import ValidationError as FormValidationError
from django.utils.translation import ugettext as _
class JSONFormField(Field): class JSONFormField(Field):

View File

@ -13,20 +13,18 @@
from datetime import datetime from datetime import datetime
from os.path import join as path_join from os.path import join as path_join
from django.conf import settings
from django.utils import formats
from django.utils.translation import ugettext as _
from reportlab.lib import colors from reportlab.lib import colors
from reportlab.lib.styles import StyleSheet1, ParagraphStyle from reportlab.lib.styles import ParagraphStyle, StyleSheet1
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase.ttfonts import TTFont
from reportlab.rl_config import defaultPageSize from reportlab.rl_config import defaultPageSize
from django.conf import settings
from django.utils import formats
from django.utils.translation import ugettext as _
from openslides.config.api import config from openslides.config.api import config
# register new truetype fonts # register new truetype fonts
pdfmetrics.registerFont(TTFont( pdfmetrics.registerFont(TTFont(
'Ubuntu', path_join(settings.SITE_ROOT, 'static/fonts/Ubuntu-R.ttf'))) 'Ubuntu', path_join(settings.SITE_ROOT, 'static/fonts/Ubuntu-R.ttf')))

View File

@ -12,7 +12,7 @@
from django import forms from django import forms
from openslides.utils.person.api import Persons, get_person from openslides.utils.person.api import get_person, Persons
class PersonChoices(object): class PersonChoices(object):

View File

@ -9,13 +9,13 @@
:copyright: 2011, 2012 by OpenSlides team, see AUTHORS. :copyright: 2011, 2012 by OpenSlides team, see AUTHORS.
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.db import models
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.db import models
from openslides.utils.exceptions import OpenSlidesError from openslides.utils.exceptions import OpenSlidesError
from .api import generate_person_id, get_person
from .forms import PersonFormField from .forms import PersonFormField
from .api import get_person, generate_person_id
class PersonField(models.fields.Field): class PersonField(models.fields.Field):

View File

@ -13,8 +13,8 @@
from django.test import TestCase as _TestCase from django.test import TestCase as _TestCase
from openslides.core.signals import post_database_setup
from openslides.config.api import config from openslides.config.api import config
from openslides.core.signals import post_database_setup
class TestCase(_TestCase): class TestCase(_TestCase):

View File

@ -11,16 +11,15 @@
import posixpath import posixpath
from urllib import unquote from urllib import unquote
from django.conf import settings
from django.core.handlers.wsgi import WSGIHandler as Django_WSGIHandler
from django.utils.translation import ugettext as _
from tornado.httpserver import HTTPServer from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop from tornado.ioloop import IOLoop
from tornado.web import FallbackHandler, Application, StaticFileHandler from tornado.options import parse_command_line
from tornado.web import Application, FallbackHandler, StaticFileHandler
from tornado.websocket import WebSocketHandler from tornado.websocket import WebSocketHandler
from tornado.wsgi import WSGIContainer from tornado.wsgi import WSGIContainer
from tornado.options import parse_command_line
from django.core.handlers.wsgi import WSGIHandler as Django_WSGIHandler
from django.conf import settings
from django.utils.translation import ugettext as _
class DjangoStaticFileHandler(StaticFileHandler): class DjangoStaticFileHandler(StaticFileHandler):

View File

@ -12,8 +12,6 @@
import json import json
from cStringIO import StringIO from cStringIO import StringIO
from reportlab.platypus import SimpleDocTemplate, Spacer
from reportlab.lib.units import cm
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
@ -32,7 +30,6 @@ from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
from django.views import generic as django_views from django.views import generic as django_views
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.views.generic.list import TemplateResponseMixin
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.platypus import SimpleDocTemplate, Spacer from reportlab.platypus import SimpleDocTemplate, Spacer

View File

@ -5,7 +5,7 @@
Fabric==1.6.1 Fabric==1.6.1
coverage==3.6 coverage==3.6
django-discover-runner==0.4 django-discover-runner==0.4
pep8==1.4.5 flake8==2.0
# Requirements for OpenSlides handbook/documentation # Requirements for OpenSlides handbook/documentation
Sphinx==1.2b1 Sphinx==1.2b1

View File

@ -10,9 +10,9 @@
from django.test.client import Client from django.test.client import Client
from openslides.utils.test import TestCase
from openslides.config.api import config from openslides.config.api import config
from openslides.participant.models import User from openslides.participant.models import User
from openslides.utils.test import TestCase
class PersonalInfoWidget(TestCase): class PersonalInfoWidget(TestCase):
@ -79,8 +79,8 @@ class PersonalInfoWidget(TestCase):
if motion: if motion:
motion_1 = motion.models.Motion.objects.create(title='My Motion Title pa8aeNohYai0ahge', text='My Motion Text') motion_1 = motion.models.Motion.objects.create(title='My Motion Title pa8aeNohYai0ahge', text='My Motion Text')
motion_2 = motion.models.Motion.objects.create(title='My Motion Title quielohL7vah1weochai', text='My Motion Text') motion_2 = motion.models.Motion.objects.create(title='My Motion Title quielohL7vah1weochai', text='My Motion Text')
submitter_1 = motion.models.MotionSubmitter.objects.create(motion=motion_1, person=self.user) motion.models.MotionSubmitter.objects.create(motion=motion_1, person=self.user)
submitter_2 = motion.models.MotionSubmitter.objects.create(motion=motion_2, person=self.user) motion.models.MotionSubmitter.objects.create(motion=motion_2, person=self.user)
response = self.client.get('/projector/dashboard/') response = self.client.get('/projector/dashboard/')
self.assertContains(response, 'I submitted the following motions:', status_code=200) self.assertContains(response, 'I submitted the following motions:', status_code=200)
self.assertContains(response, 'My Motion Title pa8aeNohYai0ahge', status_code=200) self.assertContains(response, 'My Motion Title pa8aeNohYai0ahge', status_code=200)
@ -91,8 +91,8 @@ class PersonalInfoWidget(TestCase):
if motion: if motion:
motion_1 = motion.models.Motion.objects.create(title='My Motion Title jahN9phaiThae5ooKubu', text='My Motion Text') motion_1 = motion.models.Motion.objects.create(title='My Motion Title jahN9phaiThae5ooKubu', text='My Motion Text')
motion_2 = motion.models.Motion.objects.create(title='My Motion Title vech9ash8aeh9eej2Ga2', text='My Motion Text') motion_2 = motion.models.Motion.objects.create(title='My Motion Title vech9ash8aeh9eej2Ga2', text='My Motion Text')
supporter_1 = motion.models.MotionSupporter.objects.create(motion=motion_1, person=self.user) motion.models.MotionSupporter.objects.create(motion=motion_1, person=self.user)
supporter_2 = motion.models.MotionSupporter.objects.create(motion=motion_2, person=self.user) motion.models.MotionSupporter.objects.create(motion=motion_2, person=self.user)
config['motion_min_supporters'] = 1 config['motion_min_supporters'] = 1
response = self.client.get('/projector/dashboard/') response = self.client.get('/projector/dashboard/')
self.assertContains(response, 'I support the following motions:', status_code=200) self.assertContains(response, 'I support the following motions:', status_code=200)

View File

@ -9,12 +9,11 @@
from django.test.client import Client from django.test.client import Client
from openslides.agenda.models import Item, Speaker
from openslides.participant.models import Group, User
from openslides.projector.api import set_active_slide
from openslides.utils.exceptions import OpenSlidesError from openslides.utils.exceptions import OpenSlidesError
from openslides.utils.test import TestCase from openslides.utils.test import TestCase
from openslides.participant.models import User, Group
from openslides.agenda.models import Item, Speaker
from openslides.config.api import config
from openslides.projector.api import set_active_slide
class ListOfSpeakerModelTests(TestCase): class ListOfSpeakerModelTests(TestCase):
@ -151,7 +150,7 @@ class TestAgendaItemView(SpeakerViewTestCase):
group = Group.objects.create(name='test', group_as_person=True) group = Group.objects.create(name='test', group_as_person=True)
Speaker.objects.add(group, self.item1) Speaker.objects.add(group, self.item1)
self.assertTrue(Speaker.objects.filter(person=group.person_id, item=self.item1).exists()) self.assertTrue(Speaker.objects.filter(person=group.person_id, item=self.item1).exists())
response = self.admin_client.get('/agenda/1/') self.admin_client.get('/agenda/1/')
class TestSpeakerDeleteView(SpeakerViewTestCase): class TestSpeakerDeleteView(SpeakerViewTestCase):
@ -167,7 +166,7 @@ class TestSpeakerDeleteView(SpeakerViewTestCase):
self.assertFalse(Speaker.objects.filter(person=self.speaker1, item=self.item1).exists()) self.assertFalse(Speaker.objects.filter(person=self.speaker1, item=self.item1).exists())
def test_post_as_user(self): def test_post_as_user(self):
speaker = Speaker.objects.add(self.speaker1, self.item1) Speaker.objects.add(self.speaker1, self.item1)
response = self.speaker1_client.post( response = self.speaker1_client.post(
'/agenda/1/speaker/del/', {'yes': 'yes'}) '/agenda/1/speaker/del/', {'yes': 'yes'})
@ -204,11 +203,11 @@ class TestSpeakerEndSpeachView(SpeakerViewTestCase):
class SpeakerListOpenView(SpeakerViewTestCase): class SpeakerListOpenView(SpeakerViewTestCase):
def test_get(self): def test_get(self):
response = self.check_url('/agenda/1/speaker/close/', self.admin_client, 302) self.check_url('/agenda/1/speaker/close/', self.admin_client, 302)
item = Item.objects.get(pk=self.item1.pk) item = Item.objects.get(pk=self.item1.pk)
self.assertTrue(item.speaker_list_closed) self.assertTrue(item.speaker_list_closed)
response = self.check_url('/agenda/1/speaker/reopen/', self.admin_client, 302) self.check_url('/agenda/1/speaker/reopen/', self.admin_client, 302)
item = Item.objects.get(pk=self.item1.pk) item = Item.objects.get(pk=self.item1.pk)
self.assertFalse(item.speaker_list_closed) self.assertFalse(item.speaker_list_closed)

View File

@ -10,16 +10,14 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.test.client import Client
from django.db.models.query import EmptyQuerySet from django.db.models.query import EmptyQuerySet
from django.test.client import Client
from openslides.utils.test import TestCase
from openslides.projector.api import get_active_slide, set_active_slide
from openslides.participant.models import User
from openslides.agenda.models import Item from openslides.agenda.models import Item
from openslides.agenda.slides import agenda_slide from openslides.participant.models import User
from openslides.utils.test import TestCase
from .models import RelatedItem, BadRelatedItem from .models import BadRelatedItem, RelatedItem
class ItemTest(TestCase): class ItemTest(TestCase):

View File

@ -10,10 +10,10 @@
from django.test.client import Client from django.test.client import Client
from openslides.utils.test import TestCase
from openslides.agenda.models import Item from openslides.agenda.models import Item
from openslides.assignment.models import Assignment from openslides.assignment.models import Assignment
from openslides.participant.models import User from openslides.participant.models import User
from openslides.utils.test import TestCase
class AssignmentModelTest(TestCase): class AssignmentModelTest(TestCase):

View File

@ -10,10 +10,9 @@
from django.test.client import Client from django.test.client import Client
from openslides.config.api import config
from openslides.utils.test import TestCase
from openslides.assignment.models import Assignment from openslides.assignment.models import Assignment
from openslides.participant.models import User, Group from openslides.participant.models import Group, User
from openslides.utils.test import TestCase
class AssignmentViewTestCase(TestCase): class AssignmentViewTestCase(TestCase):

View File

@ -8,17 +8,18 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.test.client import Client
from django.dispatch import receiver
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
from django import forms from django import forms
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.dispatch import receiver
from django.test.client import Client
from openslides.utils.test import TestCase from openslides.config.api import (config, ConfigGroup, ConfigGroupedPage,
from openslides.participant.models import User ConfigPage, ConfigVariable)
from openslides.config.api import config, ConfigGroupedPage, ConfigPage, ConfigGroup, ConfigVariable
from openslides.config.signals import config_signal
from openslides.config.exceptions import ConfigError, ConfigNotFound from openslides.config.exceptions import ConfigError, ConfigNotFound
from openslides.config.signals import config_signal
from openslides.participant.models import User
from openslides.utils.test import TestCase
class HandleConfigTest(TestCase): class HandleConfigTest(TestCase):

View File

@ -8,10 +8,10 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.template import Template, Context from django.template import Context, Template
from openslides.utils.test import TestCase
from openslides.config.api import config from openslides.config.api import config
from openslides.utils.test import TestCase
from .models import TestModel from .models import TestModel

View File

@ -10,14 +10,14 @@
from django.test.client import Client from django.test.client import Client
from openslides.utils.test import TestCase
from openslides import get_version from openslides import get_version
from openslides.participant.models import User from openslides.participant.models import User
from openslides.utils.test import TestCase
class VersionViewTest(TestCase): class VersionViewTest(TestCase):
def test_get(self): def test_get(self):
user = User.objects.create_user('CoreMaximilian', 'xxx@xx.xx', 'default') User.objects.create_user('CoreMaximilian', 'xxx@xx.xx', 'default')
client = Client() client = Client()
client.login(username='CoreMaximilian', password='default') client.login(username='CoreMaximilian', password='default')
response = client.get('/version/') response = client.get('/version/')

View File

@ -8,10 +8,9 @@
""" """
from django import forms from django import forms
from django.db import models
from openslides.utils.test import TestCase
from openslides.utils.forms import CleanHtmlFormMixin from openslides.utils.forms import CleanHtmlFormMixin
from openslides.utils.test import TestCase
class HtmlTestForm(CleanHtmlFormMixin, forms.Form): class HtmlTestForm(CleanHtmlFormMixin, forms.Form):

View File

@ -13,15 +13,15 @@
import os import os
import tempfile import tempfile
from django.test.client import Client
from django.core.files.uploadedfile import SimpleUploadedFile
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test.client import Client
from openslides.utils.test import TestCase
from openslides.mediafile.models import Mediafile from openslides.mediafile.models import Mediafile
from openslides.participant.models import User from openslides.participant.models import User
from openslides.utils.test import TestCase
class MediafileTest(TestCase): class MediafileTest(TestCase):
@ -33,7 +33,6 @@ class MediafileTest(TestCase):
ct = ContentType.objects.get(app_label='mediafile', model='mediafile') ct = ContentType.objects.get(app_label='mediafile', model='mediafile')
perm_1 = Permission.objects.get(content_type=ct, codename='can_see') perm_1 = Permission.objects.get(content_type=ct, codename='can_see')
perm_2 = Permission.objects.get(content_type=ct, codename='can_upload') perm_2 = Permission.objects.get(content_type=ct, codename='can_upload')
perm_3 = Permission.objects.get(content_type=ct, codename='can_manage')
# Setup three different users # Setup three different users
self.manager = User.objects.get(pk=1) self.manager = User.objects.get(pk=1)

View File

@ -8,14 +8,13 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
import StringIO
import os import os
import StringIO
from django.test.client import Client from django.test.client import Client
from openslides.config.api import config
from openslides.motion.models import Motion, Category
from openslides.motion.csv_import import import_motions from openslides.motion.csv_import import import_motions
from openslides.motion.models import Category, Motion
from openslides.participant.models import User from openslides.participant.models import User
from openslides.utils.test import TestCase from openslides.utils.test import TestCase

View File

@ -8,11 +8,11 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from openslides.utils.test import TestCase
from openslides.participant.models import User
from openslides.config.api import config from openslides.config.api import config
from openslides.motion.models import Motion, Workflow, State
from openslides.motion.exceptions import WorkflowError from openslides.motion.exceptions import WorkflowError
from openslides.motion.models import Motion, State, Workflow
from openslides.participant.models import User
from openslides.utils.test import TestCase
class ModelTest(TestCase): class ModelTest(TestCase):
@ -58,7 +58,6 @@ class ModelTest(TestCase):
motion.title = 'v2' motion.title = 'v2'
motion.save(use_version=motion.get_new_version()) motion.save(use_version=motion.get_new_version())
v2_version = motion.get_last_version()
motion.title = 'v3' motion.title = 'v3'
motion.save(use_version=motion.get_new_version()) motion.save(use_version=motion.get_new_version())
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
@ -122,8 +121,8 @@ class ModelTest(TestCase):
state_1.save() state_1.save()
def test_two_empty_identifiers(self): def test_two_empty_identifiers(self):
motion1 = Motion.objects.create(title='foo', text='bar', identifier='') Motion.objects.create(title='foo', text='bar', identifier='')
motion2 = Motion.objects.create(title='foo2', text='bar2', identifier='') Motion.objects.create(title='foo2', text='bar2', identifier='')
def test_do_not_create_new_version_when_permit_old_version(self): def test_do_not_create_new_version_when_permit_old_version(self):
motion = Motion() motion = Motion()

View File

@ -11,9 +11,9 @@
from django.test.client import Client from django.test.client import Client
from openslides.config.api import config from openslides.config.api import config
from openslides.motion.models import Category, Motion, MotionLog, State
from openslides.participant.models import Group, User
from openslides.utils.test import TestCase from openslides.utils.test import TestCase
from openslides.participant.models import User, Group
from openslides.motion.models import Motion, State, Category, MotionLog
class MotionViewTestCase(TestCase): class MotionViewTestCase(TestCase):
@ -152,9 +152,9 @@ class TestMotionCreateView(MotionViewTestCase):
def test_log(self): def test_log(self):
self.assertFalse(MotionLog.objects.all().exists()) self.assertFalse(MotionLog.objects.all().exists())
response = self.admin_client.post(self.url, {'title': 'new motion', self.admin_client.post(self.url, {'title': 'new motion',
'text': 'motion text', 'text': 'motion text',
'workflow': 1}) 'workflow': 1})
self.assertEqual(MotionLog.objects.get(pk=1).message_list, ['Motion created']) self.assertEqual(MotionLog.objects.get(pk=1).message_list, ['Motion created'])
@ -328,39 +328,39 @@ class TestMotionUpdateView(MotionViewTestCase):
# Update motion without versioning # Update motion without versioning
self.assertFalse(self.motion1.state.versioning) self.assertFalse(self.motion1.state.versioning)
response = self.admin_client.post(self.url, {'title': 'new motion_title', self.admin_client.post(self.url, {'title': 'new motion_title',
'text': 'motion text', 'text': 'motion text',
'workflow': 2}) 'workflow': 2})
self.assertEqual(MotionLog.objects.get(pk=1).message_list, ['Motion version', ' 1 ', 'updated']) self.assertEqual(MotionLog.objects.get(pk=1).message_list, ['Motion version', ' 1 ', 'updated'])
# Update motion by creating a new version # Update motion by creating a new version
self.motion1.set_state(6) # Set to state 'permitted' which has versioning=True self.motion1.set_state(6) # Set to state 'permitted' which has versioning=True
self.assertTrue(self.motion1.state.versioning) self.assertTrue(self.motion1.state.versioning)
self.motion1.save(use_version=False) self.motion1.save(use_version=False)
response = self.admin_client.post(self.url, {'title': 'new motion_title', self.admin_client.post(self.url, {'title': 'new motion_title',
'text': 'new motion text', 'text': 'new motion text',
'workflow': 2}) 'workflow': 2})
self.assertEqual(MotionLog.objects.get(pk=2).message_list, ['Motion version', ' 2 ', 'created']) self.assertEqual(MotionLog.objects.get(pk=2).message_list, ['Motion version', ' 2 ', 'created'])
# Update motion with so called 'trivial changes' # Update motion with so called 'trivial changes'
config['motion_allow_disable_versioning'] = True config['motion_allow_disable_versioning'] = True
response = self.admin_client.post(self.url, {'title': 'new motion_title', self.admin_client.post(self.url, {'title': 'new motion_title',
'text': 'more new motion text', 'text': 'more new motion text',
'disable_versioning': 'on', 'disable_versioning': 'on',
'workflow': 2}) 'workflow': 2})
self.assertEqual(MotionLog.objects.get(pk=3).message_list, ['Motion version', ' 2 ', 'updated']) self.assertEqual(MotionLog.objects.get(pk=3).message_list, ['Motion version', ' 2 ', 'updated'])
# Update motion without changes in the version data # Update motion without changes in the version data
response = self.admin_client.post(self.url, {'title': 'new motion_title', self.admin_client.post(self.url, {'title': 'new motion_title',
'text': 'more new motion text', 'text': 'more new motion text',
'workflow': 2}) 'workflow': 2})
self.assertEqual(MotionLog.objects.get(pk=4).message_list, ['Motion version', ' 2 ', 'updated']) self.assertEqual(MotionLog.objects.get(pk=4).message_list, ['Motion version', ' 2 ', 'updated'])
# Update motion without changes in the version data but also with the 'trivial changes' flag # Update motion without changes in the version data but also with the 'trivial changes' flag
response = self.admin_client.post(self.url, {'title': 'new motion_title', self.admin_client.post(self.url, {'title': 'new motion_title',
'text': 'more new motion text', 'text': 'more new motion text',
'disable_versioning': 'on', 'disable_versioning': 'on',
'workflow': 2}) 'workflow': 2})
self.assertEqual(MotionLog.objects.get(pk=5).message_list, ['Motion version', ' 2 ', 'updated']) self.assertEqual(MotionLog.objects.get(pk=5).message_list, ['Motion version', ' 2 ', 'updated'])
@ -376,7 +376,7 @@ class TestMotionDeleteView(MotionViewTestCase):
def test_delegate(self): def test_delegate(self):
response = self.delegate_client.post('/motion/2/del/', {'yes': 'yes'}) response = self.delegate_client.post('/motion/2/del/', {'yes': 'yes'})
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
motion = Motion.objects.get(pk=2).add_submitter(self.delegate) Motion.objects.get(pk=2).add_submitter(self.delegate)
response = self.delegate_client.post('/motion/2/del/', {'yes': 'yes'}) response = self.delegate_client.post('/motion/2/del/', {'yes': 'yes'})
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
@ -404,7 +404,7 @@ class TestVersionPermitView(MotionViewTestCase):
self.motion1.active_version = new_version self.motion1.active_version = new_version
self.motion1.save() self.motion1.save()
self.assertEqual(self.motion1.versions.count(), 2) self.assertEqual(self.motion1.versions.count(), 2)
response = self.admin_client.post('/motion/1/version/1/permit/', {'yes': 1}) self.admin_client.post('/motion/1/version/1/permit/', {'yes': 1})
self.motion1 = Motion.objects.get(pk=1) self.motion1 = Motion.objects.get(pk=1)
self.assertEqual(self.motion1.active_version, first_version) self.assertEqual(self.motion1.active_version, first_version)
self.assertEqual(self.motion1.versions.count(), 2) self.assertEqual(self.motion1.versions.count(), 2)

View File

@ -8,12 +8,10 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from openslides.utils.test import TestCase from openslides.participant.api import gen_password, gen_username
from openslides.participant.models import Group, User
from openslides.utils.person import get_person, Persons from openslides.utils.person import get_person, Persons
from openslides.utils.test import TestCase
from openslides.participant.models import User, Group
from openslides.participant.api import gen_username, gen_password
class UserTest(TestCase): class UserTest(TestCase):

View File

@ -10,9 +10,8 @@
from django.test.client import Client from django.test.client import Client
from openslides.participant.models import Group, User
from openslides.utils.test import TestCase from openslides.utils.test import TestCase
from openslides.config.api import config
from openslides.participant.models import User, Group
class TestUmlautUser(TestCase): class TestUmlautUser(TestCase):

View File

@ -8,10 +8,9 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from openslides.utils.test import TestCase
from openslides.participant.models import User
from openslides.participant.api import gen_username from openslides.participant.api import gen_username
from openslides.participant.models import User
from openslides.utils.test import TestCase
class UserGenUsername(TestCase): class UserGenUsername(TestCase):

View File

@ -9,11 +9,12 @@
""" """
import re import re
from django.test.client import Client from django.test.client import Client
from openslides.config.api import config from openslides.config.api import config
from openslides.participant.models import get_protected_perm, Group, User
from openslides.utils.test import TestCase from openslides.utils.test import TestCase
from openslides.participant.models import User, Group, get_protected_perm
class GroupViews(TestCase): class GroupViews(TestCase):

View File

@ -1,9 +1,8 @@
from django.db import models from django.db import models
from django.dispatch import receiver from django.dispatch import receiver
from openslides.utils.person.models import PersonMixin, PersonField from openslides.utils.person.models import PersonField, PersonMixin
from openslides.utils.person.signals import receive_persons from openslides.utils.person.signals import receive_persons
from openslides.utils.person.api import Person
class TestPerson(PersonMixin, models.Model): class TestPerson(PersonMixin, models.Model):

View File

@ -10,14 +10,12 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.test.client import Client
from django.db.models.query import EmptyQuerySet
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from openslides.utils.test import TestCase
from openslides.utils.person.api import get_person from openslides.utils.person.api import get_person
from openslides.utils.test import TestCase
from .models import TestPerson, TestModel from .models import TestModel, TestPerson
class PersonTest(TestCase): class PersonTest(TestCase):

View File

@ -20,7 +20,7 @@ from openslides.utils.test import TestCase
class WidgetObject(TestCase): class WidgetObject(TestCase):
def test_error(self): def test_error(self):
with self.assertRaises(OpenSlidesError): with self.assertRaises(OpenSlidesError):
w = Widget(HttpRequest(), name='chahghuyeim8ie0Noong') Widget(HttpRequest(), name='chahghuyeim8ie0Noong')
def test_repr(self): def test_repr(self):
w = Widget(HttpRequest(), name='abcdefgäöüß', html='<strong>html</strong>') w = Widget(HttpRequest(), name='abcdefgäöüß', html='<strong>html</strong>')

View File

@ -1,8 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import openslides.main from openslides.global_settings import * # noqa
from openslides.global_settings import *
# Use 'DEBUG = True' to get more details for server errors # Use 'DEBUG = True' to get more details for server errors
# (Default for releases: 'False') # (Default for releases: 'False')

View File

@ -7,7 +7,7 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from openslides import get_version, get_git_commit_id from openslides import get_git_commit_id, get_version
from openslides.utils.test import TestCase from openslides.utils.test import TestCase

View File

@ -10,16 +10,12 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.contrib.messages.storage import default_storage
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import clear_url_caches from django.core.urlresolvers import clear_url_caches
from django.dispatch import receiver
from django.http.response import HttpResponseNotAllowed
from django.test import RequestFactory from django.test import RequestFactory
from django.test.client import Client from django.test.client import Client
from django.test.utils import override_settings from django.test.utils import override_settings
from openslides.participant.models import User
from openslides.utils import views from openslides.utils import views
from openslides.utils.signals import template_manipulation from openslides.utils.signals import template_manipulation
from openslides.utils.test import TestCase from openslides.utils.test import TestCase
@ -38,7 +34,6 @@ class ViewTestCase(TestCase):
class LoginMixinTest(ViewTestCase): class LoginMixinTest(ViewTestCase):
def test_dispatch(self): def test_dispatch(self):
view = test_views.LoginMixinView.as_view()
client = Client() client = Client()
response = client.get('/login_mixin/') response = client.get('/login_mixin/')
self.assertEqual(response['Location'], 'http://testserver/login/?next=/login_mixin/') self.assertEqual(response['Location'], 'http://testserver/login/?next=/login_mixin/')