diff --git a/.travis.yml b/.travis.yml index ade84bd88..4772bb138 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ python: - "2.6" - "2.7" install: - - easy_install https://www.djangoproject.com/download/1.5b2/tarball/ + - easy_install https://www.djangoproject.com/download/1.5c1/tarball/ - pip install -r requirements.txt --use-mirrors - python extras/scripts/create_local_settings.py script: - coverage run ./manage.py test tests && coverage report -m - - pep8 --max-line-length=150 --exclude="urls.py,motion/" --statistics openslides + - pep8 --max-line-length=150 --exclude="urls.py," --statistics openslides diff --git a/CHANGELOG b/CHANGELOG index 2f86821bf..bf0daaa0e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,18 @@ CHANGELOG of OpenSlides http://openslides.org +Version 1.4 (unreleased) +======================== + + +Version 1.3.1 (2013-01-09) +========================== +[http://dev.openslides.org/milestone/1.3.1] + +- Fixed unwanted automatical language switching on projector view if more than + one browser languages send projector request to OpenSlides (#434) + + Version 1.3 (2012-12-10) ======================== [http://dev.openslides.org/milestone/1.3] diff --git a/INSTALL.txt b/INSTALL.txt index 739431350..4f3c5e6a0 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -18,7 +18,11 @@ I. Installation on GNU/Linux and MacOSX using the Python Package Index (PyPI) 1. Check requirements: Make sure that you have installed Python Programming Language 2 - (>= 2.6) on your system. + (>= 2.6) on your system. You will also need the Python + development headers. + + E. g. for Ubuntu run: + $ sudo apt-get install python-dev 2. Setup a virtual environment with virtualenv (optional): diff --git a/README.txt b/README.txt index 0485a2203..cdbe0880b 100644 --- a/README.txt +++ b/README.txt @@ -2,7 +2,7 @@ English README file for OpenSlides ================================== -This is OpenSlides, version 1.3.1 (unreleased). +This is OpenSlides, version 1.4.0 (unreleased). What is OpenSlides? diff --git a/THANKS b/THANKS index b4039e3ef..82e322535 100644 --- a/THANKS +++ b/THANKS @@ -12,14 +12,14 @@ OpenSlides uses parts of the following projects: * jQuery UI +* Twitter Bootstrap + + * ReportLab * Drupal (tabledrag function) -* Oxygen-Icons - - * Ubuntu TrueType Font diff --git a/extras/benchmark/bench.py b/extras/benchmark/bench.py index 7b9ca4178..31e886d01 100755 --- a/extras/benchmark/bench.py +++ b/extras/benchmark/bench.py @@ -31,12 +31,8 @@ URL_SETS = { "/jsi18n/", "/static/styles/base.css", "/static/javascript/utils.js", - "/static/javascript/jquery.js", - "/static/images/bg-submenu.gif", - "/static/images/bg-header.gif", - "/static/images/logo.png", - "/static/images/icons/dialog-information.png", - "/static/images/icons/cross.png", + "/static/javascript/jquery.min.js", + "/static/img/logo.png", ], "agenda": [ "/agenda/", @@ -44,25 +40,15 @@ URL_SETS = { "/static/styles/tabledrag.css", "/static/javascript/utils.js", "/static/styles/agenda.css", - "/static/javascript/jquery.js", + "/static/javascript/jquery.min.js", "/jsi18n/", - "/static/images/bg-header.gif", - "/static/images/bg-submenu.gif", - "/static/images/logo.png", - "/static/images/icons/application-pdf.png", - "/static/images/icons/cross.png", ], "application": [ "/application/", "/static/styles/base.css", "/static/javascript/utils.js", - "/static/javascript/jquery.js", + "/static/javascript/jquery.min.js", "/jsi18n/", - "/static/images/bg-header.gif", - "/static/images/bg-submenu.gif", - "/static/images/icons/cross.png", - "/static/images/logo.png", - "/static/images/icons/application-pdf.png", ] } diff --git a/openslides/agenda/static/images/icons/summary.png b/openslides/agenda/static/images/icons/summary.png deleted file mode 100644 index 0f8264c78..000000000 Binary files a/openslides/agenda/static/images/icons/summary.png and /dev/null differ diff --git a/openslides/agenda/static/javascript/agenda.js b/openslides/agenda/static/javascript/agenda.js index 93b2db91c..69432803f 100644 --- a/openslides/agenda/static/javascript/agenda.js +++ b/openslides/agenda/static/javascript/agenda.js @@ -20,7 +20,7 @@ function hideClosedSlides(hide) { if (hide) { $('#hidelink').attr('title', 'show'); $('#hidelink').removeClass('hide').addClass('show'); - $('.close_link.closed').parent().parent().each(function() { + $('.close_link .icon-checked-new').parent().parent().parent().each(function() { hideLine($(this)); }); hidden = $('#menu-overview tr:hidden').size(); @@ -35,21 +35,26 @@ function hideClosedSlides(hide) { } $(function() { - $('.close_link a').click(function(event) { + // change participant status (on/off) + $('.close_link').click(function(event) { event.preventDefault(); - slide = $(this); + var link = $(this); $.ajax({ type: 'GET', - url: slide.attr('href'), + url: $(this).attr('href'), dataType: 'json', success: function(data) { if (data.closed) { - newclass = 'closed'; + newclass = 'icon-checked-new'; + link.parent().parent().addClass('offline'); + link.addClass('btn-success'); } else { - newclass = 'open'; + newclass = 'icon-unchecked-new'; + link.parent().parent().removeClass('offline'); + link.removeClass('btn-success'); } - slide.parent().removeClass('closed open').addClass(newclass); - slide.attr('href', data.link); + link.children('i').removeClass('icon-checked-new icon-unchecked-new').addClass(newclass); + link.attr('href', data.link); } }); }); diff --git a/openslides/agenda/static/styles/agenda.css b/openslides/agenda/static/styles/agenda.css index 3a35060b3..45c80fda1 100644 --- a/openslides/agenda/static/styles/agenda.css +++ b/openslides/agenda/static/styles/agenda.css @@ -5,23 +5,11 @@ * :license: GNU GPL, see LICENSE for more details. */ -/* agenda item open/closed */ -.close_link span { - background-image: url(../images/icons/close-grey.png); - background-repeat: no-repeat; - background-position: center; - width: 16px; - height: 16px; - display: inline-block; +tr.topline td { + border-bottom: 1px solid #333333; + background-color: #CDCDCD; } -.close_link.closed span { - background-image: url(../images/icons/close.png); -} - -table#menu-overview { - white-space: nowrap; -} table#agendatime { float: right; diff --git a/openslides/agenda/templates/agenda/base_agenda.html b/openslides/agenda/templates/agenda/base_agenda.html deleted file mode 100644 index be70f6f40..000000000 --- a/openslides/agenda/templates/agenda/base_agenda.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block submenu %} - {% url 'item_overview' as url_itemoverview %} - {% url 'item_new' as url_itemnew %} -

{% trans "Agenda" %}

- - - {# second submenu #} - {% if item %} -
-

{{ item.title }}

- - {% endif %} -{% endblock %} - diff --git a/openslides/agenda/templates/agenda/config.html b/openslides/agenda/templates/agenda/config.html index bb273a70f..a749108b2 100644 --- a/openslides/agenda/templates/agenda/config.html +++ b/openslides/agenda/templates/agenda/config.html @@ -65,8 +65,9 @@ {% block content %} -

{% trans "Agenda settings" %}

- +

{% trans "Configuration" %}: {% trans "Agenda" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

{% csrf_token %} {{ form.as_p }}

diff --git a/openslides/agenda/templates/agenda/edit.html b/openslides/agenda/templates/agenda/edit.html index f5060d1f0..4c5d86455 100644 --- a/openslides/agenda/templates/agenda/edit.html +++ b/openslides/agenda/templates/agenda/edit.html @@ -1,4 +1,4 @@ -{% extends "agenda/base_agenda.html" %} +{% extends "base.html" %} {% load i18n %} @@ -12,24 +12,22 @@ {% endblock %} {% block content %} - {% if item %} -

{% trans "Edit item" %}

- {% else %} -

{% trans "New item" %}

- {% endif %} +

+ {% if item %} + {% trans "Edit item" %} + {% else %} + {% trans "New item" %} + {% endif %} + + {% trans "Back to overview" %} + +

{% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

- - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %}

* {% trans "required" %} diff --git a/openslides/agenda/templates/agenda/item_row.html b/openslides/agenda/templates/agenda/item_row.html index 2f86d27d0..723cd6915 100644 --- a/openslides/agenda/templates/agenda/item_row.html +++ b/openslides/agenda/templates/agenda/item_row.html @@ -1,17 +1,17 @@ {% load i18n %} -{% load staticfiles %} {% load tags %} - - {% if perms.agenda.can_manage_agenda %} - - - - {% elif item.closed %} - - {% endif %} - + {% if perms.agenda.can_manage_agenda %} + + + + {% else %} + + + + {% endif %} {% for p in item.get_ancestors %} @@ -24,8 +24,8 @@ {{ item.get_title_supplement|safe }} {% if perms.agenda.can_manage_agenda %} - - {{ item.comment|first_line }} + + {{ item.comment|first_line }} {% endif %} {% if perms.agenda.can_see_orga_items %} @@ -39,28 +39,32 @@ {% if perms.projector.can_manage_projector %} - - + + {% endif %} {% if perms.agenda.can_manage_agenda %} - - + + + + + + {% if not item.is_leaf_node %} - - + + {% endif %} {% endif %} {% endif %} - {% if perms.agenda.can_manage_agenda %} - + {% with form=item.weight_form %} {{ form.weight }} {{ form.self }} {{ form.parent }} {% endwith %} - {% endif %} + + diff --git a/openslides/agenda/templates/agenda/overview.html b/openslides/agenda/templates/agenda/overview.html index a72a8b286..4f714cb72 100644 --- a/openslides/agenda/templates/agenda/overview.html +++ b/openslides/agenda/templates/agenda/overview.html @@ -1,4 +1,4 @@ -{% extends "agenda/base_agenda.html" %} +{% extends "base.html" %} {% load tags %} {% load i18n %} @@ -10,11 +10,13 @@ {% block header %} +{% endblock %} + +{% block javascript %} {% if perms.agenda.can_manage_agenda %} - -{% endblock %} - -{% block submenu %} - {% url 'assignment_overview' as url_assignment_overview %} -

{% trans "Elections" %}

- - - {# second submenu #} - {% if assignment %} -
-

{{assignment}}

- - {% endif %} -{% endblock %} diff --git a/openslides/assignment/templates/assignment/config.html b/openslides/assignment/templates/assignment/config.html index 52ba0598d..2de60af06 100644 --- a/openslides/assignment/templates/assignment/config.html +++ b/openslides/assignment/templates/assignment/config.html @@ -5,18 +5,19 @@ {% block title %}{{ block.super }} – {% trans "Election settings" %}{% endblock %} {% block content %} -

{% trans "Election settings" %}

+

+ {% trans "Configuration" %} + {% trans "Elections" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

{% csrf_token %} - {{ form.as_p }} -

- - - - -

+ {% include "form.html" %} +

+ {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %} + +

+ * {% trans "required" %}
{% endblock %} diff --git a/openslides/assignment/templates/assignment/edit.html b/openslides/assignment/templates/assignment/edit.html index 1d3b1c0a7..e5f56e87f 100644 --- a/openslides/assignment/templates/assignment/edit.html +++ b/openslides/assignment/templates/assignment/edit.html @@ -1,4 +1,4 @@ -{% extends "assignment/base_assignment.html" %} +{% extends "base.html" %} {% load i18n %} @@ -11,27 +11,24 @@ {% endif %} {% endblock %} - {% block content %} - {% if assignment %} -

{% trans "Edit election" %}

- {% else %} -

{% trans "New election" %}

- {% endif %} +

+ {% if assignment %} + {% trans "Edit election" %} + {% else %} + {% trans "New election" %} + {% endif %} + + {% trans "Back to overview" %} + +

{% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

- - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %}

* {% trans "required" %} diff --git a/openslides/assignment/templates/assignment/overview.html b/openslides/assignment/templates/assignment/overview.html index c385be57e..afd499d48 100644 --- a/openslides/assignment/templates/assignment/overview.html +++ b/openslides/assignment/templates/assignment/overview.html @@ -1,35 +1,44 @@ -{% extends "assignment/base_assignment.html" %} +{% extends "base.html" %} {% load i18n %} -{% load staticfiles %} {% block title %}{{ block.super }} – {% trans "Elections" %}{% endblock %} -{% block content %} -

{% trans "Elections" %}

-

+{% block content %} +

{% trans "Elections" %} + + {% if perms.assignment.can_manage_assignment %} + {% trans "New" %} + {% endif %} + {% if perms.assignment.can_see_assignment %} + PDF + {% endif %} + +

+ + {% trans "Filter" %}: - -
-

- {{ assignments|length }} - {% blocktrans count counter=assignments|length %}election{% plural %}elections{% endblocktrans %} - + + + {{ assignments|length }} + {% blocktrans count counter=assignments|length %}election{% plural %}elections{% endblocktrans %} + +
- - + + {% for assignment in assignments %} - + - + diff --git a/openslides/assignment/templates/assignment/poll_view.html b/openslides/assignment/templates/assignment/poll_view.html index 7b41a247d..3a43b6f32 100644 --- a/openslides/assignment/templates/assignment/poll_view.html +++ b/openslides/assignment/templates/assignment/poll_view.html @@ -1,19 +1,35 @@ -{% extends 'assignment/base_assignment.html' %} +{% extends 'base.html' %} {% load i18n %} {% block title %}{{ block.super }} – {% trans "Election" %} "{{ assignment }}" – {{ ballotnumber }}. {% trans "ballot" %}{% endblock %} {% block content %} -

{{ assignment }} – {{ ballotnumber }}. {% trans "ballot" %}

- {% if assignment.polldescription %} -

{% trans "Short description (for ballot paper)" %}: {{ assignment.polldescription }}

+

+ {{ assignment }} + + {{ ballotnumber }}. {% trans "ballot" %} + + + {% trans "Back to election" %} + + {% if perms.projector.can_manage_projector %} + + + {% endif %} - {% trans "Special values" %}: -1 = {% trans 'majority' %}; -2 = {% trans 'undocumented' %} + +

- {% csrf_token %} +{% if assignment.polldescription %} +

{% trans "Short description (for ballot paper)" %}: {{ assignment.polldescription }}

+{% endif %} -
{% trans "Election" %} {% trans "Candidates" %}{% trans "Status" %}{% trans "Actions" %}{% trans "Status" %}{% trans "Actions" %}
{{ assignment }} {% blocktrans with posts=assignment.posts context "Number of searched candidates for an election"%}posts: {{ posts }}{% endblocktrans %} @@ -38,19 +47,25 @@ {% endif %} | {% blocktrans with elected=assignment.elected|length %}elected: {{ elected }}{% endblocktrans %} {{ assignment.get_status_display }}{{ assignment.get_status_display }} {% if perms.projector.can_manage_projector %} - - + + {% endif %} {% if perms.assignment.can_manage_assignment %} - - + + + + + + {% endif %} - + + +
+

+{% trans "Special values" %}: -1 = {% trans 'majority' %} | -2 = {% trans 'undocumented' %} +

+{% csrf_token %} +
{% for value in poll.get_vote_values %} @@ -31,7 +47,7 @@ {% endfor %} {% endfor %} - + {% for value in poll.get_vote_values %} {% if forloop.first %} @@ -41,7 +57,7 @@ {% endif %} {% endfor %} - + {% for value in poll.get_vote_values %} {% if forloop.first %} @@ -54,26 +70,21 @@
{% trans "Candidates" %}
{% trans "Invalid votes" %}
{% trans "Votes cast" %}

- - + + {% trans 'Ballot paper as PDF' %}

- -

- - - - - -

- - + +
+ + + + {% trans 'Cancel' %} + +
+ {% endblock %} diff --git a/openslides/assignment/templates/assignment/view.html b/openslides/assignment/templates/assignment/view.html index c04bc8c86..b62eb98e5 100644 --- a/openslides/assignment/templates/assignment/view.html +++ b/openslides/assignment/templates/assignment/view.html @@ -1,96 +1,121 @@ -{% extends "assignment/base_assignment.html" %} +{% extends "base.html" %} {% load i18n %} {% load staticfiles %} {% block title %}{{ block.super }} – {% trans "Election" %} "{{ assignment }}"{% endblock %} +{% block header %} + +{% endblock %} + +{% block javascript %} + +{% endblock %} + {% block content %} - - -
-

{{ assignment }}

-

{{ assignment.description|linebreaks }}

+
+ + {% trans 'More actions' %} + + + +
+
+ +
+
+ +

{% trans "Description" %}

+ {% if assignment.description %} + {{ assignment.description|linebreaks }} + {% else %} + – + {% endif %} +
+ {% if assignment.status != "fin" %} -

{% trans "Candidates" %}

+

{% trans "Candidates" %}

    {% for person in assignment.get_participants %}
  1. {{ person }} {% if perms.assignment.can_manage_assignment %} {% if assignment.status == "sea" or assignment.status == "vot" %} - + {% endif %} {% endif %} {% if person in assignment.elected %} | {% trans "elected" %} {% if perms.assignment.can_manage_assignment %} {% if assignment.status == "sea" or assignment.status == "vot" %} - + + + {% endif %} {% endif %} {% endif %}
  2. {% empty %} -
  3. {% trans "No candidates available." %}
  4. +
  5. {% trans "No candidates available." %}
  6. {% endfor %}
- {% if assignment.status == "sea" or perms.assignment.can_manage_assignment and assignment.status == "vot" %} {% if perms.assignment.can_nominate_self or perms.assignment.can_nominate_other %}
{% csrf_token %} {% if perms.assignment.can_nominate_self %}

{% if user_is_candidate %} - - - {% trans 'Withdraw self candidature' %} - + + {% trans 'Withdraw self candidature' %} {% else %} - - - {% trans 'Self candidature' %} - + + {% trans 'Self candidature' %} {% endif %}

{% endif %} {% if perms.assignment.can_nominate_other %} {% for field in form %} - - {{ field }} - {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} - - {% endif %} - + +
+ {{ field }} + + {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} + + {% endif %} +
{% endfor %}

-

{% endif %}
@@ -99,11 +124,14 @@ {% endif %} {% if perms.assignment.can_manage_assignments and blocked_candidates and assignment.status != "fin" %} -

{% trans "Blocked Candidates" %}

+

{% trans "Blocked Candidates" %}

    {% for person in blocked_candidates %}
  • - {{ person }} + {{ person }} + + +
  • {% empty %}
  • {% trans "No blocked candidates available." %}
  • @@ -111,120 +139,160 @@
{% endif %} + + {% if assignment.status != "sea" or polls.exists %} -

{% trans "Election results" %}

- +

{% trans "Election results" %}

{% if polls.exists %} - - - - {% for poll in polls %} - + + + {% for poll in polls %} + {% if poll.published or perms.assignment.can_manage_assignment %} + + {% endif %} + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + + {% endif %} + +
{% trans "Candidates" %} - {{ poll.get_ballot }}. {% trans 'ballot' %} - {% if perms.assignment.can_manage_assignment %} -
- - - - - - {% endif %} + + + + {% with ballotnumber=polls.count %} + - {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - - - {% for candidate, poll_list in vote_results.items %} - - + + + {% for poll in polls %} + + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + {% endif %} - {{ candidate }} - - {% for vote in poll_list %} - + {% for candidate, poll_list in vote_results.items %} + + - {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - - {% endfor %} - - - {% for poll in polls %} - {% if poll.published or perms.assignment.can_manage_assignment %} + {% for vote in poll_list %} + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + {% endif %} + {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - - - - {% for poll in polls %} - {% if poll.published or perms.assignment.can_manage_assignment %} - + + + {% for poll in polls %} + {% if poll.published or perms.assignment.can_manage_assignment %} + + {% endif %} + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + {% endif %} - {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - -
+ {% trans "ballot" %} - - - {% trans 'New ballot' %} - - -
- {% if candidate in assignment.elected %} - {% if perms.assignment.can_manage_assignment %} - - {% else %} - - + {% endwith %} +
{% trans "Candidates" %} + {{ poll.get_ballot }}. {% trans 'ballot' %} + {% if perms.assignment.can_manage_assignment %} +
+ + {% if poll.published %} + + {% else %} + + {% endif %} + + + + {% endif %} +
+ + {% trans 'New ballot' %} - {% endif %} - {% else %} - {% if perms.assignment.can_manage_assignment %} - - {% endif %} + - {% if 'Yes' in vote and 'No' in vote and 'Abstain' in vote %} - {{ vote.Yes }}
- {{ vote.No }}
- {{ vote.Abstain }}
- {% elif 'Votes' in vote %} - {{ vote.Votes }} - {% elif vote == None %} - {% trans 'was not a
candidate'%} +
+ {% if candidate in assignment.elected %} + {% if perms.assignment.can_manage_assignment %} + + {% else %} + + + + {% endif %} {% else %} -   + {% if perms.assignment.can_manage_assignment %} + + {% endif %} {% endif %} + {{ candidate }}
{% trans 'Invalid votes' %} - {% if poll.has_votes %} - - {{ poll.print_votesinvalid }} + {% if 'Yes' in vote and 'No' in vote and 'Abstain' in vote %} + {{ vote.Yes }}
+ {{ vote.No }}
+ {{ vote.Abstain }}
+ {% elif 'Votes' in vote %} + {{ vote.Votes }} + {% elif vote == None %} + {% trans 'was not a
candidate'%} + {% else %} +   {% endif %}
{% trans 'Votes cast' %} - {% if poll.has_votes %} - - {{ poll.print_votescast }} - {% endif %} -
{% trans 'Invalid votes' %} + {% if poll.has_votes %} + + {{ poll.print_votesinvalid }} + {% endif %} +
+
{% trans 'Votes cast' %} + {% if poll.has_votes %} + + {{ poll.print_votescast }} + {% endif %} +
{% else %} - {% trans "No results available." %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} -

- - {% trans 'New ballot' %} - -

- {% endif %} + {% trans "No ballots available." %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} +

+ + {% trans 'New ballot' %} + +

+ {% endif %} {% endif %} {% endif %} -
+
+ +
+
+ +
{% trans "Status" %}:
+ {% trans assignment.get_status_display %} + +
{% trans "Number of available posts" %}:
+ {{ assignment.posts }} +
+ + {% if perms.assignment.can_manage_assignment %} +
+

{% trans "Change status" %}:

+ + + +
+ {% endif %} +
+
{% endblock %} diff --git a/openslides/assignment/templates/assignment/widget.html b/openslides/assignment/templates/assignment/widget.html index 985db4e20..d7a885b1d 100644 --- a/openslides/assignment/templates/assignment/widget.html +++ b/openslides/assignment/templates/assignment/widget.html @@ -1,21 +1,17 @@ -{% load staticfiles %} {% load i18n %} {% load tags %}
    {% for assignment in assignments %}
  • - -
    +
    + +   + + - - - - - - - - + + {{ assignment }}
  • diff --git a/openslides/assignment/templates/projector/Assignment.html b/openslides/assignment/templates/projector/Assignment.html index 35c10f64b..761e70bf1 100644 --- a/openslides/assignment/templates/projector/Assignment.html +++ b/openslides/assignment/templates/projector/Assignment.html @@ -66,7 +66,7 @@ {% if candidate in assignment.elected %} - + {% endif %} {{ candidate }} @@ -75,11 +75,11 @@ {% if not assignment_publish_winner_results_only or candidate in assignment.elected %} {% if 'Yes' in vote and 'No' in vote and 'Abstain' in vote %} - {{ vote.Yes }}
    - {{ vote.No }}
    - {{ vote.Abstain }}
    + {{ vote.Yes }}
    + {{ vote.No }}
    + {{ vote.Abstain }}
    {% elif 'Votes' in vote %} - {{ vote.Votes }} + {{ vote.Votes }} {% elif vote == None %} {% trans 'was not a
    candidate'%} {% else %} @@ -97,7 +97,7 @@ {% for poll in polls %} {% if poll.has_votes %} - + {{ poll.print_votesinvalid }} {% endif %} @@ -112,7 +112,7 @@ {% if poll.has_votes %} - + {{ poll.print_votescast }} {% endif %} diff --git a/openslides/assignment/urls.py b/openslides/assignment/urls.py index 5540b8a06..42e55b638 100644 --- a/openslides/assignment/urls.py +++ b/openslides/assignment/urls.py @@ -10,7 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import url, patterns +from django.conf.urls import url, patterns from openslides.assignment.views import (ViewPoll, AssignmentPDF, AssignmentPollPDF, AssignmentPollDelete, CreateAgendaItem) diff --git a/openslides/assignment/views.py b/openslides/assignment/views.py index f5e244732..c60f0f8d7 100644 --- a/openslides/assignment/views.py +++ b/openslides/assignment/views.py @@ -145,8 +145,9 @@ def edit(request, assignment_id=None): def delete(request, assignment_id): assignment = Assignment.objects.get(pk=assignment_id) if request.method == 'POST': - assignment.delete() - messages.success(request, _('Election %s was successfully deleted.') % assignment) + if 'submit' in request.POST: + assignment.delete() + messages.success(request, _('Election %s was successfully deleted.') % assignment) else: del_confirm_form(request, assignment) return redirect(reverse('assignment_overview')) @@ -204,16 +205,17 @@ def delother(request, assignment_id, user_id): is_blocked = assignment.is_blocked(person) if request.method == 'POST': - try: - assignment.delrun(person, blocked=False) - except Exception, e: - messages.error(request, e) - else: - if not is_blocked: - message = _("Candidate %s was withdrawn successfully.") % person + if 'submit' in request.POST: + try: + assignment.delrun(person, blocked=False) + except Exception, e: + messages.error(request, e) else: - message = _("%s was unblocked successfully.") % person - messages.success(request, message) + if not is_blocked: + message = _("Candidate %s was withdrawn successfully.") % person + else: + message = _("%s was unblocked successfully.") % person + messages.success(request, message) else: if not is_blocked: message = _("Do you really want to withdraw %s from the election?") % person @@ -318,7 +320,7 @@ class AssignmentPollDelete(DeleteView): return reverse('assignment_view', args=[self.assignment.id]) def get_success_message(self): - return _('Ballot was successfully deleted.') % self.object + return _('Ballot was successfully deleted.') % self.object class AssignmentPDF(PDFView): @@ -533,7 +535,7 @@ class AssignmentPollPDF(PDFView): pdf_document.build(story) def append_to_pdf(self, story): - imgpath = os.path.join(settings.SITE_ROOT, 'static/images/circle.png') + imgpath = os.path.join(settings.SITE_ROOT, 'static/img/circle.png') circle = "  " % imgpath cell = [] cell.append(Spacer(0, 0.8 * cm)) @@ -635,6 +637,7 @@ class Config(FormView): permission_required = 'config.can_manage_config' form_class = ConfigForm template_name = 'assignment/config.html' + success_url_name = 'config_assignment' def get_initial(self): return { @@ -673,6 +676,7 @@ def register_tab(request): selected = request.path.startswith('/assignment/') return Tab( title=_('Elections'), + app='assignment', url=reverse('assignment_overview'), permission=( request.user.has_perm('assignment.can_see_assignment') or @@ -684,10 +688,9 @@ def register_tab(request): def get_widgets(request): - return [ - Widget( - name='assignments', - display_name=_('Elections'), - template='assignment/widget.html', - context={'assignments': Assignment.objects.all()}, - permission_required='projector.can_manage_projector')] + return [Widget( + name='assignments', + display_name=_('Elections'), + template='assignment/widget.html', + context={'assignments': Assignment.objects.all()}, + permission_required='projector.can_manage_projector')] diff --git a/openslides/config/templates/config/base_config.html b/openslides/config/templates/config/base_config.html index 78880323e..a1f99418e 100644 --- a/openslides/config/templates/config/base_config.html +++ b/openslides/config/templates/config/base_config.html @@ -1,13 +1,15 @@ {% extends "base.html" %} -{% load tags %} {% load i18n %} -{% block submenu %} -

    {% trans "Configuration" %}

    - +{% block config_submenu %} + +
    +
    + {% for menu_link in menu_links %} + {{ menu_link.1 }} + {% endfor %} +
    +
    +
    {% endblock %} diff --git a/openslides/config/templates/config/general.html b/openslides/config/templates/config/general.html index cf8ad7f41..f5ef585d8 100644 --- a/openslides/config/templates/config/general.html +++ b/openslides/config/templates/config/general.html @@ -5,19 +5,26 @@ {% block title %}{{ block.super }} – {% trans "General settings" %}{% endblock %} {% block content %} -

    {% trans "General settings" %}

    +

    + {% trans "Configuration" %} + {% trans "General" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

    {% csrf_token %}
    {% trans "Event" %} {% for field in form %} {% if "id_event" in field.label_tag %} -

    - {{ field.errors }} - {{ field.required }} - {{ field.label_tag }} - {{ field }} - {{ field.help_text }} -

    +
    + + {{ field }} + {% if field.errors %} + {{ field.errors }} + {% endif %} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} +
    {% endif %} {% endfor %}
    @@ -26,13 +33,16 @@ {% trans "Welcome Widget" %} {% for field in form %} {% if "id_welcome" in field.label_tag %} -

    - {{ field.errors }} - {{ field.required }} - {{ field.label_tag }} - {{ field }} - {{ field.help_text }} -

    +
    + + {{ field }} + {% if field.errors %} + {{ field.errors }} + {% endif %} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} +
    {% endif %} {% endfor %} @@ -41,25 +51,25 @@ {% trans "System" %} {% for field in form %} {% if "id_system" in field.label_tag %} -

    - {{ field.errors }} - {{ field.required }} - {{ field.label_tag }} - {{ field }} - {{ field.help_text }} -

    +
    + + {{ field }} + {% if field.errors %} + {{ field.errors }} + {% endif %} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} +
    {% endif %} {% endfor %}

    - - - + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %}

    + * {% trans "required" %}
    {% endblock %} diff --git a/openslides/config/templates/config/version.html b/openslides/config/templates/config/version.html index 0df6c49f3..a846675ad 100644 --- a/openslides/config/templates/config/version.html +++ b/openslides/config/templates/config/version.html @@ -5,7 +5,9 @@ {% block title %}{{ block.super }} – {% trans "Version" %}{% endblock %} {% block content %} -

    {% trans "Version" %}

    +

    {% trans "Version" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

    {% for version in versions %}

    {{ version.0 }} {% trans "Version" %}: {{ version.1 }}

    diff --git a/openslides/config/urls.py b/openslides/config/urls.py index 14659f5a8..84c1e93e9 100644 --- a/openslides/config/urls.py +++ b/openslides/config/urls.py @@ -11,7 +11,7 @@ """ from django.conf import settings -from django.conf.urls.defaults import patterns, url +from django.conf.urls import patterns, url from django.utils.importlib import import_module from openslides.config.views import GeneralConfig, VersionConfig diff --git a/openslides/config/views.py b/openslides/config/views.py index 448b3d758..997527384 100644 --- a/openslides/config/views.py +++ b/openslides/config/views.py @@ -33,6 +33,7 @@ class GeneralConfig(FormView): permission_required = 'config.can_manage_config' form_class = GeneralConfigForm template_name = 'config/general.html' + success_url_name = 'config_general' def get_initial(self): return { @@ -108,6 +109,7 @@ def register_tab(request): selected = request.path.startswith('/config/') return Tab( title=_('Configuration'), + app='config', url=reverse('config_general'), permission=request.user.has_perm('config.can_manage_config'), selected=selected, diff --git a/openslides/global_settings.py b/openslides/global_settings.py index 94f900059..a02ef47e2 100644 --- a/openslides/global_settings.py +++ b/openslides/global_settings.py @@ -26,9 +26,12 @@ LOGIN_REDIRECT_URL = '/' SESSION_COOKIE_NAME = 'OpenSlidesSessionID' - ugettext = lambda s: s +MOTION_WORKFLOW = ( + ('default', ugettext('default'), 'openslides.motion.workflow.default_workflow'), +) + LANGUAGES = ( ('de', ugettext('German')), ('en', ugettext('English')), diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index c0bba8a10..37edec9d4 100644 Binary files a/openslides/locale/de/LC_MESSAGES/django.mo and b/openslides/locale/de/LC_MESSAGES/django.mo differ diff --git a/openslides/locale/de/LC_MESSAGES/django.po b/openslides/locale/de/LC_MESSAGES/django.po index 19a408410..7519c4249 100644 --- a/openslides/locale/de/LC_MESSAGES/django.po +++ b/openslides/locale/de/LC_MESSAGES/django.po @@ -1,5 +1,5 @@ # German translations for OpenSlides package. -# Copyright (C) 2011, 2012 by OpenSlides team, see AUTHORS. +# Copyright (C) 2011-2013 by OpenSlides team, see AUTHORS. # This file is distributed under the same license as the OpenSlides package. # Oskar Hahn , 2012. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OpenSlides 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-05 14:24+0100\n" +"POT-Creation-Date: 2013-02-11 22:34+0100\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n" "Last-Translator: Emanuel Schuetze \n" "Language-Team: support@openslides.de\n" @@ -17,15 +17,19 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: global_settings.py:33 +#: global_settings.py:32 +msgid "default" +msgstr "" + +#: global_settings.py:36 msgid "German" msgstr "Deutsch" -#: global_settings.py:34 +#: global_settings.py:37 msgid "English" msgstr "Englisch" -#: global_settings.py:35 +#: global_settings.py:38 msgid "French" msgstr "Französisch" @@ -33,15 +37,15 @@ msgstr "Französisch" msgid "Parent item" msgstr "Elternelement" -#: agenda/forms.py:34 +#: agenda/forms.py:33 msgid "Invalid format. Hours from 0 to 99 and minutes from 00 to 59" -msgstr "" +msgstr "Ungültiges Format. Stunden von 0 bis 99 und Minuten von 00 bis 59" -#: agenda/forms.py:37 agenda/models.py:52 +#: agenda/forms.py:36 agenda/models.py:52 msgid "Duration (hh:mm)" msgstr "Dauer (hh:mm)" -#: agenda/forms.py:71 +#: agenda/forms.py:70 msgid "Begin of event" msgstr "Beginn der Veranstaltung" @@ -53,21 +57,20 @@ msgstr "Tagesordnungseintrag" msgid "Organizational item" msgstr "Organisatorischer Eintrag" -#: agenda/models.py:42 config/forms.py:59 motion/forms.py:22 -#: motion/models.py:539 motion/templates/motion/view.html:246 -#: projector/models.py:29 +#: agenda/models.py:42 config/forms.py:59 motion/forms.py:31 +#: motion/models.py:466 projector/models.py:29 msgid "Title" msgstr "Titel" -#: agenda/models.py:43 motion/forms.py:23 motion/models.py:540 -#: motion/templates/motion/view.html:247 projector/models.py:30 +#: agenda/models.py:43 motion/forms.py:34 motion/models.py:469 +#: projector/models.py:30 msgid "Text" msgstr "Text" -#: agenda/models.py:44 agenda/templates/agenda/overview.html:79 -#: agenda/templates/agenda/view.html:13 participant/models.py:60 -#: participant/templates/participant/overview.html:72 -#: participant/templates/participant/user_detail.html:45 +#: agenda/models.py:44 agenda/templates/agenda/overview.html:90 +#: agenda/templates/agenda/view.html:37 participant/models.py:60 +#: participant/templates/participant/overview.html:106 +#: participant/templates/participant/user_detail.html:49 msgid "Comment" msgstr "Kommentar" @@ -75,15 +78,15 @@ msgstr "Kommentar" msgid "Closed" msgstr "Abgeschlossen" -#: agenda/models.py:46 agenda/templates/agenda/overview.html:88 +#: agenda/models.py:46 agenda/templates/agenda/overview.html:99 #: projector/models.py:31 msgid "Weight" msgstr "Gewichtung" -#: agenda/models.py:50 participant/views.py:247 -#: participant/templates/participant/overview.html:37 +#: agenda/models.py:50 participant/views.py:245 #: participant/templates/participant/overview.html:69 -#: participant/templates/participant/user_detail.html:29 +#: participant/templates/participant/overview.html:103 +#: participant/templates/participant/user_detail.html:33 msgid "Type" msgstr "Typ" @@ -99,12 +102,12 @@ msgstr "Darf die Tagesordung verwalten" msgid "Can see orga items and time scheduling of agenda" msgstr "Darf Organisationspunkte und Tagesordnung-Zeitplan sehen" -#: agenda/models.py:195 agenda/slides.py:20 agenda/views.py:227 -#: agenda/views.py:228 agenda/views.py:265 agenda/views.py:279 -#: agenda/templates/agenda/base_agenda.html:10 +#: agenda/models.py:195 agenda/slides.py:20 agenda/views.py:210 +#: agenda/views.py:211 agenda/views.py:248 agenda/views.py:262 +#: agenda/templates/agenda/config.html:68 #: agenda/templates/agenda/overview.html:8 -#: agenda/templates/agenda/overview.html:52 -#: agenda/templates/agenda/overview.html:94 +#: agenda/templates/agenda/overview.html:55 +#: agenda/templates/agenda/overview.html:105 #: agenda/templates/projector/AgendaSummary.html:6 #: agenda/templates/projector/AgendaSummary.html:10 msgid "Agenda" @@ -118,66 +121,24 @@ msgstr "Sie sind nicht berechtigt die Tagesordnung zu ändern." msgid "Errors when reordering of the agenda" msgstr "Fehler beim Neusortieren der Tagesordnung" -#: agenda/views.py:167 -#, python-format -msgid "Item %s was successfully modified." -msgstr "Eintrag %s wurde erfolgreich bearbeitet." - #: agenda/views.py:188 -#, python-format -msgid "Item %s was successfully created." -msgstr "Eintrag %s wurde erfolgreich angelegt." - -#: agenda/views.py:205 msgid "Yes, with all child items." msgstr "Ja, mit allen Kindelementen." -#: agenda/views.py:213 +#: agenda/views.py:196 #, python-format msgid "Item %s and his children were successfully deleted." msgstr "Eintrag %s und seine Kindelemente wurde erfolgreich gelöscht." -#: agenda/views.py:218 +#: agenda/views.py:201 #, python-format msgid "Item %s was successfully deleted." msgstr "Eintrag %s wurde erfolgreich gelöscht." -#: agenda/views.py:256 +#: agenda/views.py:239 msgid "Agenda settings successfully saved." msgstr "Tagesordnung Einstellungen erfolgreich gespeichert." -#: agenda/templates/agenda/base_agenda.html:12 -msgid "All items" -msgstr "Alle Einträge" - -#: agenda/templates/agenda/base_agenda.html:14 -#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:18 -msgid "New item" -msgstr "Neuer Eintrag" - -#: agenda/templates/agenda/base_agenda.html:16 -msgid "Agenda as PDF" -msgstr "Tagesordnung als PDF" - -#: agenda/templates/agenda/base_agenda.html:26 -msgid "View item" -msgstr "Eintrag anzeigen" - -#: agenda/templates/agenda/base_agenda.html:31 -#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:16 -#: agenda/templates/agenda/item_row.html:47 -msgid "Edit item" -msgstr "Eintrag bearbeiten" - -#: agenda/templates/agenda/base_agenda.html:33 -#: agenda/templates/agenda/item_row.html:48 -msgid "Delete item" -msgstr "Eintrag löschen" - -#: agenda/templates/agenda/base_agenda.html:38 -msgid "Show item" -msgstr "Eintrag projizieren" - #: agenda/templates/agenda/config.html:20 msgid "January" msgstr "Januar" @@ -335,7 +296,6 @@ msgid "Sa" msgstr "Sa" #: agenda/templates/agenda/config.html:52 -#: motion/templates/motion/view.html:245 msgid "Time" msgstr "Zeit" @@ -356,199 +316,228 @@ msgid "close" msgstr "Schließen" #: agenda/templates/agenda/config.html:63 -#: agenda/templates/agenda/config.html:68 msgid "Agenda settings" msgstr "Tagesordnungs-Einstellungen" -#: agenda/templates/agenda/config.html:74 agenda/templates/agenda/edit.html:24 -#: assignment/templates/assignment/config.html:13 -#: assignment/templates/assignment/edit.html:26 -#: assignment/templates/assignment/poll_view.html:66 -#: config/templates/config/general.html:56 -#: motion/templates/motion/config.html:13 motion/templates/motion/edit.html:26 -#: motion/templates/motion/poll_view.html:52 -#: participant/templates/participant/config.html:13 -#: participant/templates/participant/edit.html:31 -#: participant/templates/participant/group_edit.html:25 -#: participant/templates/participant/password_change.html:22 -#: participant/templates/participant/settings.html:22 -#: projector/templates/projector/new.html:13 -#: projector/templates/projector/select_widgets.html:22 +#: agenda/templates/agenda/config.html:68 +#: assignment/templates/assignment/config.html:9 config/views.py:111 +#: config/templates/config/general.html:9 +#: motion/templates/motion/config.html:9 +#: participant/templates/participant/config.html:9 +msgid "Configuration" +msgstr "Konfiguration" + +#: agenda/templates/agenda/config.html:75 +#: assignment/templates/assignment/poll_view.html:80 +#: motion/templates/motion/motion_form.html:14 +#: motion/templates/motion/poll_form.html:38 +#: projector/templates/projector/select_widgets.html:28 +#: templates/formbuttons_save.html:4 templates/formbuttons_saveapply.html:4 msgid "Save" msgstr "Speichern" -#: agenda/templates/agenda/config.html:78 agenda/templates/agenda/edit.html:31 -#: assignment/templates/assignment/config.html:17 -#: assignment/templates/assignment/edit.html:33 -#: assignment/templates/assignment/poll_view.html:73 -#: config/templates/config/general.html:60 -#: motion/templates/motion/config.html:17 motion/templates/motion/edit.html:33 -#: motion/templates/motion/import.html:30 -#: motion/templates/motion/poll_view.html:59 -#: participant/templates/participant/config.html:17 -#: participant/templates/participant/edit.html:38 -#: participant/templates/participant/group_edit.html:32 -#: participant/templates/participant/import.html:28 -#: participant/templates/participant/password_change.html:26 -#: participant/templates/participant/settings.html:26 -#: projector/templates/projector/new.html:20 +#: agenda/templates/agenda/config.html:79 agenda/templates/agenda/edit.html:30 +#: assignment/templates/assignment/config.html:18 +#: assignment/templates/assignment/edit.html:31 +#: assignment/templates/assignment/poll_view.html:86 +#: config/templates/config/general.html:70 +#: motion/templates/motion/config.html:18 +#: motion/templates/motion/motion_form.html:21 +#: motion/templates/motion/poll_form.html:44 +#: participant/templates/participant/config.html:18 +#: participant/templates/participant/edit.html:36 +#: participant/templates/participant/group_edit.html:31 +#: participant/templates/participant/import.html:33 msgid "Cancel" msgstr "Abbrechen" -#: agenda/templates/agenda/edit.html:27 -#: assignment/templates/assignment/edit.html:29 -#: assignment/templates/assignment/poll_view.html:69 -#: assignment/templates/assignment/view.html:92 -#: motion/templates/motion/edit.html:29 -#: motion/templates/motion/poll_view.html:55 -#: participant/templates/participant/edit.html:34 -#: participant/templates/participant/group_edit.html:28 -#: projector/templates/projector/control_overlay_message.html:8 -#: projector/templates/projector/new.html:16 -msgid "Apply" -msgstr "Übernehmen" +#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:17 +#: agenda/templates/agenda/view.html:20 +msgid "Edit item" +msgstr "Eintrag bearbeiten" -#: agenda/templates/agenda/edit.html:35 -#: assignment/templates/assignment/edit.html:37 -#: motion/templates/motion/edit.html:37 motion/templates/motion/import.html:34 -#: participant/templates/participant/edit.html:42 -#: participant/templates/participant/group_edit.html:36 -#: participant/templates/participant/import.html:32 +#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:19 +#: agenda/templates/agenda/overview.html:72 +msgid "New item" +msgstr "Neuer Eintrag" + +#: agenda/templates/agenda/edit.html:22 agenda/templates/agenda/view.html:12 +#: assignment/templates/assignment/edit.html:22 +#: assignment/templates/assignment/view.html:20 +#: participant/templates/participant/edit.html:22 +#: participant/templates/participant/group_detail.html:12 +#: participant/templates/participant/group_edit.html:22 +#: participant/templates/participant/import.html:11 +#: participant/templates/participant/user_detail.html:12 +#: projector/templates/projector/new.html:11 +#: projector/templates/projector/select_widgets.html:10 +msgid "Back to overview" +msgstr "Zurück zur Übersicht" + +#: agenda/templates/agenda/edit.html:33 +#: assignment/templates/assignment/config.html:21 +#: assignment/templates/assignment/edit.html:34 +#: config/templates/config/general.html:73 +#: motion/templates/motion/config.html:21 +#: motion/templates/motion/motion_form.html:24 +#: participant/templates/participant/config.html:21 +#: participant/templates/participant/edit.html:39 +#: participant/templates/participant/group_edit.html:34 +#: participant/templates/participant/import.html:36 +#: projector/templates/projector/new.html:19 msgid "required" msgstr "erforderlich" -#: agenda/templates/agenda/item_row.html:8 -msgid "Mark item as done" -msgstr "Eintrag als erledigt markieren" - -#: agenda/templates/agenda/item_row.html:12 -msgid "Item closed" -msgstr "Eintrag erledigt" +#: agenda/templates/agenda/item_row.html:7 +msgid "Change status (open/closed)" +msgstr "Status ändern (offen/abgeschlossen)" #: agenda/templates/agenda/item_row.html:32 msgid "End" msgstr "Ende" #: agenda/templates/agenda/item_row.html:42 -#: agenda/templates/agenda/overview.html:106 -msgid "Activate item" -msgstr "Eintrag projizieren" +#: agenda/templates/agenda/overview.html:117 +#: agenda/templates/agenda/view.html:26 agenda/templates/agenda/widget.html:6 +#: agenda/templates/agenda/widget.html:19 +#: assignment/templates/assignment/overview.html:54 +#: assignment/templates/assignment/widget.html:7 +#: motion/templates/motion/widget.html:7 +#: participant/templates/participant/group_overview.html:29 +#: participant/templates/participant/group_widget.html:8 +#: participant/templates/participant/overview.html:128 +#: participant/templates/participant/user_widget.html:7 +#: projector/templates/projector/custom_slide_widget.html:6 +#: projector/templates/projector/custom_slide_widget.html:19 +msgid "Show" +msgstr "Anzeigen" -#: agenda/templates/agenda/item_row.html:51 -#: agenda/templates/agenda/widget.html:35 -msgid "Activate summary for this item" -msgstr "Zusammenfassung für diesen Eintrag projizieren" +#: agenda/templates/agenda/item_row.html:47 +#: agenda/templates/agenda/widget.html:22 +#: assignment/templates/assignment/overview.html:59 +#: assignment/templates/assignment/view.html:172 +#: assignment/templates/assignment/widget.html:10 +#: motion/templates/motion/widget.html:10 +#: participant/templates/participant/group_overview.html:33 +#: participant/templates/participant/group_widget.html:11 +#: participant/templates/participant/overview.html:132 +#: participant/templates/participant/user_widget.html:10 +#: projector/templates/projector/custom_slide_widget.html:26 +msgid "Edit" +msgstr "Bearbeiten" -#: agenda/templates/agenda/overview.html:45 +#: agenda/templates/agenda/item_row.html:50 +#: assignment/templates/assignment/overview.html:62 +#: assignment/templates/assignment/view.html:173 +#: participant/templates/participant/group_overview.html:37 +#: participant/templates/participant/overview.html:136 +#: projector/templates/projector/custom_slide_widget.html:23 +msgid "Delete" +msgstr "Löschen" + +#: agenda/templates/agenda/item_row.html:54 +#: agenda/templates/agenda/widget.html:29 +msgid "Show summary for this item" +msgstr "Zusammenfassung für diesen Eintrag anzeigen" + +#: agenda/templates/agenda/overview.html:47 msgid "Do you want to save the changed order of agenda items?" msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?" -#: agenda/templates/agenda/overview.html:46 assignment/models.py:291 -#: assignment/views.py:587 assignment/templates/assignment/view.html:168 -#: assignment/templates/assignment/view.html:172 +#: agenda/templates/agenda/overview.html:49 assignment/models.py:291 +#: assignment/views.py:589 assignment/templates/assignment/view.html:206 +#: assignment/templates/assignment/view.html:210 #: assignment/templates/projector/Assignment.html:78 -#: assignment/templates/projector/Assignment.html:82 motion/models.py:574 -#: motion/views.py:824 motion/views.py:875 -#: motion/templates/motion/view.html:79 +#: assignment/templates/projector/Assignment.html:82 motion/models.py:617 +#: motion/pdf.py:134 motion/templates/motion/motion_detail.html:66 #: motion/templates/projector/Motion.html:37 utils/utils.py:45 -#: utils/views.py:104 +#: utils/views.py:146 msgid "Yes" msgstr "Ja" -#: agenda/templates/agenda/overview.html:47 assignment/models.py:291 -#: assignment/views.py:588 assignment/templates/assignment/view.html:169 -#: assignment/templates/projector/Assignment.html:79 motion/models.py:574 -#: motion/views.py:824 motion/views.py:876 -#: motion/templates/motion/view.html:80 +#: agenda/templates/agenda/overview.html:50 assignment/models.py:291 +#: assignment/views.py:590 assignment/templates/assignment/view.html:207 +#: assignment/templates/projector/Assignment.html:79 motion/models.py:617 +#: motion/pdf.py:134 motion/templates/motion/motion_detail.html:67 #: motion/templates/projector/Motion.html:38 utils/utils.py:45 -#: utils/views.py:104 +#: utils/views.py:146 msgid "No" msgstr "Nein" -#: agenda/templates/agenda/overview.html:57 +#: agenda/templates/agenda/overview.html:60 msgid "Start of event" msgstr "Beginn der Veranstaltung" -#: agenda/templates/agenda/overview.html:61 +#: agenda/templates/agenda/overview.html:64 msgid "Estimated end" msgstr "Voraussichtliches Ende" -#: agenda/templates/agenda/overview.html:69 +#: agenda/templates/agenda/overview.html:72 #: assignment/templates/assignment/overview.html:12 -#: motion/templates/motion/overview.html:12 -#: participant/templates/participant/overview.html:22 -msgid "Filter" -msgstr "Filter" +#: participant/templates/participant/group_overview.html:11 +#: participant/templates/participant/overview.html:20 +#: projector/templates/projector/custom_slide_widget.html:39 +msgid "New" +msgstr "Neu" -#: agenda/templates/agenda/overview.html:70 +#: agenda/templates/agenda/overview.html:74 +msgid "Print agenda as PDF" +msgstr "Tagesordnung als PDF drucken" + +#: agenda/templates/agenda/overview.html:79 msgid "Hide closed items" msgstr "Verstecke abgeschlossene Einträge" -#: agenda/templates/agenda/overview.html:73 +#: agenda/templates/agenda/overview.html:83 msgid "item" msgid_plural "items" msgstr[0] "Eintrag" msgstr[1] "Einträge" -#: agenda/templates/agenda/overview.html:76 -msgid "Done" -msgstr "Erledigt" - -#: agenda/templates/agenda/overview.html:77 +#: agenda/templates/agenda/overview.html:88 msgid "Item" msgstr "Eintrag" -#: agenda/templates/agenda/overview.html:82 +#: agenda/templates/agenda/overview.html:93 +#, fuzzy msgid "Duration" -msgstr "Dauer" +msgstr "Dauer (hh:mm)" -#: agenda/templates/agenda/overview.html:85 -#: assignment/templates/assignment/overview.html:28 -#: motion/templates/motion/overview.html:43 -#: participant/templates/participant/group_overview.html:14 -#: participant/templates/participant/overview.html:74 +#: agenda/templates/agenda/overview.html:96 +#: assignment/templates/assignment/overview.html:38 +#: participant/templates/participant/group_overview.html:19 +#: participant/templates/participant/overview.html:108 msgid "Actions" msgstr "Aktionen" -#: agenda/templates/agenda/overview.html:122 -#: agenda/templates/agenda/widget.html:46 -#: projector/templates/projector/custom_slide_widget.html:36 +#: agenda/templates/agenda/overview.html:133 +#: agenda/templates/agenda/widget.html:40 +#: projector/templates/projector/custom_slide_widget.html:34 msgid "No items available." msgstr "Keine Einträge vorhanden." -#: agenda/templates/agenda/widget.html:10 -#: agenda/templates/agenda/widget.html:29 -#: assignment/templates/assignment/widget.html:17 -#: motion/templates/motion/widget.html:17 -#: participant/templates/participant/group_widget.html:17 -#: participant/templates/participant/user_widget.html:16 -#: projector/templates/projector/custom_slide_widget.html:11 -#: projector/templates/projector/custom_slide_widget.html:30 +#: agenda/templates/agenda/view.html:15 +#: assignment/templates/assignment/view.html:29 +msgid "More actions" +msgstr "Mehr Aktionen" + +#: agenda/templates/agenda/view.html:21 +msgid "Delete item" +msgstr "Eintrag löschen" + +#: agenda/templates/agenda/widget.html:9 +#: agenda/templates/agenda/widget.html:25 +#: assignment/templates/assignment/widget.html:13 +#: motion/templates/motion/widget.html:13 +#: participant/templates/participant/group_widget.html:14 +#: participant/templates/participant/user_widget.html:13 +#: projector/templates/projector/custom_slide_widget.html:9 +#: projector/templates/projector/custom_slide_widget.html:29 msgid "Preview" msgstr "Vorschau" -#: agenda/templates/agenda/widget.html:23 -#: assignment/templates/assignment/view.html:132 -#: assignment/templates/assignment/widget.html:11 -#: motion/templates/motion/widget.html:11 -#: participant/templates/participant/group_widget.html:11 -#: participant/templates/participant/user_widget.html:10 -#: projector/templates/projector/custom_slide_widget.html:24 -msgid "Delete" -msgstr "Löschen" - -#: agenda/templates/agenda/widget.html:26 -#: assignment/templates/assignment/view.html:131 -#: assignment/templates/assignment/widget.html:14 -#: motion/templates/motion/widget.html:14 -#: participant/templates/participant/group_widget.html:14 -#: participant/templates/participant/user_widget.html:13 -#: projector/templates/projector/custom_slide_widget.html:27 -msgid "Edit" -msgstr "Bearbeiten" - -#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:381 -#: assignment/templates/assignment/view.html:13 +#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:383 +#: assignment/templates/assignment/view.html:275 #: assignment/templates/projector/Assignment.html:21 msgid "Number of available posts" msgstr "Anzahl der zur Wahl stehenden Posten" @@ -562,23 +551,23 @@ msgid "Only publish voting results for selected winners (Projector view only)" msgstr "" "Wahlergebnisse der nicht gewählten Kandidaten auf dem Projektor verbergen" -#: assignment/forms.py:46 motion/forms.py:77 +#: assignment/forms.py:46 motion/forms.py:110 msgid "Number of ballot papers (selection)" msgstr "Anzahl der Stimmzettel (Vorauswahl)" -#: assignment/forms.py:48 motion/forms.py:79 +#: assignment/forms.py:48 motion/forms.py:112 msgid "Number of all delegates" msgstr "Anzahl aller Delegierten" -#: assignment/forms.py:49 motion/forms.py:80 +#: assignment/forms.py:49 motion/forms.py:113 msgid "Number of all participants" msgstr "Anzahl aller Teilnehmer/innen" -#: assignment/forms.py:50 motion/forms.py:81 +#: assignment/forms.py:50 motion/forms.py:114 msgid "Use the following custom number" msgstr "Verwende die folgende benutzerdefinierte Anzahl" -#: assignment/forms.py:55 motion/forms.py:88 +#: assignment/forms.py:55 motion/forms.py:121 msgid "Custom number of ballot papers" msgstr "Benutzerdefinierte Anzahl von Stimmzetteln" @@ -606,18 +595,18 @@ msgstr "Eine Stimme pro Kandidat/in." msgid "Always Yes-No-Abstain per candidate." msgstr "Ja, Nein, Enthaltung pro Kandidat/in." -#: assignment/models.py:44 assignment/templates/assignment/overview.html:15 -#: assignment/templates/assignment/view.html:23 +#: assignment/models.py:44 assignment/templates/assignment/overview.html:24 +#: assignment/templates/assignment/view.html:284 msgid "Searching for candidates" msgstr "Auf Kandidatensuche" -#: assignment/models.py:45 assignment/templates/assignment/overview.html:16 -#: assignment/templates/assignment/view.html:25 +#: assignment/models.py:45 assignment/templates/assignment/overview.html:25 +#: assignment/templates/assignment/view.html:288 msgid "Voting" msgstr "Im Wahlvorgang" -#: assignment/models.py:46 assignment/templates/assignment/overview.html:17 -#: assignment/templates/assignment/view.html:27 +#: assignment/models.py:46 assignment/templates/assignment/overview.html:26 +#: assignment/templates/assignment/view.html:292 msgid "Finished" msgstr "Abgeschlossen" @@ -625,7 +614,8 @@ msgstr "Abgeschlossen" msgid "Name" msgstr "Name" -#: assignment/models.py:50 participant/models.py:144 +#: assignment/models.py:50 assignment/templates/assignment/view.html:57 +#: participant/models.py:144 msgid "Description" msgstr "Beschreibung" @@ -633,7 +623,7 @@ msgstr "Beschreibung" msgid "Comment on the ballot paper" msgstr "Kommentar für den Stimmzettel" -#: assignment/models.py:64 motion/models.py:332 +#: assignment/models.py:64 #, python-format msgid "%s is not a valid status." msgstr "%s ist kein gültiger Status." @@ -648,7 +638,7 @@ msgstr "Der Wahlstatus ist bereits %s." msgid "%s is already a candidate." msgstr "%s ist bereits ein/e Kandidat/in." -#: assignment/models.py:82 assignment/views.py:195 +#: assignment/models.py:82 assignment/views.py:196 msgid "The candidate list is already closed." msgstr "Die Kandidatenliste ist bereits geschlossen." @@ -678,23 +668,22 @@ msgstr "Darf selbst für Wahlen kandidieren" msgid "Can manage assignment" msgstr "Darf Wahlen verwalten" -#: assignment/models.py:291 motion/models.py:574 +#: assignment/models.py:291 motion/models.py:617 msgid "Abstain" msgstr "Enthaltung" -#: assignment/models.py:293 motion/templates/motion/poll_view.html:22 +#: assignment/models.py:293 motion/templates/motion/poll_form.html:16 msgid "Votes" msgstr "Stimmen" -#: assignment/models.py:310 +#: assignment/models.py:310 motion/models.py:631 #, python-format msgid "Ballot %d" msgstr "Wahlgang %d" -#: assignment/models.py:319 assignment/views.py:336 assignment/views.py:675 -#: assignment/views.py:690 -#: assignment/templates/assignment/base_assignment.html:14 -#: assignment/templates/assignment/overview.html:6 +#: assignment/models.py:319 assignment/views.py:338 assignment/views.py:678 +#: assignment/views.py:693 assignment/templates/assignment/config.html:10 +#: assignment/templates/assignment/overview.html:5 #: assignment/templates/assignment/overview.html:9 msgid "Elections" msgstr "Wahlen" @@ -712,27 +701,26 @@ msgstr "Neue Wahl wurde erfolgreich angelegt." msgid "Election was successfully modified." msgstr "Wahl wurde erfolgreich geändert." -#: assignment/views.py:130 motion/views.py:239 motion/views.py:683 -#: participant/views.py:504 participant/views.py:528 utils/views.py:218 -#: utils/views.py:236 utils/views.py:260 +#: assignment/views.py:130 participant/views.py:501 participant/views.py:525 +#: utils/views.py:259 utils/views.py:281 utils/views.py:291 msgid "Please check the form for errors." msgstr "Bitte kontrollieren Sie das Formular nach Fehlern." -#: assignment/views.py:149 +#: assignment/views.py:150 #, python-format msgid "Election %s was successfully deleted." msgstr "Wahl %s wurde erfolgreich gelöscht." -#: assignment/views.py:162 +#: assignment/views.py:163 #, python-format msgid "Election status was set to: %s." msgstr "Wahlstatus wurde gesetzt auf: %s." -#: assignment/views.py:175 +#: assignment/views.py:176 msgid "You have set your candidature successfully." msgstr "Sie haben Ihre Kandidatur erfolgreich gesetzt." -#: assignment/views.py:192 +#: assignment/views.py:193 msgid "" "You have withdrawn your candidature successfully. You can not be nominated " "by other participants anymore." @@ -740,99 +728,98 @@ msgstr "" "Sie haben Ihre Kandidatur erfolgreich zurückgezogen. Sie können nun von " "anderen Teilnehmer/innen nicht mehr vorgeschlagen werden." -#: assignment/views.py:213 +#: assignment/views.py:215 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Die Kandidatur von %s wurde erfolgreich zurückgezogen." -#: assignment/views.py:215 +#: assignment/views.py:217 #, python-format msgid "%s was unblocked successfully." msgstr "%s wurde erfolgreich freigegeben." -#: assignment/views.py:219 +#: assignment/views.py:221 #, python-format msgid "Do you really want to withdraw %s from the election?" msgstr "Soll %s wirklich von der Wahl zurückgezogen werden?" -#: assignment/views.py:221 +#: assignment/views.py:223 #, python-format msgid "Do you really want to unblock %s for the election?" msgstr "Soll %s wirklich für die Wahl freigegeben werden?" -#: assignment/views.py:236 +#: assignment/views.py:238 msgid "New ballot was successfully created." msgstr "Neuer Wahlgang erfolgreich angelegt." -#: assignment/views.py:268 +#: assignment/views.py:270 #, python-format msgid "Ballot ID %d does not exist." msgstr "Wahlgang-ID %d existiert nicht." -#: assignment/views.py:275 +#: assignment/views.py:277 msgid "Ballot successfully published." msgstr "Wahlgang wurde erfolgreich veröffentlicht." -#: assignment/views.py:277 +#: assignment/views.py:279 msgid "Ballot successfully unpublished." msgstr "Wahlgang wurde erfolgreich unveröffentlicht." -#: assignment/views.py:290 +#: assignment/views.py:292 msgid "not elected" msgstr "nicht gewählt" -#: assignment/views.py:293 assignment/views.py:482 -#: assignment/templates/assignment/view.html:48 +#: assignment/views.py:295 assignment/views.py:484 +#: assignment/templates/assignment/view.html:77 msgid "elected" msgstr "gewählt" -#: assignment/views.py:321 +#: assignment/views.py:323 msgid "Ballot was successfully deleted." msgstr "Abstimmung wurde erfolgreich gelöscht." -#: assignment/views.py:333 +#: assignment/views.py:335 msgid "Assignment" msgstr "Wahl" -#: assignment/views.py:356 assignment/templates/assignment/overview.html:59 -#: assignment/templates/assignment/widget.html:23 +#: assignment/views.py:358 assignment/templates/assignment/overview.html:74 +#: assignment/templates/assignment/widget.html:19 msgid "No assignments available." msgstr "Keine Wahlen vorhanden." -#: assignment/views.py:375 +#: assignment/views.py:377 #, python-format msgid "Election: %s" msgstr "Wahlen: %s" -#: assignment/views.py:388 assignment/views.py:424 -#: assignment/templates/assignment/overview.html:26 -#: assignment/templates/assignment/poll_view.html:18 -#: assignment/templates/assignment/view.html:37 -#: assignment/templates/assignment/view.html:120 +#: assignment/views.py:390 assignment/views.py:426 +#: assignment/templates/assignment/overview.html:36 +#: assignment/templates/assignment/poll_view.html:34 +#: assignment/templates/assignment/view.html:66 +#: assignment/templates/assignment/view.html:157 #: assignment/templates/projector/Assignment.html:38 #: assignment/templates/projector/Assignment.html:56 msgid "Candidates" msgstr "Kandidaten/innen" -#: assignment/views.py:413 motion/views.py:817 -#: motion/templates/motion/view.html:44 +#: assignment/views.py:415 motion/pdf.py:120 +#: motion/templates/motion/motion_detail.html:46 msgid "Vote results" msgstr "Abstimmungsergebnis" -#: assignment/views.py:417 -#: assignment/templates/assignment/base_assignment.html:71 -#: assignment/templates/assignment/poll_view.html:5 -#: assignment/templates/assignment/poll_view.html:8 -#: assignment/templates/assignment/view.html:123 +#: assignment/views.py:419 assignment/templates/assignment/poll_view.html:5 +#: assignment/templates/assignment/poll_view.html:11 +#: assignment/templates/assignment/view.html:152 +#: assignment/templates/assignment/view.html:160 #: assignment/templates/projector/Assignment.html:59 msgid "ballot" msgstr "Wahlgang" -#: assignment/views.py:420 +#: assignment/views.py:422 msgid "ballots" msgstr "Wahlgänge" -#: assignment/views.py:445 +#: assignment/views.py:447 #, python-format msgid "" "Y: %(YES)s\n" @@ -843,246 +830,248 @@ msgstr "" "N: %(NO)s\n" "E: %(ABSTAIN)s" -#: assignment/views.py:456 assignment/templates/assignment/poll_view.html:35 -#: assignment/templates/assignment/view.html:186 +#: assignment/views.py:458 assignment/templates/assignment/poll_view.html:51 +#: assignment/templates/assignment/view.html:224 #: assignment/templates/projector/Assignment.html:96 -#: motion/templates/motion/poll_view.html:31 +#: motion/templates/motion/poll_form.html:25 msgid "Invalid votes" msgstr "Ungültige Stimmen" -#: assignment/views.py:463 assignment/templates/assignment/poll_view.html:45 -#: assignment/templates/assignment/view.html:202 -#: assignment/templates/assignment/view.html:207 +#: assignment/views.py:465 assignment/templates/assignment/poll_view.html:61 +#: assignment/templates/assignment/view.html:240 +#: assignment/templates/assignment/view.html:245 #: assignment/templates/projector/Assignment.html:109 -#: assignment/templates/projector/Assignment.html:115 motion/views.py:824 -#: motion/templates/motion/poll_view.html:35 -#: motion/templates/motion/view.html:84 +#: assignment/templates/projector/Assignment.html:115 motion/pdf.py:135 +#: motion/templates/motion/motion_detail.html:71 +#: motion/templates/motion/poll_form.html:29 #: motion/templates/projector/Motion.html:42 poll/models.py:76 msgid "Votes cast" msgstr "Abgegebene Stimmen" -#: assignment/views.py:523 assignment/views.py:541 -#: assignment/templates/assignment/overview.html:25 +#: assignment/views.py:525 assignment/views.py:543 +#: assignment/templates/assignment/overview.html:35 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/view.html:6 #: assignment/templates/projector/Assignment.html:27 msgid "Election" msgstr "Wahl" -#: assignment/views.py:548 +#: assignment/views.py:550 #, python-format msgid "%d. ballot" msgstr "%d. Wahlgang" -#: assignment/views.py:550 +#: assignment/views.py:552 #, python-format msgid "%d candidate" msgid_plural "%d candidates" msgstr[0] "%d Kandidat/in" msgstr[1] "%d Kandidaten/innen" -#: assignment/views.py:552 +#: assignment/views.py:554 #, python-format msgid "%d available post" msgid_plural "%d available posts" msgstr[0] "%d verfügbare Posten" msgstr[1] "%d verfügbare Posten" -#: assignment/views.py:588 assignment/templates/assignment/view.html:170 -#: assignment/templates/projector/Assignment.html:80 motion/views.py:824 -#: motion/views.py:877 motion/templates/motion/view.html:81 +#: assignment/views.py:590 assignment/templates/assignment/view.html:208 +#: assignment/templates/projector/Assignment.html:80 motion/pdf.py:134 +#: motion/templates/motion/motion_detail.html:68 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Enthaltung" -#: assignment/views.py:668 +#: assignment/views.py:671 msgid "Election settings successfully saved." msgstr "Wahl-Einstellungen wurden erfolgreich gespeichert." -#: assignment/templates/assignment/base_assignment.html:16 -msgid "All elections" -msgstr "Alle Wahlen" - -#: assignment/templates/assignment/base_assignment.html:18 -#: assignment/templates/assignment/edit.html:10 -#: assignment/templates/assignment/edit.html:19 -msgid "New election" -msgstr "Neue Wahl" - -#: assignment/templates/assignment/base_assignment.html:20 -msgid "All elections as PDF" -msgstr "Alle Wahlen als PDF" - -#: assignment/templates/assignment/base_assignment.html:31 -msgid "View election" -msgstr "Wahl anzeigen" - -#: assignment/templates/assignment/base_assignment.html:39 -#: assignment/templates/assignment/edit.html:8 -#: assignment/templates/assignment/edit.html:17 -#: assignment/templates/assignment/overview.html:50 -msgid "Edit election" -msgstr "Wahl bearbeiten" - -#: assignment/templates/assignment/base_assignment.html:44 -#: assignment/templates/assignment/overview.html:51 -msgid "Delete election" -msgstr "Wahl löschen" - -#: assignment/templates/assignment/base_assignment.html:50 -#: assignment/templates/assignment/overview.html:53 -msgid "Election as PDF" -msgstr "Wahl als PDF" - -#: assignment/templates/assignment/base_assignment.html:56 -msgid "Show election" -msgstr "Wahl projizieren" - -#: assignment/templates/assignment/base_assignment.html:63 -#: motion/templates/motion/base_motion.html:61 -msgid "New agenda item" -msgstr "Neuer Tagesordnungseintrag" - #: assignment/templates/assignment/config.html:5 -#: assignment/templates/assignment/config.html:8 msgid "Election settings" msgstr "Wahl-Einstellungen" -#: assignment/templates/assignment/overview.html:14 -#: assignment/templates/assignment/overview.html:27 -#: assignment/templates/assignment/view.html:11 -#: assignment/templates/projector/Assignment.html:18 motion/views.py:795 -#: motion/templates/motion/overview.html:20 -#: motion/templates/motion/overview.html:40 -#: motion/templates/motion/view.html:34 +#: assignment/templates/assignment/edit.html:8 +#: assignment/templates/assignment/edit.html:17 +#: assignment/templates/assignment/view.html:34 +msgid "Edit election" +msgstr "Wahl bearbeiten" + +#: assignment/templates/assignment/edit.html:10 +#: assignment/templates/assignment/edit.html:19 +#: assignment/templates/assignment/overview.html:12 +msgid "New election" +msgstr "Neue Wahl" + +#: assignment/templates/assignment/overview.html:15 +msgid "Print all elections as PDF" +msgstr "Alle Wahlen als PDF drucken" + +#: assignment/templates/assignment/overview.html:21 +#: participant/templates/participant/overview.html:53 +msgid "Filter" +msgstr "Filter" + +#: assignment/templates/assignment/overview.html:23 +#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/view.html:272 +#: assignment/templates/projector/Assignment.html:18 #: motion/templates/projector/Motion.html:11 -#: participant/templates/participant/overview.html:52 +#: participant/templates/participant/overview.html:84 msgid "Status" msgstr "Status" -#: assignment/templates/assignment/overview.html:22 +#: assignment/templates/assignment/overview.html:31 msgid "election" msgid_plural "elections" msgstr[0] "Wahl" msgstr[1] "Wahlen" -#: assignment/templates/assignment/overview.html:35 +#: assignment/templates/assignment/overview.html:44 #, python-format msgctxt "Number of searched candidates for an election" msgid "posts: %(posts)s" msgstr "Posten: %(posts)s" -#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/overview.html:46 #, python-format msgid "candidates: %(candidates)s" msgstr "Kandidaten/innen: %(candidates)s" -#: assignment/templates/assignment/overview.html:39 +#: assignment/templates/assignment/overview.html:48 #, python-format msgid "elected: %(elected)s" msgstr "Gewählt: %(elected)s" -#: assignment/templates/assignment/overview.html:45 -msgid "Activate election" -msgstr "Wahl projizieren" +#: assignment/templates/assignment/overview.html:66 +msgid "Print election as PDF" +msgstr "Wahle als PDF drucken" -#: assignment/templates/assignment/poll_view.html:10 +#: assignment/templates/assignment/poll_view.html:14 +msgid "Back to election" +msgstr "Zurück zur Wahl" + +#: assignment/templates/assignment/poll_view.html:17 +#: assignment/templates/assignment/view.html:23 +msgid "Show election" +msgstr "Wahl anzeigen" + +#: assignment/templates/assignment/poll_view.html:25 msgid "Short description (for ballot paper)" msgstr "Kurzbeschreibung (für Stimmzettel)" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_form.html:9 msgid "Special values" msgstr "Spezielle Werte" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:234 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_form.html:9 poll/models.py:234 msgid "majority" msgstr "Mehrheit" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:236 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_form.html:9 poll/models.py:236 #: poll/models.py:238 msgid "undocumented" msgstr "nicht erfasst" -#: assignment/templates/assignment/poll_view.html:59 -#: motion/templates/motion/poll_view.html:45 +#: assignment/templates/assignment/poll_view.html:74 msgid "Ballot paper as PDF" msgstr "Stimmzettel als PDF" -#: assignment/templates/assignment/view.html:21 -msgid "Change status" -msgstr "Status ändern" +#: assignment/templates/assignment/poll_view.html:83 +#: assignment/templates/assignment/view.html:112 +#: motion/templates/motion/motion_form.html:17 +#: motion/templates/motion/poll_form.html:41 +#: projector/templates/projector/control_overlay_message.html:7 +#: templates/formbuttons_saveapply.html:7 +msgid "Apply" +msgstr "Übernehmen" -#: assignment/templates/assignment/view.html:44 -#: assignment/templates/assignment/view.html:106 +#: assignment/templates/assignment/view.html:36 +msgid "Delete election" +msgstr "Wahl löschen" + +#: assignment/templates/assignment/view.html:40 +msgid "Ballot" +msgstr "Wahlgang" + +#: assignment/templates/assignment/view.html:46 +msgid "New agenda item" +msgstr "Neuer Tagesordnungseintrag" + +#: assignment/templates/assignment/view.html:73 +#: assignment/templates/assignment/view.html:132 msgid "Remove candidate" msgstr "Kandidate/in entfernen" -#: assignment/templates/assignment/view.html:51 +#: assignment/templates/assignment/view.html:80 msgid "Mark candidate as not elected" msgstr "Kandidat/in als nicht gewählt markieren" -#: assignment/templates/assignment/view.html:57 +#: assignment/templates/assignment/view.html:88 #: assignment/templates/projector/Assignment.html:44 msgid "No candidates available." msgstr "Keine Kandidaten/innen vorhanden." -#: assignment/templates/assignment/view.html:69 +#: assignment/templates/assignment/view.html:98 msgid "Withdraw self candidature" msgstr "Eigene Kandidatur zurückziehen" -#: assignment/templates/assignment/view.html:75 +#: assignment/templates/assignment/view.html:102 msgid "Self candidature" msgstr "Selbst kandidieren" -#: assignment/templates/assignment/view.html:86 +#: assignment/templates/assignment/view.html:114 msgid "Add new participant" msgstr "Neue/n Teilnehmer/in hinzufügen" -#: assignment/templates/assignment/view.html:102 +#: assignment/templates/assignment/view.html:127 msgid "Blocked Candidates" msgstr "Blockierte Kandidaten/innen" -#: assignment/templates/assignment/view.html:109 +#: assignment/templates/assignment/view.html:137 msgid "No blocked candidates available." msgstr "Keine blockierten Kandidaten/innen vorhanden." -#: assignment/templates/assignment/view.html:115 +#: assignment/templates/assignment/view.html:145 #: assignment/templates/projector/Assignment.html:52 msgid "Election results" msgstr "Wahlergebnisse" -#: assignment/templates/assignment/view.html:128 +#: assignment/templates/assignment/view.html:165 msgid "Publish/unpublish results" msgstr "Ergebnisse veröffentlichen/unveröffentlichen" -#: assignment/templates/assignment/view.html:140 -#: assignment/templates/assignment/view.html:223 +#: assignment/templates/assignment/view.html:180 +#: assignment/templates/assignment/view.html:261 msgid "New ballot" msgstr "Neuer Wahlgang" -#: assignment/templates/assignment/view.html:155 +#: assignment/templates/assignment/view.html:193 #: assignment/templates/projector/Assignment.html:69 msgid "Candidate is elected" msgstr "Kandidat/in ist gewählt" -#: assignment/templates/assignment/view.html:174 +#: assignment/templates/assignment/view.html:212 #: assignment/templates/projector/Assignment.html:84 msgid "was not a
    candidate" msgstr "war kein Kandidat" -#: assignment/templates/assignment/view.html:191 -#: assignment/templates/projector/Assignment.html:100 motion/views.py:824 -#: motion/templates/motion/view.html:82 +#: assignment/templates/assignment/view.html:229 +#: assignment/templates/projector/Assignment.html:100 motion/pdf.py:134 +#: motion/templates/motion/motion_detail.html:69 #: motion/templates/projector/Motion.html:40 msgid "Invalid" msgstr "Ungültig" -#: assignment/templates/assignment/view.html:219 -msgid "No results available." -msgstr "Keine Ergebnisse vorhanden." +#: assignment/templates/assignment/view.html:257 +msgid "No ballots available." +msgstr "Keine Wahlgänge vorhanden." + +#: assignment/templates/assignment/view.html:281 +msgid "Change status" +msgstr "Status ändern" #: config/forms.py:22 msgid "Event name" @@ -1128,818 +1117,352 @@ msgstr "Willkommen bei OpenSlides" msgid "[Place for your welcome text.]" msgstr "[Platz für Ihren Begrüßungstext.]" -#: config/models.py:102 +#: config/models.py:102 config/templates/config/general.html:10 msgid "General" msgstr "Allgemein" #: config/models.py:126 config/templates/config/version.html:5 #: config/templates/config/version.html:8 -#: config/templates/config/version.html:11 motion/views.py:809 -#: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244 +#: config/templates/config/version.html:13 motion/pdf.py:104 msgid "Version" msgstr "Version" -#: config/views.py:69 +#: config/views.py:70 msgid "General settings successfully saved." msgstr "Allgemeine Einstellungen erfolgreich gespeichert." -#: config/views.py:110 config/templates/config/base_config.html:7 -msgid "Configuration" -msgstr "Konfiguration" - #: config/templates/config/general.html:5 -#: config/templates/config/general.html:8 msgid "General settings" msgstr "Allgemeine Einstellungen" -#: config/templates/config/general.html:11 +#: config/templates/config/general.html:15 msgid "Event" msgstr "Veranstaltung" -#: config/templates/config/general.html:26 +#: config/templates/config/general.html:33 msgid "Welcome Widget" msgstr "Willkommens-Widget" -#: config/templates/config/general.html:41 +#: config/templates/config/general.html:51 msgid "System" msgstr "System" -#: motion/forms.py:25 motion/models.py:541 motion/views.py:843 -#: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249 +#: motion/forms.py:38 motion/models.py:472 #: motion/templates/projector/Motion.html:77 msgid "Reason" msgstr "Begründung" -#: motion/forms.py:30 -msgid "Trivial change" -msgstr "Triviale Änderung" - -#: motion/forms.py:31 -msgid "Trivial changes don't create a new version." -msgstr "Triviale Änderungen erzeugen keine neue Version." - -#: motion/forms.py:35 motion/models.py:63 motion/views.py:762 -#: motion/templates/motion/overview.html:41 -#: motion/templates/motion/view.html:18 +#: motion/forms.py:59 motion/pdf.py:42 #: motion/templates/projector/Motion.html:55 msgid "Submitter" msgstr "Antragsteller/in" -#: motion/forms.py:44 motion/views.py:782 motion/templates/motion/view.html:22 +#: motion/forms.py:73 motion/pdf.py:66 msgid "Supporters" msgstr "Unterstützer/innen" -#: motion/forms.py:50 participant/forms.py:114 -msgid "CSV File" -msgstr "CSV-Datei" +#: motion/forms.py:88 +msgid "Create new version" +msgstr "" -#: motion/forms.py:54 -msgid "Import motions with status \"authorized\"" -msgstr "Anträge als \"Zugelassen\" importieren" +#: motion/forms.py:89 +msgid "Trivial changes don't create a new version." +msgstr "Triviale Änderungen erzeugen keine neue Version." -#: motion/forms.py:55 -msgid "Set the initial status for each motion to \"authorized\"" -msgstr "Setzt den initialen Status für jeden Antrag auf \"zugelassen\"" - -#: motion/forms.py:63 +#: motion/forms.py:98 msgid "Number of (minimum) required supporters for a motion" msgstr "Mindestanzahl erforderlicher Unterstützer/innen für einen Antrag" -#: motion/forms.py:67 +#: motion/forms.py:100 msgid "Choose 0 to disable the supporting system" -msgstr "Wähle 0 um das Unterstützersystem zu deaktivieren" +msgstr "Zum Deaktivieren des Unterstützersystems '0' eingeben" -#: motion/forms.py:72 +#: motion/forms.py:105 msgid "Motion preamble" msgstr "Antragseinleitung" -#: motion/forms.py:93 +#: motion/forms.py:126 msgid "Title for PDF document (all motions)" msgstr "Titel für PDF-Dokument (alle Anträge)" -#: motion/forms.py:98 +#: motion/forms.py:131 msgid "Preamble text for PDF document (all motions)" msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " -#: motion/forms.py:102 -msgid "Allow trivial changes" -msgstr "Triviale Änderungen erlauben" - -#: motion/forms.py:103 -msgid "Warning: Trivial changes undermine the motions autorisation system." +#: motion/forms.py:136 +msgid "Create new versions" msgstr "" -"Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von Anträgen." -#: motion/models.py:42 -msgid "Published" -msgstr "Veröffentlicht" - -#: motion/models.py:43 -msgid "Permitted" -msgstr "Zugelassen" - -#: motion/models.py:44 motion/templates/motion/overview.html:24 -#: motion/templates/motion/view.html:167 -msgid "Accepted" -msgstr "Angenommen" - -#: motion/models.py:45 motion/templates/motion/overview.html:25 -#: motion/templates/motion/view.html:172 -msgid "Rejected" -msgstr "Abgelehnt" - -#: motion/models.py:46 -msgid "Withdrawed" -msgstr "Zurückgezogen" - -#: motion/models.py:47 motion/templates/motion/view.html:180 -msgid "Adjourned" -msgstr "Vertagt" - -# please check! -#: motion/models.py:48 motion/templates/motion/view.html:183 -msgid "Not Concerned" -msgstr "Nicht befasst" - -# please check! -#: motion/models.py:49 motion/templates/motion/view.html:186 -msgid "Commited a bill" -msgstr "Verwiesen (in Ausschuss)" - -#: motion/models.py:50 -msgid "Rejected (not authorized)" -msgstr "Verworfen (nicht zulässig)" - -#: motion/models.py:51 motion/templates/motion/overview.html:27 -msgid "Needs Review" -msgstr "Benötigt Review" - -#: motion/models.py:100 -#, python-format -msgid "Version %d authorized" -msgstr "Version %d zugelassen" - -#: motion/models.py:107 -#, python-format -msgctxt "Rejected means not authorized" -msgid "Version %d rejected" -msgstr "Version %d verworfen" - -#: motion/models.py:136 -msgid "Searching for supporters." -msgstr "Auf Unterstützersuche." - -#: motion/models.py:138 -msgid "Not yet authorized." -msgstr "Noch nicht zugelassen." - -#: motion/models.py:140 -msgid "Not yet authorized changes." -msgstr "Noch nicht zugelassene Änderungen." - -#: motion/models.py:223 -#, python-format -msgid "" -"Trivial changes to version %(version)d; changed fields: %(changed_fields)s" +#: motion/forms.py:139 +msgid "create allways a new versions" msgstr "" -"Triviale Änderung an Version %(version)d; Geänderte Felder: " -"%(changed_fields)s" -#: motion/models.py:235 -#, python-format -msgid "Version %s created" -msgstr "Version %s erstellt" +#: motion/forms.py:140 +#, fuzzy +msgid "create never a new version" +msgstr "Triviale Änderungen erzeugen keine neue Version." -#: motion/models.py:244 -msgid "Supporters removed" -msgstr "Unterstützer/innen gelöscht" +#: motion/forms.py:141 +#, fuzzy +msgid "Let the user choose if he wants to create a new version" +msgstr "Triviale Änderungen erzeugen keine neue Version." -#: motion/models.py:253 -#, python-format -msgid "Status reseted to: %s" -msgstr "Status zurückgesetzt auf: %s" +#: motion/forms.py:146 +msgid "Workflow for the motions" +msgstr "" -#: motion/models.py:265 +#: motion/models.py:75 +msgid "Can see motions" +msgstr "Darf Anträge sehen" + +#: motion/models.py:76 +msgid "Can create motions" +msgstr "Darf Anträge erstellen" + +#: motion/models.py:77 +msgid "Can support motions" +msgstr "Darf Anträge unterstützen" + +#: motion/models.py:78 +msgid "Can manage motions" +msgstr "Darf Anträge verwalten" + +#: motion/models.py:489 +#, fuzzy +msgid "new" +msgstr "Neu" + +#: motion/pdf.py:35 motion/views.py:459 +#, fuzzy, python-format +msgid "Motion: %s" +msgstr "Anträge" + +#: motion/pdf.py:55 +msgid "Signature" +msgstr "Unterschrift" + +#: motion/pdf.py:95 +#, fuzzy +msgid "State" +msgstr "Status" + +#: motion/pdf.py:130 motion/templates/motion/motion_detail.html:53 +#: motion/templates/motion/motion_detail.html:61 +#: motion/templates/projector/Motion.html:33 +msgid "Vote" +msgstr "Abstimmung" + +#: motion/pdf.py:151 +#, fuzzy +msgid "Reason:" +msgstr "Begründung" + +#: motion/pdf.py:167 +msgid "No motions available." +msgstr "Keine Anträge vorhanden." + +#: motion/signals.py:24 +msgid "The assembly may decide," +msgstr "Die Versammlung möge beschließen," + +#: motion/signals.py:27 motion/views.py:457 motion/views.py:509 +#: motion/views.py:524 motion/templates/motion/config.html:10 +#: motion/templates/motion/motion_list.html:7 +#: motion/templates/motion/motion_list.html:10 +msgid "Motions" +msgstr "Anträge" + +#: motion/views.py:141 +#, fuzzy +msgid "Motion created" +msgstr "Antragseinleitung" + +#: motion/views.py:158 +#, fuzzy +msgid "Motion updated" +msgstr "Antragstext" + +#: motion/views.py:194 +#, fuzzy, python-format +msgid "Are you sure you want permit Version %s?" +msgstr "Soll Version %s wirklich zurückgewiesen werden?" + +#: motion/views.py:220 +#, fuzzy, python-format +msgid "Are you sure you want reject Version %s?" +msgstr "Soll Version %s wirklich zurückgewiesen werden?" + +#: motion/views.py:252 +msgid "You can not support this motion." +msgstr "Sie dürfen diesen Antrag nicht unterstützen." + +#: motion/views.py:255 +msgid "You can not unsupport this motion." +msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen." + +#: motion/views.py:263 +msgid "Do you really want to support this motion?" +msgstr "Wollen Sie wirklich diesen Antrag unterstützen?" + +#: motion/views.py:265 +msgid "Do you really want to unsupport this motion?" +msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?" + +#: motion/views.py:277 #, python-format msgid "Supporter: +%s" msgstr "Unterstützer/in: +%s" -#: motion/models.py:278 +#: motion/views.py:280 #, python-format msgid "Supporter: -%s" msgstr "Unterstützer/in: -%s" -#: motion/models.py:294 -#, python-format -msgid "Number set: %s" -msgstr "Nummer gesetzt: %s" +#: motion/views.py:285 +msgid "You have supported this motion successfully." +msgstr "Sie haben den Antrag erfolgreich unterstützt." -#: motion/models.py:307 -#, python-format -msgid "Version %s authorized" -msgstr "Version %s zugelassen" +#: motion/views.py:287 +msgid "You have unsupported this motion successfully." +msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." -#: motion/models.py:319 -#, python-format -msgid "Version %s not authorized" -msgstr "Version %s nicht zugelassen" +#: motion/views.py:310 +msgid "Poll created" +msgstr "Abstimmung erstellt" -#: motion/models.py:335 -#, python-format -msgid "The motion status is already '%s.'" -msgstr "Der Antragsstatus ist bereits '%s'." +#: motion/views.py:311 +msgid "New vote was successfully created." +msgstr "Neue Abstimmung erfolgreich angelegt." -#: motion/models.py:343 -#, python-format -msgid "" -"The motion status is: '%(currentstatus)s'. You can not set the status to " -"'%(newstatus)s'." +#: motion/views.py:361 +#, fuzzy +msgid "Poll updated" +msgstr "Abstimmung wurde aktualisiert" + +#: motion/views.py:374 +msgid "Poll deleted" +msgstr "Abstimmung gelöscht" + +#: motion/views.py:404 +#, fuzzy, python-format +msgid "Changed state to %s" +msgstr "Status ändern" + +#: motion/views.py:406 +#, fuzzy, python-format +msgid "Motion status was set to: %s." +msgstr "Antragsstatus wurde gesetzt auf: %s." + +#: motion/views.py:431 +#, fuzzy +msgid "Created Agenda Item" +msgstr "Tagesordnungseintrag" + +#: motion/views.py:500 +msgid "Motion settings successfully saved." +msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." + +#: motion/workflow.py:128 +msgid "Unknwon state" msgstr "" -"Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht auf " -"'%(newstatus)s' setzen." -#: motion/models.py:351 -msgid "Status modified" -msgstr "Status geändert" +#: motion/workflow.py:131 +msgid "Published" +msgstr "Veröffentlicht" -#: motion/models.py:443 motion/models.py:445 -msgid "by" -msgstr "von" +#: motion/workflow.py:136 +msgid "Permitted" +msgstr "Zugelassen" -#: motion/models.py:453 motion/templates/motion/view.html:210 -#: motion/templates/motion/widget.html:27 +#: motion/workflow.py:137 +msgid "Accepted" +msgstr "Angenommen" + +#: motion/workflow.py:138 +msgid "Rejected" +msgstr "Abgelehnt" + +#: motion/workflow.py:139 +msgid "Withdrawed" +msgstr "Zurückgezogen" + +#: motion/workflow.py:140 +msgid "Adjourned" +msgstr "Vertagt" + +# please check! +#: motion/workflow.py:141 +msgid "Not Concerned" +msgstr "Nicht befasst" + +# please check! +#: motion/workflow.py:142 +msgid "Commited a bill" +msgstr "Verwiesen (in Ausschuss)" + +#: motion/workflow.py:143 +msgid "Needs Review" +msgstr "Benötigt Review" + +#: motion/workflow.py:144 +msgid "Rejected (not authorized)" +msgstr "Verworfen (nicht zulässig)" + +#: motion/templates/motion/config.html:5 +msgid "Motion settings" +msgstr "Antrags Einstellungen" + +#: motion/templates/motion/motion_detail.html:7 +#: motion/templates/projector/Motion.html:7 +#: motion/templates/projector/Motion.html:65 +msgid "Motion" +msgstr "Antrag" + +#: motion/templates/motion/motion_detail.html:54 +msgid "Edit Vote" +msgstr "Abstimmung bearbeiten" + +#: motion/templates/motion/motion_detail.html:57 +msgid "Delete Vote" +msgstr "Abstimmung löschen" + +#: motion/templates/motion/motion_detail.html:77 +#, fuzzy +msgid "Enter result" +msgstr "Abstimmungsergebnis" + +#: motion/templates/motion/motion_detail.html:87 +msgid "New vote" +msgstr "Neue Abstimmung" + +#: motion/templates/motion/motion_form.html:7 +#, fuzzy +msgid "Motion Form" +msgstr "Antrag Nr." + +#: motion/templates/motion/motion_form.html:10 +#, fuzzy +msgid "Motions Forms" +msgstr "Anträge" + +#: motion/templates/motion/poll_form.html:15 +msgid "Option" +msgstr "Wahlmöglichkeit" + +#: motion/templates/motion/widget.html:19 +#: participant/templates/participant/personal_info_widget.html:9 +#: participant/templates/participant/personal_info_widget.html:28 +msgid "motion" +msgstr "Antrag" + +#: motion/templates/motion/widget.html:23 #: motion/templates/projector/Motion.html:65 #: participant/templates/participant/personal_info_widget.html:13 #: participant/templates/participant/personal_info_widget.html:32 msgid "no number" msgstr "ohne Nummer" -#: motion/models.py:454 motion/templates/motion/widget.html:23 -#: participant/templates/participant/personal_info_widget.html:9 -#: participant/templates/participant/personal_info_widget.html:28 -msgid "motion" -msgstr "Antrag" - -#: motion/models.py:479 -msgid "Poll created" -msgstr "Abstimmung erstellt" - -#: motion/models.py:530 -msgid "Can see motions" -msgstr "Darf Anträge sehen" - -#: motion/models.py:531 -msgid "Can create motions" -msgstr "Darf Anträge erstellen" - -#: motion/models.py:532 -msgid "Can support motions" -msgstr "Darf Anträge unterstützen" - -#: motion/models.py:533 -msgid "Can manage motions" -msgstr "Darf Anträge verwalten" - -#: motion/models.py:600 -msgid "The assembly may decide," -msgstr "Die Versammlung möge beschließen," - -#: motion/models.py:603 motion/views.py:712 motion/views.py:937 -#: motion/views.py:948 motion/templates/motion/base_motion.html:9 -#: motion/templates/motion/overview.html:7 -#: motion/templates/motion/overview.html:10 -msgid "Motions" -msgstr "Anträge" - -#: motion/views.py:167 -msgid "You have not the necessary rights to create or edit motions." -msgstr "" -"Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " -"bearbeiten." - -#: motion/views.py:172 -msgid "You can not edit this motion." -msgstr "Sie dürfen diesen Antrag nicht bearbeiten." - -#: motion/views.py:230 -msgid "New motion was successfully created." -msgstr "Neuer Antrag wurde erfolgreich angelegt." - -#: motion/views.py:232 -msgid "Motion was successfully modified." -msgstr "Antrag wurde erfolgreich geändert." - -#: motion/views.py:246 -msgid "" -"Attention: Do you really want to edit this motion? The supporters will " -"not be removed automatically because you can manage motions. Please " -"check if the supports are valid after your changing!" -msgstr "" -"Achtung: Wollen Sie den Antrag wirklich ändern? Die Unterstützer/innen " -"werden nicht automatisch entfernt, da Sie Anträge verwalten dürfen. " -"Prüfen Sie, ob die Unterstützungen noch gültig sind." - -#: motion/views.py:248 -#, python-format -msgid "" -"Attention: Do you really want to edit this motion? All %s supporters " -"will be removed! Try to convince the supporters again." -msgstr "" -"Wollen Sie den Antrag wirklich ändern? Alle %s Unterstützer/innen " -"werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." - -#: motion/views.py:280 -msgid "Motion number was successfully set." -msgstr "Antragsnummer wurde erfolgreich gesetzt." - -#: motion/views.py:296 -msgid "Motion was successfully authorized." -msgstr "Antrag wurde erfolgreich zugelassen." - -#: motion/views.py:311 -msgid "Motion was successfully rejected." -msgstr "Antrag wurde erfolgreich verworfen." - -#: motion/views.py:327 -#, python-format -msgid "Motion status was set to: %s." -msgstr "Antragsstatus wurde gesetzt auf: %s." - -#: motion/views.py:343 -msgid "Motion status was reset." -msgstr "Antragsstatus wurde zurückgesetzt." - -#: motion/views.py:370 -msgid "You can not support this motion." -msgstr "Sie dürfen diesen Antrag nicht unterstützen." - -#: motion/views.py:373 -msgid "You can not unsupport this motion." -msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen." - -#: motion/views.py:384 -msgid "Do you really want to support this motion?" -msgstr "Wollen Sie wirklich diesen Antrag unterstützen?" - -#: motion/views.py:386 -msgid "Do you really want to unsupport this motion?" -msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?" - -#: motion/views.py:397 -msgid "You have supported this motion successfully." -msgstr "Sie haben den Antrag erfolgreich unterstützt." - -#: motion/views.py:399 -msgid "You have unsupported this motion successfully." -msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." - -#: motion/views.py:413 -msgid "New vote was successfully created." -msgstr "Neue Abstimmung erfolgreich angelegt." - -#: motion/views.py:429 -msgid "Poll deleted" -msgstr "Abstimmung gelöscht" - -#: motion/views.py:430 -msgid "Poll was successfully deleted." -msgstr "Abstimmung wurde erfolgreich gelöscht." - -#: motion/views.py:432 -#, python-format -msgid "the %s. poll" -msgstr "die %s. Abstimmung" - -#: motion/views.py:473 motion/views.py:482 -#, python-format -msgid "You can not delete motion %s." -msgstr "Sie können Antrag %s nicht löschen." - -#: motion/views.py:478 motion/views.py:486 -#, python-format -msgid "Motion %s was successfully deleted." -msgstr "Antrag %s wurde erfolgreich gelöscht." - -#: motion/views.py:488 -msgid "Invalid request" -msgstr "Ungültige Anfrage" - -#: motion/views.py:512 -msgid "Poll was updated" -msgstr "Abstimmung wurde aktualisiert" - -#: motion/views.py:529 -#, python-format -msgid "Version %s accepted." -msgstr "Version %s akzeptiert." - -#: motion/views.py:531 -#, python-format -msgid "Do you really want to authorize version %s?" -msgstr "Soll Version %s wirklich zugelassen werden?" - -#: motion/views.py:541 -#, python-format -msgid "Version %s rejected." -msgstr "Version %s zurückgewiesen." - -#: motion/views.py:543 -msgid "ERROR by rejecting the version." -msgstr "FEHLER beim Zurückweisen der Version." - -#: motion/views.py:545 -#, python-format -msgid "Do you really want to reject version %s?" -msgstr "Soll Version %s wirklich zurückgewiesen werden?" - -#: motion/views.py:581 motion/views.py:585 motion/views.py:591 -#: motion/views.py:594 participant/api.py:78 -#, python-format -msgid "Ignoring malformed line %d in import file." -msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." - -#: motion/views.py:602 -#, python-format -msgid "Ignoring line %d because the assigned group may not act as a person." -msgstr "" -"Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete Gruppe " -"nicht als Person auftreten darf." - -#: motion/views.py:611 -msgid "Created by motion import." -msgstr "Erstellt durch Antragsimport." - -#: motion/views.py:625 -#, python-format -msgid "" -"Ignoring line %d because it contains an incomplete first / last name pair." -msgstr "" -"Fehlerhafte Zeile %d der Quelldatei wurde ignoriert, da Vor- bzw. Nachname " -"Leerstrings enthalten." - -#: motion/views.py:663 -#, python-format -msgid "%d motion was successfully imported." -msgid_plural "%d motions were successfully imported." -msgstr[0] "%d Antrag wurde erfolgreich importiert." -msgstr[1] "%d Anträge wurden erfolgreich importiert." - -#: motion/views.py:666 -#, python-format -msgid "%d motion was successfully modified." -msgid_plural "%d motions were successfully modified." -msgstr[0] "%d Antrag wurde erfolgreich geändert." -msgstr[1] "%d Anträge wurden erfolgreich geändert." - -#: motion/views.py:669 -#, python-format -msgid "%d new user was added." -msgid_plural "%d new users were added." -msgstr[0] "%d neuer Nutzer wurde erstellt." -msgstr[1] "%d neue Nutzer wurden erstellt." - -#: motion/views.py:672 -#, python-format -msgid "%d new group was added." -msgid_plural "%d new groups were added." -msgstr[0] "%d neue Gruppe wurde erstellt." -msgstr[1] "%d neue Gruppen wurden erstellt." - -#: motion/views.py:675 -#, python-format -msgid "%d group assigned to motions." -msgid_plural "%d groups assigned to motions." -msgstr[0] "%d Gruppe wurde zugewiesen." -msgstr[1] "%d Gruppen wurden zugewiesen." - -#: motion/views.py:679 participant/api.py:94 -msgid "Import aborted because of severe errors in the input file." -msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." - -#: motion/views.py:681 participant/api.py:96 -msgid "Import file has wrong character encoding, only UTF-8 is supported!" -msgstr "" -"Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " -"wird unterstützt!" - -#: motion/views.py:685 -msgid "" -"Attention: Existing motions will be modified if you import new motions with " -"the same number." -msgstr "" -"Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " -"identischer Nummer importieren." - -#: motion/views.py:686 -msgid "" -"Attention: Importing an motions without a number multiple times will create " -"duplicates." -msgstr "" -"Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " -"entstehen." - -#: motion/views.py:719 motion/views.py:857 -#: motion/templates/motion/poll_view.html:7 -#: motion/templates/motion/poll_view.html:12 -#: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206 -#: motion/templates/motion/view.html:225 -#: motion/templates/projector/Motion.html:7 -#: motion/templates/projector/Motion.html:65 -msgid "Motion" -msgstr "Antrag" - -#: motion/views.py:733 motion/templates/motion/overview.html:84 -msgid "No motions available." -msgstr "Keine Anträge vorhanden." - -#: motion/views.py:738 motion/views.py:740 motion/views.py:755 -#: motion/views.py:757 motion/templates/motion/base_motion.html:24 -#: motion/templates/projector/Motion.html:63 -msgid "Motion No." -msgstr "Antrag Nr." - -#: motion/views.py:772 -msgid "Signature" -msgstr "Unterschrift" - -#: motion/views.py:823 motion/templates/motion/base_motion.html:55 -#: motion/templates/motion/poll_view.html:8 -#: motion/templates/motion/poll_view.html:13 -#: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 -#: motion/templates/projector/Motion.html:33 -msgid "Vote" -msgstr "Abstimmung" - -#: motion/views.py:857 -msgid "Poll" -msgstr "Abstimmung" - -#: motion/views.py:871 -#, python-format -msgid "Motion No. %s" -msgstr "Antrag Nr. %s" - -#: motion/views.py:873 -#, python-format -msgid "%d. Vote" -msgstr "%d. Abstimmung" - -#: motion/views.py:930 -msgid "Motion settings successfully saved." -msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." - -#: motion/templates/motion/base_motion.html:11 -msgid "All motions" -msgstr "Alle Anträge" - -#: motion/templates/motion/base_motion.html:13 -#: motion/templates/motion/edit.html:10 motion/templates/motion/edit.html:18 -msgid "New motion" -msgstr "Neuer Antrag" - -#: motion/templates/motion/base_motion.html:16 -#: motion/templates/motion/import.html:5 motion/templates/motion/import.html:8 -msgid "Import motions" -msgstr "Anträge importieren" - -#: motion/templates/motion/base_motion.html:18 -msgid "All motions as PDF" -msgstr "Alle Anträge als PDF" - -#: motion/templates/motion/base_motion.html:34 -msgid "View motion" -msgstr "Antrag anzeigen" - -#: motion/templates/motion/base_motion.html:38 -#: motion/templates/motion/edit.html:8 motion/templates/motion/edit.html:16 -#: motion/templates/motion/overview.html:72 -msgid "Edit motion" -msgstr "Antrag bearbeiten" - -#: motion/templates/motion/base_motion.html:42 -#: motion/templates/motion/overview.html:74 -msgid "Delete motion" -msgstr "Antrag löschen" - -#: motion/templates/motion/base_motion.html:45 -#: motion/templates/motion/overview.html:77 -msgid "Motion as PDF" -msgstr "Antrag als PDF" - -#: motion/templates/motion/base_motion.html:49 -msgid "Show Motion" -msgstr "Antrag projizieren" - -#: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8 -msgid "Motion settings" -msgstr "Antrags Einstellungen" - -#: motion/templates/motion/import.html:9 -msgid "Select a CSV file to import motions!" -msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!" - -#: motion/templates/motion/import.html:11 -#: participant/templates/participant/import.html:11 -msgid "Required comma separated values" -msgstr "Erforderliche kommaseparierte Werte" - -#: motion/templates/motion/import.html:12 -msgid "number, title, text, reason, first_name, last_name, is_group" -msgstr "Nummer, Titel, Text, Begründung, Vorname, Nachname, Gruppenantrag" - -#: motion/templates/motion/import.html:14 -msgid "" -"number, reason and is_group are " -"optional and may be empty" -msgstr "" -"Nummer, Begründung und Gruppenantrag " -"sind optional und können auch leer sein" - -#: motion/templates/motion/import.html:16 -#: participant/templates/participant/import.html:14 -msgid "Required CSV file encoding: UTF-8 (Unicode)." -msgstr "Erforderliches CSV-Datei-Encoding: UTF-8 (Unicode)." - -#: motion/templates/motion/import.html:19 -#: participant/templates/participant/import.html:17 -msgid "A CSV example file is available in OpenSlides Wiki." -msgstr "Eine CSV-Beispiel-Datei gibt es im OpenSlides Wiki." - -#: motion/templates/motion/import.html:26 -#: participant/templates/participant/import.html:24 -msgid "Import" -msgstr "Importieren" - -#: motion/templates/motion/overview.html:15 -msgid "Need supporters" -msgstr "Benötigt Unterstützer/innen" - -#: motion/templates/motion/overview.html:18 -msgid "Without number" -msgstr "Ohne Nummer" - -#: motion/templates/motion/overview.html:22 -msgid "Not yet authorized" -msgstr "Noch nicht zugelassen" - -#: motion/templates/motion/overview.html:23 -msgid "Authorized" -msgstr "Zugelassen" - -#: motion/templates/motion/overview.html:26 -msgid "Withdrawen (by submitter)" -msgstr "Zurückgezogen (durch Antragsteller/in)" - -#: motion/templates/motion/overview.html:32 -msgctxt "number of motions" -msgid "motion" -msgid_plural "motions" -msgstr[0] "Antrag" -msgstr[1] "Anträge" - -#: motion/templates/motion/overview.html:35 -msgid "Number" -msgstr "Nummer" - -#: motion/templates/motion/overview.html:36 -msgid "Motion title" -msgstr "Antragstitel" - -#: motion/templates/motion/overview.html:38 -msgid "Number of supporters" -msgstr "Anzahl der Unterstützer/innen" - -#: motion/templates/motion/overview.html:42 -#: motion/templates/motion/view.html:109 -msgid "Creation Time" -msgstr "Erstellungszeit" - -#: motion/templates/motion/overview.html:67 -msgid "Activate motion" -msgstr "Antrag projizieren" - -#: motion/templates/motion/poll_view.html:21 -msgid "Option" -msgstr "Wahlmöglichkeit" - -#: motion/templates/motion/view.html:51 motion/templates/motion/view.html:91 -msgid "New vote" -msgstr "Neue Abstimmung" - -#: motion/templates/motion/view.html:67 -msgid "Edit Vote" -msgstr "Abstimmung bearbeiten" - -#: motion/templates/motion/view.html:70 -msgid "Delete Vote" -msgstr "Abstimmung löschen" - -#: motion/templates/motion/view.html:99 -msgid "Enter result" -msgstr "Ergebnis eingeben" - -#: motion/templates/motion/view.html:116 -msgid "Withdraw" -msgstr "Zurückziehen" - -#: motion/templates/motion/view.html:124 -msgid "Unsupport" -msgstr "Nicht unterstützen" - -#: motion/templates/motion/view.html:130 -msgid "Support" -msgstr "Unterstützen" - -#: motion/templates/motion/view.html:136 -msgid "minimum required supporters" -msgstr "minimal erforderliche Unterstützer/innen" - -#: motion/templates/motion/view.html:143 -msgid "Manage motion" -msgstr "Antrag Verwalten" - -#: motion/templates/motion/view.html:146 -msgid "Formal validation" -msgstr "Formale Gültigkeitsprüfung" - -#: motion/templates/motion/view.html:148 -msgid "Publish" -msgstr "Veröffentlichen" - -#: motion/templates/motion/view.html:151 -msgid "Permit" -msgstr "Zulassen" - -#: motion/templates/motion/view.html:154 -msgid "Not permit (reject)" -msgstr "Nicht zulassen (verwerfen)" - -#: motion/templates/motion/view.html:157 -msgid "Set number" -msgstr "Setze Nummer" - -#: motion/templates/motion/view.html:164 -msgid "Result after vote" -msgstr "Ergebnis nach der Abstimmung" - -#: motion/templates/motion/view.html:178 -msgid "Result after debate" -msgstr "Ergebnis nach der Debatte" - -#: motion/templates/motion/view.html:189 -msgid "Withdrawed by submitter" -msgstr "Zurückgezogen durch Antragsteller/in" - -#: motion/templates/motion/view.html:194 -msgid "For Administration only:" -msgstr "Nur zur Administration:" - -#: motion/templates/motion/view.html:196 -msgid "Reset" -msgstr "Zurücksetzen" - -#: motion/templates/motion/view.html:219 -msgid "This is not the newest version." -msgstr "Dies ist nicht die neuste Version." - -#: motion/templates/motion/view.html:219 motion/templates/motion/view.html:221 -msgid "Go to version" -msgstr "Gehe zu Version" - -#: motion/templates/motion/view.html:221 -msgid "This is not the authorized version." -msgstr "Dies ist nicht die zugelassene Version." - -#: motion/templates/motion/view.html:239 -msgid "Version History" -msgstr "Versionshistorie" - -#: motion/templates/motion/view.html:256 -msgid "Version authorized" -msgstr "Version %d zugelassen" - -#: motion/templates/motion/view.html:259 -msgid "Permit Version" -msgstr "Version zulassen" - -#: motion/templates/motion/view.html:262 -msgid "Reject Version" -msgstr "Version verwerfen" - -#: motion/templates/motion/view.html:266 -msgid "Version rejected" -msgstr "Version verworfen" - -#: motion/templates/motion/view.html:276 motion/templates/motion/view.html:283 -#: motion/templates/motion/view.html:290 -msgid "unchanged" -msgstr "unverändert" - -#: motion/templates/motion/view.html:299 -msgid "Log" -msgstr "Log" - -#: motion/templates/motion/widget.html:31 +#: motion/templates/motion/widget.html:27 msgid "No motion available." msgstr "Keine Antrag vorhanden." @@ -1951,14 +1474,34 @@ msgstr "Abstimmungsergebnis" msgid "No poll results available." msgstr "Keine Abstimmungsergebnisse vorhanden." +#: motion/templates/projector/Motion.html:63 +msgid "Motion No." +msgstr "Antrag Nr." + #: participant/__init__.py:3 msgid "Participant" msgstr "Teilnehmer" -#: participant/forms.py:28 participant/views.py:604 -#: participant/templates/participant/group_overview.html:7 -#: participant/templates/participant/group_overview.html:10 -#: participant/templates/participant/user_detail.html:14 +#: participant/api.py:78 +#, python-format +msgid "Ignoring malformed line %d in import file." +msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." + +#: participant/api.py:94 +msgid "Import aborted because of severe errors in the input file." +msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." + +#: participant/api.py:96 +msgid "Import file has wrong character encoding, only UTF-8 is supported!" +msgstr "" +"Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " +"wird unterstützt!" + +#: participant/forms.py:28 participant/views.py:602 +#: participant/templates/participant/group_overview.html:6 +#: participant/templates/participant/group_overview.html:9 +#: participant/templates/participant/overview.html:21 +#: participant/templates/participant/user_detail.html:18 msgid "Groups" msgstr "Gruppen" @@ -1966,11 +1509,11 @@ msgstr "Gruppen" msgid "Permissions" msgstr "Rechte" -#: participant/forms.py:56 participant/views.py:543 participant/views.py:590 -#: participant/templates/participant/base_participant.html:12 +#: participant/forms.py:56 participant/views.py:540 participant/views.py:588 +#: participant/templates/participant/config.html:10 #: participant/templates/participant/overview.html:7 -#: participant/templates/participant/overview.html:18 -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:16 +#: participant/templates/participant/overview.html:95 msgid "Participants" msgstr "Teilnehmer/innen" @@ -1983,6 +1526,10 @@ msgstr "Sie dürfen den Namen dieser Gruppe nicht bearbeiten." msgid "Group name \"%s\" is reserved for internal use." msgstr "Der Gruppenname \"%s\" ist für interne Verwendung reserviert." +#: participant/forms.py:114 +msgid "CSV File" +msgstr "CSV-Datei" + #: participant/forms.py:121 msgid "System URL" msgstr "System URL" @@ -1999,32 +1546,32 @@ msgstr "Teilnehmer/innen nach Vornamen sortieren" msgid "Disable for sorting by last name" msgstr "Deaktivieren für Sortierung nach Nachnamen" -#: participant/models.py:33 participant/templates/participant/overview.html:25 +#: participant/models.py:33 participant/templates/participant/overview.html:57 msgid "Male" msgstr "Männlich" -#: participant/models.py:34 participant/templates/participant/overview.html:26 +#: participant/models.py:34 participant/templates/participant/overview.html:58 msgid "Female" msgstr "Weiblich" -#: participant/models.py:37 participant/templates/participant/overview.html:38 +#: participant/models.py:37 participant/templates/participant/overview.html:70 msgid "Delegate" msgstr "Delegierter" -#: participant/models.py:38 participant/templates/participant/overview.html:39 +#: participant/models.py:38 participant/templates/participant/overview.html:71 msgid "Observer" msgstr "Beobachter" -#: participant/models.py:39 participant/templates/participant/overview.html:40 +#: participant/models.py:39 participant/templates/participant/overview.html:72 msgid "Staff" msgstr "Mitarbeiter" -#: participant/models.py:40 participant/templates/participant/overview.html:41 +#: participant/models.py:40 participant/templates/participant/overview.html:73 msgid "Guest" msgstr "Gast" -#: participant/models.py:45 participant/templates/participant/overview.html:30 -#: participant/templates/participant/overview.html:68 +#: participant/models.py:45 participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:102 msgid "Structure level" msgstr "Gliederungsebene" @@ -2032,8 +1579,8 @@ msgstr "Gliederungsebene" msgid "Will be shown after the name." msgstr "Wird nach dem Namen angezeigt." -#: participant/models.py:49 participant/templates/participant/overview.html:24 -#: participant/templates/participant/user_detail.html:24 +#: participant/models.py:49 participant/templates/participant/overview.html:56 +#: participant/templates/participant/user_detail.html:28 msgid "Gender" msgstr "Geschlecht" @@ -2045,15 +1592,15 @@ msgstr "Nur zum Filtern der Teilnehmerliste." msgid "Typ" msgstr "Typ" -#: participant/models.py:54 participant/views.py:248 -#: participant/templates/participant/overview.html:45 -#: participant/templates/participant/overview.html:70 -#: participant/templates/participant/user_detail.html:34 +#: participant/models.py:54 participant/views.py:246 +#: participant/templates/participant/overview.html:77 +#: participant/templates/participant/overview.html:104 +#: participant/templates/participant/user_detail.html:38 msgid "Committee" msgstr "Amt" #: participant/models.py:57 -#: participant/templates/participant/user_detail.html:39 +#: participant/templates/participant/user_detail.html:43 msgid "About me" msgstr "Über mich" @@ -2089,90 +1636,92 @@ msgstr "Zum Beispiel als Antragsteller." msgid "Welcome to OpenSlides!" msgstr "Willkommen bei OpenSlides!" -#: participant/views.py:200 +#: participant/views.py:198 msgid "You can not delete yourself." msgstr "Sie dürfen sich nicht selbst löschen." -#: participant/views.py:221 +#: participant/views.py:219 msgid "You can not deactivate yourself." msgstr "Sie dürfen sich nicht selbst deaktivieren." -#: participant/views.py:224 +#: participant/views.py:222 msgid "You can not deactivate the administrator." msgstr "Sie dürfen den Administrator nicht deaktivieren." -#: participant/views.py:243 +#: participant/views.py:241 msgid "Participant-list" msgstr "Teilnehmerliste" -#: participant/views.py:244 +#: participant/views.py:242 msgid "List of Participants" msgstr "Teilnehmerliste" -#: participant/views.py:247 participant/templates/participant/overview.html:67 +#: participant/views.py:245 +#: participant/templates/participant/overview.html:101 msgid "Last Name" msgstr "Nachname" -#: participant/views.py:247 participant/templates/participant/overview.html:66 +#: participant/views.py:245 +#: participant/templates/participant/overview.html:100 msgid "First Name" msgstr "Vorname" -#: participant/views.py:247 -#: participant/templates/participant/group_overview.html:13 +#: participant/views.py:245 +#: participant/templates/participant/group_overview.html:18 msgid "Group" msgstr "Gruppe" -#: participant/views.py:279 +#: participant/views.py:277 msgid "Participant-passwords" msgstr "Teilnehmer-Passwoerter" -#: participant/views.py:301 +#: participant/views.py:299 msgid "Account for OpenSlides" msgstr "Zugang für OpenSlides" -#: participant/views.py:303 +#: participant/views.py:301 #, python-format msgid "for %s" msgstr "für %s" -#: participant/views.py:306 +#: participant/views.py:304 #, python-format msgid "User: %s" msgstr "Nutzername: %s" -#: participant/views.py:310 +#: participant/views.py:308 #, python-format msgid "Password: %s" msgstr "Passwort: %s" -#: participant/views.py:315 +#: participant/views.py:313 #, python-format msgid "URL: %s" msgstr "URL: %s" -#: participant/views.py:357 +#: participant/views.py:355 #, python-format msgid "%d new participants were successfully imported." msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert." -#: participant/views.py:368 +#: participant/views.py:366 msgid "Do you really want to reset the password?" msgstr "Soll das Passwort wirklich zurückgesetzt werden?" -#: participant/views.py:381 +#: participant/views.py:379 #, python-format msgid "The Password for %s was successfully reset." msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt." -#: participant/views.py:438 +#: participant/views.py:434 msgid "You can not delete this Group." msgstr "Sie dürfen diese Gruppe nicht löschen." -#: participant/views.py:466 +#: participant/views.py:463 msgid "Participants settings successfully saved." msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert." -#: participant/views.py:476 +#: participant/views.py:473 #, python-format msgid "" "Installation was successfully! Use %(user)s (password: %(password)s) for " @@ -2185,197 +1734,177 @@ msgstr "" "Sie das Passwort nach der ersten Anmeldung! Anderenfalls erscheint diese " "Meldung weiterhin für alle und ist ein Sicherheitsrisiko." -#: participant/views.py:502 +#: participant/views.py:499 msgid "User settings successfully saved." msgstr "Nutzereinstellungen wurden erfolgreich gespeichert." -#: participant/views.py:525 +#: participant/views.py:522 msgid "Password successfully changed." msgstr "Passwort wurde erfolgreich geändert." -#: participant/views.py:576 -msgid "My motions and elections" -msgstr "Meine Anträge und Wahlen" - -#: participant/templates/participant/base_participant.html:15 -msgid "All participants" -msgstr "Alle Teilnehmer/innen" - -#: participant/templates/participant/base_participant.html:18 -#: participant/templates/participant/edit.html:10 -#: participant/templates/participant/edit.html:19 -msgid "New participant" -msgstr "Neue/r Teilnehmer/in" - -#: participant/templates/participant/base_participant.html:19 -msgid "All groups" -msgstr "Alle Gruppen" - -#: participant/templates/participant/base_participant.html:20 -#: participant/templates/participant/group_edit.html:10 -#: participant/templates/participant/group_edit.html:18 -msgid "New group" -msgstr "Neue Gruppe" - -#: participant/templates/participant/base_participant.html:21 -#: participant/templates/participant/import.html:5 -#: participant/templates/participant/import.html:8 -msgid "Import participants" -msgstr "Teilnehmer/innen importieren" - -#: participant/templates/participant/base_participant.html:24 -msgid "List of participants as PDF" -msgstr "Teilnehmerliste als PDF" - -#: participant/templates/participant/base_participant.html:27 -msgid "First time passwords as PDF" -msgstr "Erst-Passwörter als PDF" - -#: participant/templates/participant/base_participant.html:38 -msgid "View participant" -msgstr "Teilnehmer/in anzeigen" - -#: participant/templates/participant/base_participant.html:45 -#: participant/templates/participant/edit.html:8 -#: participant/templates/participant/edit.html:17 -#: participant/templates/participant/overview.html:94 -msgid "Edit participant" -msgstr "Teilnehmer/in bearbeiten" - -#: participant/templates/participant/base_participant.html:50 -#: participant/templates/participant/overview.html:98 -msgid "Delete participant" -msgstr "Teilnehmer/in löschen" - -#: participant/templates/participant/base_participant.html:60 -msgid "View group" -msgstr "Gruppen anzeigen" - -#: participant/templates/participant/base_participant.html:65 -#: participant/templates/participant/group_edit.html:8 -#: participant/templates/participant/group_edit.html:16 -#: participant/templates/participant/group_overview.html:19 -msgid "Edit group" -msgstr "Gruppe bearbeiten" - -#: participant/templates/participant/base_participant.html:71 -#: participant/templates/participant/group_overview.html:21 -msgid "Delete group" -msgstr "Gruppe löschen" - #: participant/templates/participant/config.html:5 -#: participant/templates/participant/config.html:8 msgid "Participant settings" msgstr "Teilnehmer/innen-Einstellungen" -#: participant/templates/participant/edit.html:26 +#: participant/templates/participant/edit.html:8 +#: participant/templates/participant/edit.html:17 +msgid "Edit participant" +msgstr "Teilnehmer/in bearbeiten" + +#: participant/templates/participant/edit.html:10 +#: participant/templates/participant/edit.html:19 +#: participant/templates/participant/overview.html:20 +msgid "New participant" +msgstr "Neue/r Teilnehmer/in" + +#: participant/templates/participant/edit.html:30 msgid "Reset to First Password" msgstr "Auf Erst-Passwort zurücksetzen" -#: participant/templates/participant/group_detail.html:14 +#: participant/templates/participant/group_detail.html:18 msgid "Members" msgstr "Mitglieder" -#: participant/templates/participant/group_detail.html:19 +#: participant/templates/participant/group_detail.html:24 msgid "No members available." msgstr "Keine Mitglieder vorhanden." -#: participant/templates/participant/group_overview.html:27 -#: participant/templates/participant/group_widget.html:24 +#: participant/templates/participant/group_edit.html:8 +#: participant/templates/participant/group_edit.html:17 +msgid "Edit group" +msgstr "Gruppe bearbeiten" + +#: participant/templates/participant/group_edit.html:10 +#: participant/templates/participant/group_edit.html:19 +#: participant/templates/participant/group_overview.html:11 +msgid "New group" +msgstr "Neue Gruppe" + +#: participant/templates/participant/group_overview.html:12 +msgid "Back to participants overview" +msgstr "Zurück zur Teilnehmer/innen-Übersicht" + +#: participant/templates/participant/group_widget.html:21 msgid "No groups available." msgstr "Keine Gruppen vorhanden." +#: participant/templates/participant/import.html:5 #: participant/templates/participant/import.html:9 +#: participant/templates/participant/overview.html:22 +msgid "Import participants" +msgstr "Teilnehmer/innen importieren" + +#: participant/templates/participant/import.html:15 msgid "Select a CSV file to import participants!" msgstr "Wählen Sie eine CSV-Datei zum Importieren von Teilnehmer/innen aus!" -#: participant/templates/participant/import.html:12 +#: participant/templates/participant/import.html:17 +msgid "Required comma separated values" +msgstr "Erforderliche kommaseparierte Werte" + +#: participant/templates/participant/import.html:18 msgid "" "first_name, last_name, gender, structure level, type, committee, comment" msgstr "Vorname, Nachname, Geschlecht, Gliederungsebene, Typ, Amt, Kommentar" -#: participant/templates/participant/login.html:8 -#: participant/templates/participant/login.html:16 -#: participant/templates/participant/login.html:58 templates/base.html:32 -msgid "Login" -msgstr "Anmelden" +#: participant/templates/participant/import.html:20 +msgid "Required CSV file encoding: UTF-8 (Unicode)." +msgstr "Erforderliches CSV-Datei-Encoding: UTF-8 (Unicode)." -#: participant/templates/participant/login.html:21 -#: participant/templates/participant/login.html:34 templates/base.html:57 -#: templates/base.html.py:64 -msgid "Close this notification" -msgstr "Meldung ausblenden" +#: participant/templates/participant/import.html:23 +msgid "A CSV example file is available in OpenSlides Wiki." +msgstr "Eine CSV-Beispiel-Datei gibt es im OpenSlides Wiki." -#: participant/templates/participant/login.html:27 +#: participant/templates/participant/import.html:30 +#: participant/templates/participant/overview.html:22 +msgid "Import" +msgstr "Importieren" + +#: participant/templates/participant/login.html:19 msgid "Your username and password were not accepted. Please try again." msgstr "" "Benutzername und Passwort wurden nicht akzeptiert. Bitte versuchen Sie es " "erneut." -#: participant/templates/participant/login.html:62 +#: participant/templates/participant/login.html:38 +msgid "Username" +msgstr "Benutzername" + +#: participant/templates/participant/login.html:42 +msgid "Password" +msgstr "Passwort" + +#: participant/templates/participant/login.html:47 +#: participant/templates/participant/overview.html:37 templates/base.html:46 +msgid "Login" +msgstr "Anmelden" + +#: participant/templates/participant/login.html:51 msgid "Continue as guest" msgstr "Weiter als Gast" -#: participant/templates/participant/overview.html:27 +#: participant/templates/participant/overview.html:21 +msgid "All groups" +msgstr "Alle Gruppen" + +#: participant/templates/participant/overview.html:33 +msgid "List of participants" +msgstr "Teilnehmerliste" + +#: participant/templates/participant/overview.html:34 +msgid "First time passwords" +msgstr "Erst-Passwörter" + #: participant/templates/participant/overview.html:42 +msgid "Print list of participants as PDF" +msgstr "Teilnehmerliste als PDF drucken" + +#: participant/templates/participant/overview.html:45 +msgid "Print first time passwords as PDF" +msgstr "Erst-Passwörter als PDF drucken" + +#: participant/templates/participant/overview.html:59 +#: participant/templates/participant/overview.html:74 msgid "Not specified" msgstr "Nicht angegeben" -#: participant/templates/participant/overview.html:53 projector/models.py:63 +#: participant/templates/participant/overview.html:85 projector/models.py:65 msgid "Active" msgstr "Aktiv" -#: participant/templates/participant/overview.html:54 +#: participant/templates/participant/overview.html:86 msgid "Inactive" msgstr "Inaktiv" -#: participant/templates/participant/overview.html:60 +#: participant/templates/participant/overview.html:93 msgid "participant" msgid_plural "participants" msgstr[0] "Teilnehmer/in" msgstr[1] "Teilnehmer/innen" -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:95 msgid "of" msgstr "von" -#: participant/templates/participant/overview.html:73 -#: participant/templates/participant/user_detail.html:49 +#: participant/templates/participant/overview.html:107 +#: participant/templates/participant/user_detail.html:53 msgid "Last Login" msgstr "Letzer Login" -#: participant/templates/participant/overview.html:102 -msgid "Change status to inactive" -msgstr "Status ändern auf inaktiv" +#: participant/templates/participant/overview.html:143 +msgid "Change status (active/inactive)" +msgstr "Status ändern (aktiv/inaktiv)" -#: participant/templates/participant/overview.html:105 -msgid "Change status to active" -msgstr "Status ändern auf aktiv" - -#: participant/templates/participant/overview.html:115 -#: participant/templates/participant/user_widget.html:22 +#: participant/templates/participant/overview.html:153 +#: participant/templates/participant/user_widget.html:19 msgid "No participants available." msgstr "Keine Teilnehmer/innen vorhanden." #: participant/templates/participant/password_change.html:5 -#: participant/templates/participant/password_change.html:11 -#: participant/templates/participant/password_change.html:16 -#: participant/templates/participant/settings.html:11 +#: participant/templates/participant/password_change.html:8 msgid "Password Settings" msgstr "Passwort-Einstellungen" -#: participant/templates/participant/password_change.html:8 -#: participant/templates/participant/settings.html:8 templates/base.html:29 -msgid "User Settings" -msgstr "Benutzereinstellungen" - -#: participant/templates/participant/password_change.html:10 -#: participant/templates/participant/settings.html:5 -#: participant/templates/participant/settings.html:10 -#: participant/templates/participant/settings.html:16 -msgid "Personal Settings" -msgstr "Persönliche Einstellungen" - #: participant/templates/participant/personal_info_widget.html:5 msgid "I submitted the following motions:" msgstr "Ich habe folgende Anträge gestellt:" @@ -2394,11 +1923,16 @@ msgstr "Ich unterstütze folgende Anträge:" msgid "I am candidate for the following elections:" msgstr "Ich bin Kandidat/in bei folgenden Wahlen:" -#: participant/templates/participant/user_detail.html:19 +#: participant/templates/participant/settings.html:5 +#: participant/templates/participant/settings.html:8 templates/base.html:40 +msgid "Edit profile" +msgstr "Profil bearbeiten" + +#: participant/templates/participant/user_detail.html:23 msgid "The participant is not member of any group." msgstr "Teilnehmer/in ist kein Mitglied einer Gruppe." -#: participant/templates/participant/user_detail.html:53 +#: participant/templates/participant/user_detail.html:57 msgid "The participant has not logged in yet." msgstr "Teilnehmer/in hat sich noch nicht angemeldet." @@ -2414,15 +1948,15 @@ msgstr "Ungültige Stimmen" msgid "votes" msgstr "Stimmen" -#: projector/models.py:50 +#: projector/models.py:52 msgid "Can manage the projector" msgstr "Darf den Projektor steuern" -#: projector/models.py:51 +#: projector/models.py:53 msgid "Can see the projector" msgstr "Darf den Projektor sehen" -#: projector/models.py:52 +#: projector/models.py:54 msgid "Can see the dashboard" msgstr "Darf das Dashboard sehen" @@ -2430,89 +1964,76 @@ msgstr "Darf das Dashboard sehen" msgid "Errors in the form" msgstr "Fehler im Formular" -#: projector/views.py:375 projector/templates/projector/base_projector.html:7 -#: projector/templates/projector/base_projector.html:12 -#: projector/templates/projector/dashboard.html:17 +#: projector/views.py:373 projector/templates/projector/dashboard.html:18 msgid "Dashboard" msgstr "Dashboard" -#: projector/views.py:402 +#: projector/views.py:401 msgid "Projector live view" msgstr "Projektor-Live-Ansicht" -#: projector/views.py:428 +#: projector/views.py:427 msgid "Overlays" msgstr "Einblendungen" -#: projector/views.py:440 +#: projector/views.py:439 msgid "Custom Slides" msgstr "Benutzerdefinierte Folien" -#: projector/templates/projector/base_projector.html:15 -msgid "Overview" -msgstr "Übersicht" - -#: projector/templates/projector/base_projector.html:18 -#: projector/templates/projector/select_widgets.html:5 -#: projector/templates/projector/select_widgets.html:8 -msgid "Select widgets" -msgstr "Widgets auswählen" - -#: projector/templates/projector/base_projector.html:22 -msgid "Projector view" -msgstr "Projektor-Ansicht" - -#: projector/templates/projector/control_countdown.html:6 +#: projector/templates/projector/control_countdown.html:7 msgctxt "seconds" msgid "s" msgstr "s" -#: projector/templates/projector/control_countdown.html:7 -msgid "Save as default" -msgstr "Als Voreinstellung speichern" +#: projector/templates/projector/control_countdown.html:9 +msgid "Save time as default" +msgstr "Zeit als Voreinstellung speichern" -#: projector/templates/projector/control_countdown.html:10 -#: projector/templates/projector/control_countdown.html:11 +#: projector/templates/projector/control_countdown.html:12 msgid "Reset countdown" msgstr "Countdown zurücksetzen" -#: projector/templates/projector/control_countdown.html:13 +#: projector/templates/projector/control_countdown.html:15 msgid "Start countdown" msgstr "Countdown starten" -#: projector/templates/projector/control_countdown.html:16 +#: projector/templates/projector/control_countdown.html:18 msgid "Stop countdown" msgstr "Countdown stoppen" -#: projector/templates/projector/control_overlay_message.html:11 +#: projector/templates/projector/control_overlay_message.html:10 msgid "Clean message" msgstr "Message leeren" -#: projector/templates/projector/custom_slide_widget.html:14 +#: projector/templates/projector/custom_slide_widget.html:12 msgid "Welcome Page" msgstr "Willkommensseite" -#: projector/templates/projector/custom_slide_widget.html:41 -msgid "New slide" -msgstr "Neue Folie" +#: projector/templates/projector/dashboard.html:20 +msgid "Manage widgets" +msgstr "Widgets verwalten" -#: projector/templates/projector/live_view_widget.html:10 +#: projector/templates/projector/dashboard.html:20 +msgid "Widgets" +msgstr "Widgets" + +#: projector/templates/projector/live_view_widget.html:8 msgid "Zoom in" msgstr "Vergrößern" -#: projector/templates/projector/live_view_widget.html:13 +#: projector/templates/projector/live_view_widget.html:11 msgid "Zoom out" msgstr "Verkleinern" -#: projector/templates/projector/live_view_widget.html:18 +#: projector/templates/projector/live_view_widget.html:16 msgid "Scroll text up" msgstr "Text nach oben scrollen" -#: projector/templates/projector/live_view_widget.html:21 +#: projector/templates/projector/live_view_widget.html:19 msgid "Scroll text down" msgstr "Text nach unten scrollen" -#: projector/templates/projector/live_view_widget.html:26 +#: projector/templates/projector/live_view_widget.html:24 msgid "Reset projector view" msgstr "Projektor-Ansicht zurücksetzen" @@ -2521,7 +2042,20 @@ msgstr "Projektor-Ansicht zurücksetzen" msgid "Custom slide" msgstr "Benutzerdefinierte Folie" -#: projector/templates/projector/select_widgets.html:17 +#: projector/templates/projector/overlay_widget.html:22 +msgid "Countdown for speaking time" +msgstr "Countdown zur Redezeitbegrenzung" + +#: projector/templates/projector/overlay_widget.html:26 +msgid "Message" +msgstr "Mitteilung" + +#: projector/templates/projector/select_widgets.html:5 +#: projector/templates/projector/select_widgets.html:8 +msgid "Select widgets" +msgstr "Widgets auswählen" + +#: projector/templates/projector/select_widgets.html:23 msgid "No widgets available" msgstr "Keine Widgets vorhanden." @@ -2533,19 +2067,19 @@ msgstr "Seite nicht gefunden." msgid "Server Error" msgstr "Serverfehler" -#: templates/base.html:21 +#: templates/base.html:29 msgid "Home" msgstr "Startseite" -#: templates/base.html:27 +#: templates/base.html:41 +msgid "Change password" +msgstr "Passwort ändern" + +#: templates/base.html:43 msgid "Logout" msgstr "Abmelden" -#: templates/base.html:30 -msgid "Welcome" -msgstr "Willkommen" - -#: templates/base.html:79 +#: templates/base.html:100 msgid "" "Get professional " "support for OpenSlides." @@ -2563,7 +2097,7 @@ msgstr "Stand: %s" msgid "Page %s" msgstr "Seite %s" -#: utils/utils.py:59 utils/views.py:283 +#: utils/utils.py:59 utils/views.py:313 #, python-format msgid "Do you really want to delete %s?" msgstr "Soll %s wirklich gelöscht werden?" @@ -2572,33 +2106,412 @@ msgstr "Soll %s wirklich gelöscht werden?" msgid "Sorry, you have no rights to see this page." msgstr "Bedaure, Sie haben keine Berechtigung diese Seite zu sehen." -#: utils/views.py:102 +#: utils/views.py:144 msgid "Are you sure?" msgstr "Sind Sie sicher?" -#: utils/views.py:103 +#: utils/views.py:145 msgid "Thank you for your answer" msgstr "Danke für Ihre Antwort" -#: utils/views.py:240 +#: utils/views.py:285 #, python-format msgid "%s was successfully modified." msgstr "%s wurde erfolgreich bearbeitet." -#: utils/views.py:271 +#: utils/views.py:295 #, python-format msgid "%s was successfully created." msgstr "%s wurde erfolgreich angelegt." -#: utils/views.py:289 +#: utils/views.py:319 #, python-format msgid "%s was successfully deleted." msgstr "%s wurde erfolgreich gelöscht." -#: utils/views.py:304 +#: utils/views.py:329 msgid "undefined-filename" msgstr "undefinierter-dateiname" #: utils/jsonfield/fields.py:22 msgid "Enter valid JSON" msgstr "Gebe valides JSON ein" + +#~ msgid "Item %s was successfully modified." +#~ msgstr "Eintrag %s wurde erfolgreich bearbeitet." + +#~ msgid "Item %s was successfully created." +#~ msgstr "Eintrag %s wurde erfolgreich angelegt." + +#~ msgid "All items" +#~ msgstr "Alle Einträge" + +#~ msgid "Agenda as PDF" +#~ msgstr "Tagesordnung als PDF" + +#~ msgid "View item" +#~ msgstr "Eintrag anzeigen" + +#~ msgid "Show item" +#~ msgstr "Eintrag projizieren" + +#~ msgid "Activate item" +#~ msgstr "Eintrag projizieren" + +#~ msgid "Trivial change" +#~ msgstr "Triviale Änderung" + +#~ msgid "Import motions with status \"authorized\"" +#~ msgstr "Anträge als \"Zugelassen\" importieren" + +#~ msgid "Set the initial status for each motion to \"authorized\"" +#~ msgstr "Setzt den initialen Status für jeden Antrag auf \"zugelassen\"" + +#~ msgid "Allow trivial changes" +#~ msgstr "Triviale Änderungen erlauben" + +#~ msgid "Warning: Trivial changes undermine the motions autorisation system." +#~ msgstr "" +#~ "Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von " +#~ "Anträgen." + +#~ msgid "Version %d authorized" +#~ msgstr "Version %d zugelassen" + +#~ msgctxt "Rejected means not authorized" +#~ msgid "Version %d rejected" +#~ msgstr "Version %d verworfen" + +#~ msgid "Searching for supporters." +#~ msgstr "Auf Unterstützersuche." + +#~ msgid "Not yet authorized." +#~ msgstr "Noch nicht zugelassen." + +#~ msgid "Not yet authorized changes." +#~ msgstr "Noch nicht zugelassene Änderungen." + +#~ msgid "" +#~ "Trivial changes to version %(version)d; changed fields: %(changed_fields)s" +#~ msgstr "" +#~ "Triviale Änderung an Version %(version)d; Geänderte Felder: " +#~ "%(changed_fields)s" + +#~ msgid "Version %s created" +#~ msgstr "Version %s erstellt" + +#~ msgid "Supporters removed" +#~ msgstr "Unterstützer/innen gelöscht" + +#~ msgid "Status reseted to: %s" +#~ msgstr "Status zurückgesetzt auf: %s" + +#~ msgid "Number set: %s" +#~ msgstr "Nummer gesetzt: %s" + +#~ msgid "Version %s authorized" +#~ msgstr "Version %s zugelassen" + +#~ msgid "Version %s not authorized" +#~ msgstr "Version %s nicht zugelassen" + +#~ msgid "The motion status is already '%s.'" +#~ msgstr "Der Antragsstatus ist bereits '%s'." + +#~ msgid "" +#~ "The motion status is: '%(currentstatus)s'. You can not set the status to " +#~ "'%(newstatus)s'." +#~ msgstr "" +#~ "Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht " +#~ "auf '%(newstatus)s' setzen." + +#~ msgid "Status modified" +#~ msgstr "Status geändert" + +#~ msgid "by" +#~ msgstr "von" + +#~ msgid "You have not the necessary rights to create or edit motions." +#~ msgstr "" +#~ "Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " +#~ "bearbeiten." + +#~ msgid "You can not edit this motion." +#~ msgstr "Sie dürfen diesen Antrag nicht bearbeiten." + +#~ msgid "New motion was successfully created." +#~ msgstr "Neuer Antrag wurde erfolgreich angelegt." + +#~ msgid "Motion was successfully modified." +#~ msgstr "Antrag wurde erfolgreich geändert." + +#~ msgid "" +#~ "Attention: Do you really want to edit this motion? The supporters will " +#~ "not be removed automatically because you can manage motions. " +#~ "Please check if the supports are valid after your changing!" +#~ msgstr "" +#~ "Achtung: Wollen Sie den Antrag wirklich ändern? Die Unterstützer/innen " +#~ "werden nicht automatisch entfernt, da Sie Anträge verwalten " +#~ "dürfen. Prüfen Sie, ob die Unterstützungen noch gültig sind." + +#~ msgid "" +#~ "Attention: Do you really want to edit this motion? All %s " +#~ "supporters will be removed! Try to convince the supporters again." +#~ msgstr "" +#~ "Wollen Sie den Antrag wirklich ändern? Alle %s Unterstützer/innen " +#~ "werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." + +#~ msgid "Motion number was successfully set." +#~ msgstr "Antragsnummer wurde erfolgreich gesetzt." + +#~ msgid "Motion was successfully authorized." +#~ msgstr "Antrag wurde erfolgreich zugelassen." + +#~ msgid "Motion was successfully rejected." +#~ msgstr "Antrag wurde erfolgreich verworfen." + +#~ msgid "Motion status was reset." +#~ msgstr "Antragsstatus wurde zurückgesetzt." + +#~ msgid "Poll was successfully deleted." +#~ msgstr "Abstimmung wurde erfolgreich gelöscht." + +#~ msgid "the %s. poll" +#~ msgstr "die %s. Abstimmung" + +#~ msgid "You can not delete motion %s." +#~ msgstr "Sie können Antrag %s nicht löschen." + +#~ msgid "Motion %s was successfully deleted." +#~ msgstr "Antrag %s wurde erfolgreich gelöscht." + +#~ msgid "Invalid request" +#~ msgstr "Ungültige Anfrage" + +#~ msgid "Version %s accepted." +#~ msgstr "Version %s akzeptiert." + +#~ msgid "Do you really want to authorize version %s?" +#~ msgstr "Soll Version %s wirklich zugelassen werden?" + +#~ msgid "Version %s rejected." +#~ msgstr "Version %s zurückgewiesen." + +#~ msgid "ERROR by rejecting the version." +#~ msgstr "FEHLER beim Zurückweisen der Version." + +#~ msgid "Ignoring line %d because the assigned group may not act as a person." +#~ msgstr "" +#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete " +#~ "Gruppe nicht als Person auftreten darf." + +#~ msgid "Created by motion import." +#~ msgstr "Erstellt durch Antragsimport." + +#~ msgid "" +#~ "Ignoring line %d because it contains an incomplete first / last name pair." +#~ msgstr "" +#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert, da Vor- bzw. " +#~ "Nachname Leerstrings enthalten." + +#~ msgid "%d motion was successfully imported." +#~ msgid_plural "%d motions were successfully imported." +#~ msgstr[0] "%d Antrag wurde erfolgreich importiert." +#~ msgstr[1] "%d Anträge wurden erfolgreich importiert." + +#~ msgid "%d motion was successfully modified." +#~ msgid_plural "%d motions were successfully modified." +#~ msgstr[0] "%d Antrag wurde erfolgreich geändert." +#~ msgstr[1] "%d Anträge wurden erfolgreich geändert." + +#~ msgid "%d new user was added." +#~ msgid_plural "%d new users were added." +#~ msgstr[0] "%d neuer Nutzer wurde erstellt." +#~ msgstr[1] "%d neue Nutzer wurden erstellt." + +#~ msgid "%d new group was added." +#~ msgid_plural "%d new groups were added." +#~ msgstr[0] "%d neue Gruppe wurde erstellt." +#~ msgstr[1] "%d neue Gruppen wurden erstellt." + +#~ msgid "%d group assigned to motions." +#~ msgid_plural "%d groups assigned to motions." +#~ msgstr[0] "%d Gruppe wurde zugewiesen." +#~ msgstr[1] "%d Gruppen wurden zugewiesen." + +#~ msgid "" +#~ "Attention: Existing motions will be modified if you import new motions " +#~ "with the same number." +#~ msgstr "" +#~ "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " +#~ "identischer Nummer importieren." + +#~ msgid "" +#~ "Attention: Importing an motions without a number multiple times will " +#~ "create duplicates." +#~ msgstr "" +#~ "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " +#~ "entstehen." + +#~ msgid "Poll" +#~ msgstr "Abstimmung" + +#~ msgid "Motion No. %s" +#~ msgstr "Antrag Nr. %s" + +#~ msgid "%d. Vote" +#~ msgstr "%d. Abstimmung" + +#~ msgid "Edit motion" +#~ msgstr "Antrag bearbeiten" + +#~ msgid "New motion" +#~ msgstr "Neuer Antrag" + +#~ msgid "Import motions" +#~ msgstr "Anträge importieren" + +#~ msgid "Select a CSV file to import motions!" +#~ msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!" + +#~ msgid "number, title, text, reason, first_name, last_name, is_group" +#~ msgstr "Nummer, Titel, Text, Begründung, Vorname, Nachname, Gruppenantrag" + +#~ msgid "" +#~ "number, reason and is_group are " +#~ "optional and may be empty" +#~ msgstr "" +#~ "Nummer, Begründung und Gruppenantrag sind optional und können auch leer sein" + +#~ msgid "Print all motions as PDF" +#~ msgstr "Alle Anträge als PDF drucken" + +#~ msgid "Need supporters" +#~ msgstr "Benötigt Unterstützer/innen" + +#~ msgid "Without number" +#~ msgstr "Ohne Nummer" + +#~ msgid "Not yet authorized" +#~ msgstr "Noch nicht zugelassen" + +#~ msgid "Authorized" +#~ msgstr "Zugelassen" + +#~ msgid "Withdrawen (by submitter)" +#~ msgstr "Zurückgezogen (durch Antragsteller/in)" + +#~ msgctxt "number of motions" +#~ msgid "motion" +#~ msgid_plural "motions" +#~ msgstr[0] "Antrag" +#~ msgstr[1] "Anträge" + +#~ msgid "#" +#~ msgstr "#" + +#~ msgid "Motion title" +#~ msgstr "Antragstitel" + +#~ msgid "Number of supporters" +#~ msgstr "Anzahl der Unterstützer/innen" + +#~ msgid "Creation Time" +#~ msgstr "Erstellungszeit" + +#~ msgid "Print motion as PDF" +#~ msgstr "Antrag als PDF drucken" + +#~ msgid "Back to motion" +#~ msgstr "Zurück zum Antrag" + +#~ msgid "Show motion" +#~ msgstr "Antrag anzeigen" + +#~ msgid "Print this motion as PDF" +#~ msgstr "Diesen Antrag als PDF drucken" + +#~ msgid "Delete motion" +#~ msgstr "Antrag löschen" + +#~ msgid "This is not the newest version." +#~ msgstr "Dies ist nicht die neuste Version." + +#~ msgid "Go to version" +#~ msgstr "Gehe zu Version" + +#~ msgid "This is not the authorized version." +#~ msgstr "Dies ist nicht die zugelassene Version." + +#~ msgid "Version History" +#~ msgstr "Versionshistorie" + +#~ msgid "This version is authorized" +#~ msgstr "Diese Version wurde zugelassen" + +#~ msgid "Permit this version" +#~ msgstr "Diese Version zulassen" + +#~ msgid "Reject this version" +#~ msgstr "Diese Version verwerfen" + +#~ msgid "This version is rejected" +#~ msgstr "Diese Version wurde verworfen" + +#~ msgid "unchanged" +#~ msgstr "unverändert" + +#~ msgid "Show log" +#~ msgstr "Log anzeigen" + +#~ msgid "No results" +#~ msgstr "Keine Ergebnisse" + +#~ msgid "Withdraw motion" +#~ msgstr "Antrag zurückziehen" + +#~ msgid "Unsupport motion" +#~ msgstr "Antrag nicht unterstützen" + +#~ msgid "Support" +#~ msgstr "Unterstützen" + +#~ msgid "minimum required supporters" +#~ msgstr "minimal erforderliche Unterstützer/innen" + +#~ msgid "Manage motion" +#~ msgstr "Antrag verwalten" + +#~ msgid "Formal validation" +#~ msgstr "Formale Gültigkeitsprüfung" + +#~ msgid "Publish" +#~ msgstr "Veröffentlichen" + +#~ msgid "Permit" +#~ msgstr "Zulassen" + +#~ msgid "Not permit" +#~ msgstr "Nicht zulassen" + +#~ msgid "Set number" +#~ msgstr "Setze Nummer" + +#~ msgid "Result after vote" +#~ msgstr "Ergebnis nach der Abstimmung" + +#~ msgid "Withdrawed by Submitter" +#~ msgstr "Zurückgezogen durch Antragsteller/in" + +#~ msgid "For Administration only:" +#~ msgstr "Nur zur Administration:" + +#~ msgid "Reset" +#~ msgstr "Zurücksetzen" + +#~ msgid "My motions and elections" +#~ msgstr "Meine Anträge und Wahlen" + +#~ msgid "Countdown" +#~ msgstr "Countdown" diff --git a/openslides/locale/fr/LC_MESSAGES/django.mo b/openslides/locale/fr/LC_MESSAGES/django.mo index 22787ea37..11e7cf50f 100644 Binary files a/openslides/locale/fr/LC_MESSAGES/django.mo and b/openslides/locale/fr/LC_MESSAGES/django.mo differ diff --git a/openslides/locale/fr/LC_MESSAGES/django.po b/openslides/locale/fr/LC_MESSAGES/django.po index f3a54f26e..eb469e2e7 100644 --- a/openslides/locale/fr/LC_MESSAGES/django.po +++ b/openslides/locale/fr/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: OpenSlides\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 14:17+0100\n" +"POT-Creation-Date: 2013-02-05 23:06+0100\n" "PO-Revision-Date: 2012-12-09 12:20+0000\n" "Last-Translator: moosline \n" "Language-Team: French (http://www.transifex.com/projects/p/openslides/" @@ -37,20 +37,20 @@ msgid "Parent item" msgstr "Elément parent" #: agenda/models.py:34 config/forms.py:59 motion/forms.py:22 -#: motion/models.py:539 motion/templates/motion/view.html:246 +#: motion/models.py:539 motion/templates/motion/view.html:95 #: projector/models.py:29 msgid "Title" msgstr "Titre" #: agenda/models.py:35 motion/forms.py:23 motion/models.py:540 -#: motion/templates/motion/view.html:247 projector/models.py:30 +#: motion/templates/motion/view.html:96 projector/models.py:30 msgid "Text" msgstr "Texte" -#: agenda/models.py:36 agenda/templates/agenda/overview.html:65 -#: agenda/templates/agenda/view.html:13 participant/models.py:60 -#: participant/templates/participant/overview.html:72 -#: participant/templates/participant/user_detail.html:45 +#: agenda/models.py:36 agenda/templates/agenda/overview.html:76 +#: agenda/templates/agenda/view.html:37 participant/models.py:60 +#: participant/templates/participant/overview.html:106 +#: participant/templates/participant/user_detail.html:49 msgid "Comment" msgstr "Commentaire" @@ -58,7 +58,7 @@ msgstr "Commentaire" msgid "Closed" msgstr "Fermé" -#: agenda/models.py:38 agenda/templates/agenda/overview.html:71 +#: agenda/models.py:38 agenda/templates/agenda/overview.html:82 #: projector/models.py:31 msgid "Weight" msgstr "Pondération" @@ -72,11 +72,11 @@ msgid "Can manage agenda" msgstr "Peut gérer l'ordre du jour" #: agenda/models.py:180 agenda/slides.py:20 agenda/views.py:191 -#: agenda/views.py:192 agenda/views.py:212 agenda/views.py:226 -#: agenda/templates/agenda/base_agenda.html:10 +#: agenda/views.py:192 agenda/views.py:212 agenda/views.py:227 +#: agenda/templates/agenda/config.html:8 #: agenda/templates/agenda/overview.html:8 -#: agenda/templates/agenda/overview.html:52 -#: agenda/templates/agenda/overview.html:77 +#: agenda/templates/agenda/overview.html:55 +#: agenda/templates/agenda/overview.html:88 #: agenda/templates/projector/AgendaSummary.html:6 #: agenda/templates/projector/AgendaSummary.html:10 msgid "Agenda" @@ -114,215 +114,226 @@ msgstr "Elément %s et ses sous-éléments ont été créés avec succès." msgid "Item %s was successfully deleted." msgstr "Elément %s a été supprimé avec succès." -#: agenda/templates/agenda/base_agenda.html:12 -msgid "All items" -msgstr "Tous les éléments" - -#: agenda/templates/agenda/base_agenda.html:14 -#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:18 -msgid "New item" -msgstr "Nouvel élément" - -#: agenda/templates/agenda/base_agenda.html:16 -msgid "Agenda as PDF" -msgstr "Ordre du jour en PDF" - -#: agenda/templates/agenda/base_agenda.html:26 -msgid "View item" -msgstr "Afficher l'élément" - -#: agenda/templates/agenda/base_agenda.html:31 -#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:16 -#: agenda/templates/agenda/item_row.html:40 -msgid "Edit item" -msgstr "Modifier l'élément" - -#: agenda/templates/agenda/base_agenda.html:33 -#: agenda/templates/agenda/item_row.html:41 -msgid "Delete item" -msgstr "Supprimer l'élément" - -#: agenda/templates/agenda/base_agenda.html:38 -msgid "Show item" -msgstr "Afficher l'élément" - -#: agenda/templates/agenda/config.html:5 agenda/templates/agenda/config.html:8 +#: agenda/templates/agenda/config.html:5 msgid "Agenda settings" msgstr "Paramètres de l'ordre du jour" -#: agenda/templates/agenda/config.html:13 agenda/templates/agenda/edit.html:24 -#: assignment/templates/assignment/config.html:13 -#: assignment/templates/assignment/edit.html:26 -#: assignment/templates/assignment/poll_view.html:66 -#: config/templates/config/general.html:56 -#: motion/templates/motion/config.html:13 motion/templates/motion/edit.html:26 -#: motion/templates/motion/poll_view.html:52 -#: participant/templates/participant/config.html:13 -#: participant/templates/participant/edit.html:31 -#: participant/templates/participant/group_edit.html:25 -#: participant/templates/participant/password_change.html:22 -#: participant/templates/participant/settings.html:22 -#: projector/templates/projector/new.html:13 -#: projector/templates/projector/select_widgets.html:22 +#: agenda/templates/agenda/config.html:8 +#: assignment/templates/assignment/config.html:9 config/views.py:110 +#: config/templates/config/general.html:9 +#: motion/templates/motion/config.html:9 +#: participant/templates/participant/config.html:9 +msgid "Configuration" +msgstr "Configuration" + +#: agenda/templates/agenda/config.html:15 +#: assignment/templates/assignment/poll_view.html:80 +#: motion/templates/motion/poll_view.html:65 +#: projector/templates/projector/select_widgets.html:28 +#: templates/formbuttons_save.html:4 templates/formbuttons_saveapply.html:4 msgid "Save" msgstr "Enregistrer" -#: agenda/templates/agenda/config.html:17 agenda/templates/agenda/edit.html:31 -#: assignment/templates/assignment/config.html:17 -#: assignment/templates/assignment/edit.html:33 -#: assignment/templates/assignment/poll_view.html:73 -#: config/templates/config/general.html:60 -#: motion/templates/motion/config.html:17 motion/templates/motion/edit.html:33 -#: motion/templates/motion/import.html:30 -#: motion/templates/motion/poll_view.html:59 -#: participant/templates/participant/config.html:17 -#: participant/templates/participant/edit.html:38 -#: participant/templates/participant/group_edit.html:32 -#: participant/templates/participant/import.html:28 -#: participant/templates/participant/password_change.html:26 -#: participant/templates/participant/settings.html:26 -#: projector/templates/projector/new.html:20 +#: agenda/templates/agenda/config.html:19 agenda/templates/agenda/edit.html:30 +#: assignment/templates/assignment/config.html:18 +#: assignment/templates/assignment/edit.html:31 +#: assignment/templates/assignment/poll_view.html:86 +#: config/templates/config/general.html:70 +#: motion/templates/motion/config.html:18 motion/templates/motion/edit.html:42 +#: motion/templates/motion/import.html:44 +#: motion/templates/motion/poll_view.html:71 +#: participant/templates/participant/config.html:18 +#: participant/templates/participant/edit.html:36 +#: participant/templates/participant/group_edit.html:31 +#: participant/templates/participant/import.html:33 msgid "Cancel" msgstr "Annuler" -#: agenda/templates/agenda/edit.html:27 -#: assignment/templates/assignment/edit.html:29 -#: assignment/templates/assignment/poll_view.html:69 -#: assignment/templates/assignment/view.html:92 -#: motion/templates/motion/edit.html:29 -#: motion/templates/motion/poll_view.html:55 -#: participant/templates/participant/edit.html:34 -#: participant/templates/participant/group_edit.html:28 -#: projector/templates/projector/control_overlay_message.html:8 -#: projector/templates/projector/new.html:16 -msgid "Apply" -msgstr "Appliquer" +#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:17 +#: agenda/templates/agenda/view.html:20 +msgid "Edit item" +msgstr "Modifier l'élément" -#: agenda/templates/agenda/edit.html:35 -#: assignment/templates/assignment/edit.html:37 -#: motion/templates/motion/edit.html:37 motion/templates/motion/import.html:34 -#: participant/templates/participant/edit.html:42 -#: participant/templates/participant/group_edit.html:36 -#: participant/templates/participant/import.html:32 +#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:19 +#: agenda/templates/agenda/overview.html:58 +msgid "New item" +msgstr "Nouvel élément" + +#: agenda/templates/agenda/edit.html:22 agenda/templates/agenda/view.html:12 +#: assignment/templates/assignment/edit.html:22 +#: assignment/templates/assignment/view.html:20 +#: motion/templates/motion/edit.html:22 motion/templates/motion/import.html:10 +#: motion/templates/motion/view.html:30 +#: participant/templates/participant/edit.html:22 +#: participant/templates/participant/group_detail.html:12 +#: participant/templates/participant/group_edit.html:22 +#: participant/templates/participant/import.html:11 +#: participant/templates/participant/user_detail.html:12 +#: projector/templates/projector/new.html:11 +#: projector/templates/projector/select_widgets.html:10 +msgid "Back to overview" +msgstr "" + +#: agenda/templates/agenda/edit.html:33 +#: assignment/templates/assignment/config.html:21 +#: assignment/templates/assignment/edit.html:34 +#: config/templates/config/general.html:73 +#: motion/templates/motion/config.html:21 motion/templates/motion/edit.html:45 +#: motion/templates/motion/import.html:47 +#: participant/templates/participant/config.html:21 +#: participant/templates/participant/edit.html:39 +#: participant/templates/participant/group_edit.html:34 +#: participant/templates/participant/import.html:36 +#: projector/templates/projector/new.html:19 msgid "required" msgstr "requis" -#: agenda/templates/agenda/item_row.html:8 -msgid "Mark item as done" -msgstr "Marquez l'élément comme terminé" - -#: agenda/templates/agenda/item_row.html:12 -msgid "Item closed" -msgstr "Elément fermé" +#: agenda/templates/agenda/item_row.html:7 +#, fuzzy +msgid "Change status (open/closed)" +msgstr "Changer le statut sur inactif" #: agenda/templates/agenda/item_row.html:35 -#: agenda/templates/agenda/overview.html:86 -msgid "Activate item" -msgstr "Activez l'élément" +#: agenda/templates/agenda/overview.html:97 +#: agenda/templates/agenda/view.html:26 agenda/templates/agenda/widget.html:6 +#: agenda/templates/agenda/widget.html:19 +#: assignment/templates/assignment/overview.html:54 +#: assignment/templates/assignment/widget.html:7 +#: motion/templates/motion/overview.html:82 +#: motion/templates/motion/widget.html:7 +#: participant/templates/participant/group_overview.html:29 +#: participant/templates/participant/group_widget.html:8 +#: participant/templates/participant/overview.html:128 +#: participant/templates/participant/user_widget.html:7 +#: projector/templates/projector/custom_slide_widget.html:6 +#: projector/templates/projector/custom_slide_widget.html:19 +#, fuzzy +msgid "Show" +msgstr "Afficher l'élément" -#: agenda/templates/agenda/item_row.html:44 -#: agenda/templates/agenda/widget.html:35 -msgid "Activate summary for this item" +#: agenda/templates/agenda/item_row.html:40 +#: agenda/templates/agenda/widget.html:22 +#: assignment/templates/assignment/overview.html:59 +#: assignment/templates/assignment/view.html:172 +#: assignment/templates/assignment/widget.html:10 +#: motion/templates/motion/overview.html:87 +#: motion/templates/motion/widget.html:10 +#: participant/templates/participant/group_overview.html:33 +#: participant/templates/participant/group_widget.html:11 +#: participant/templates/participant/overview.html:132 +#: participant/templates/participant/user_widget.html:10 +#: projector/templates/projector/custom_slide_widget.html:26 +msgid "Edit" +msgstr "Modifier" + +#: agenda/templates/agenda/item_row.html:43 +#: assignment/templates/assignment/overview.html:62 +#: assignment/templates/assignment/view.html:173 +#: motion/templates/motion/overview.html:91 +#: participant/templates/participant/group_overview.html:37 +#: participant/templates/participant/overview.html:136 +#: projector/templates/projector/custom_slide_widget.html:23 +msgid "Delete" +msgstr "Supprimer" + +#: agenda/templates/agenda/item_row.html:47 +#: agenda/templates/agenda/widget.html:29 +#, fuzzy +msgid "Show summary for this item" msgstr "Activez le résumé pour cet élément" -#: agenda/templates/agenda/overview.html:45 +#: agenda/templates/agenda/overview.html:47 msgid "Do you want to save the changed order of agenda items?" msgstr "Voulez-vous enregistrer les modifications de l'ordre du jour?" -#: agenda/templates/agenda/overview.html:46 assignment/models.py:291 -#: assignment/views.py:587 assignment/templates/assignment/view.html:168 -#: assignment/templates/assignment/view.html:172 +#: agenda/templates/agenda/overview.html:49 assignment/models.py:291 +#: assignment/views.py:589 assignment/templates/assignment/view.html:206 +#: assignment/templates/assignment/view.html:210 #: assignment/templates/projector/Assignment.html:78 #: assignment/templates/projector/Assignment.html:82 motion/models.py:574 -#: motion/views.py:830 motion/views.py:881 -#: motion/templates/motion/view.html:79 -#: motion/templates/projector/Motion.html:37 utils/utils.py:49 -#: utils/views.py:108 +#: motion/views.py:824 motion/views.py:875 +#: motion/templates/motion/view.html:213 +#: motion/templates/projector/Motion.html:37 utils/utils.py:45 +#: utils/views.py:104 msgid "Yes" msgstr "Oui" -#: agenda/templates/agenda/overview.html:47 assignment/models.py:291 -#: assignment/views.py:588 assignment/templates/assignment/view.html:169 +#: agenda/templates/agenda/overview.html:50 assignment/models.py:291 +#: assignment/views.py:590 assignment/templates/assignment/view.html:207 #: assignment/templates/projector/Assignment.html:79 motion/models.py:574 -#: motion/views.py:830 motion/views.py:882 -#: motion/templates/motion/view.html:80 -#: motion/templates/projector/Motion.html:38 utils/utils.py:49 -#: utils/views.py:108 +#: motion/views.py:824 motion/views.py:876 +#: motion/templates/motion/view.html:214 +#: motion/templates/projector/Motion.html:38 utils/utils.py:45 +#: utils/views.py:104 msgid "No" msgstr "Non" -#: agenda/templates/agenda/overview.html:55 +#: agenda/templates/agenda/overview.html:58 #: assignment/templates/assignment/overview.html:12 -#: motion/templates/motion/overview.html:12 -#: participant/templates/participant/overview.html:22 -msgid "Filter" -msgstr "Filtre" +#: motion/templates/motion/overview.html:13 +#: participant/templates/participant/group_overview.html:11 +#: participant/templates/participant/overview.html:20 +#: projector/templates/projector/custom_slide_widget.html:39 +msgid "New" +msgstr "" -#: agenda/templates/agenda/overview.html:56 +#: agenda/templates/agenda/overview.html:60 +#, fuzzy +msgid "Print agenda as PDF" +msgstr "Ordre du jour en PDF" + +#: agenda/templates/agenda/overview.html:65 msgid "Hide closed items" msgstr "Cachez les élément terminés" -#: agenda/templates/agenda/overview.html:59 +#: agenda/templates/agenda/overview.html:69 msgid "item" msgid_plural "items" msgstr[0] "élément" msgstr[1] "éléments" -#: agenda/templates/agenda/overview.html:62 -msgid "Done" -msgstr "Terminé" - -#: agenda/templates/agenda/overview.html:63 +#: agenda/templates/agenda/overview.html:74 msgid "Item" msgstr "Elément" -#: agenda/templates/agenda/overview.html:68 -#: assignment/templates/assignment/overview.html:28 -#: motion/templates/motion/overview.html:43 -#: participant/templates/participant/group_overview.html:14 -#: participant/templates/participant/overview.html:74 +#: agenda/templates/agenda/overview.html:79 +#: assignment/templates/assignment/overview.html:38 +#: motion/templates/motion/overview.html:59 +#: participant/templates/participant/group_overview.html:19 +#: participant/templates/participant/overview.html:108 msgid "Actions" msgstr "Actions" -#: agenda/templates/agenda/overview.html:102 -#: agenda/templates/agenda/widget.html:46 -#: projector/templates/projector/custom_slide_widget.html:36 +#: agenda/templates/agenda/overview.html:113 +#: agenda/templates/agenda/widget.html:40 +#: projector/templates/projector/custom_slide_widget.html:34 msgid "No items available." msgstr "Pas d'éléments disponibles." -#: agenda/templates/agenda/widget.html:10 -#: agenda/templates/agenda/widget.html:29 -#: assignment/templates/assignment/widget.html:17 -#: motion/templates/motion/widget.html:17 -#: participant/templates/participant/group_widget.html:17 -#: participant/templates/participant/user_widget.html:16 -#: projector/templates/projector/custom_slide_widget.html:11 -#: projector/templates/projector/custom_slide_widget.html:30 +#: agenda/templates/agenda/view.html:15 +#: assignment/templates/assignment/view.html:29 +#: motion/templates/motion/view.html:40 motion/templates/motion/view.html:312 +#, fuzzy +msgid "More actions" +msgstr "Motions" + +#: agenda/templates/agenda/view.html:21 +msgid "Delete item" +msgstr "Supprimer l'élément" + +#: agenda/templates/agenda/widget.html:9 +#: agenda/templates/agenda/widget.html:25 +#: assignment/templates/assignment/widget.html:13 +#: motion/templates/motion/widget.html:13 +#: participant/templates/participant/group_widget.html:14 +#: participant/templates/participant/user_widget.html:13 +#: projector/templates/projector/custom_slide_widget.html:9 +#: projector/templates/projector/custom_slide_widget.html:29 msgid "Preview" msgstr "Aperçu" -#: agenda/templates/agenda/widget.html:23 -#: assignment/templates/assignment/view.html:132 -#: assignment/templates/assignment/widget.html:11 -#: motion/templates/motion/widget.html:11 -#: participant/templates/participant/group_widget.html:11 -#: participant/templates/participant/user_widget.html:10 -#: projector/templates/projector/custom_slide_widget.html:24 -msgid "Delete" -msgstr "Supprimer" - -#: agenda/templates/agenda/widget.html:26 -#: assignment/templates/assignment/view.html:131 -#: assignment/templates/assignment/widget.html:14 -#: motion/templates/motion/widget.html:14 -#: participant/templates/participant/group_widget.html:14 -#: participant/templates/participant/user_widget.html:13 -#: projector/templates/projector/custom_slide_widget.html:27 -msgid "Edit" -msgstr "Modifier" - -#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:381 -#: assignment/templates/assignment/view.html:13 +#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:383 +#: assignment/templates/assignment/view.html:275 #: assignment/templates/projector/Assignment.html:21 msgid "Number of available posts" msgstr "Nombre des postes disponibles" @@ -381,18 +392,18 @@ msgstr "Toujours une option par candidat" msgid "Always Yes-No-Abstain per candidate." msgstr "Toujours Oui-Non-Abstention par candidat." -#: assignment/models.py:44 assignment/templates/assignment/overview.html:15 -#: assignment/templates/assignment/view.html:23 +#: assignment/models.py:44 assignment/templates/assignment/overview.html:24 +#: assignment/templates/assignment/view.html:284 msgid "Searching for candidates" msgstr "Recherche de candidats" -#: assignment/models.py:45 assignment/templates/assignment/overview.html:16 -#: assignment/templates/assignment/view.html:25 +#: assignment/models.py:45 assignment/templates/assignment/overview.html:25 +#: assignment/templates/assignment/view.html:288 msgid "Voting" msgstr "Vote" -#: assignment/models.py:46 assignment/templates/assignment/overview.html:17 -#: assignment/templates/assignment/view.html:27 +#: assignment/models.py:46 assignment/templates/assignment/overview.html:26 +#: assignment/templates/assignment/view.html:292 msgid "Finished" msgstr "Terminé" @@ -400,7 +411,8 @@ msgstr "Terminé" msgid "Name" msgstr "Nom" -#: assignment/models.py:50 participant/models.py:144 +#: assignment/models.py:50 assignment/templates/assignment/view.html:57 +#: participant/models.py:144 msgid "Description" msgstr "Description" @@ -423,7 +435,7 @@ msgstr "Le statut d'assignation est déjà sur %s" msgid "%s is already a candidate." msgstr "%s est déja un candidat." -#: assignment/models.py:82 assignment/views.py:195 +#: assignment/models.py:82 assignment/views.py:196 msgid "The candidate list is already closed." msgstr "La liste des candidats est déjà fermée" @@ -457,7 +469,7 @@ msgstr "Peut gérer l'assignation" msgid "Abstain" msgstr "Abstention" -#: assignment/models.py:293 motion/templates/motion/poll_view.html:22 +#: assignment/models.py:293 motion/templates/motion/poll_view.html:38 msgid "Votes" msgstr "Votes" @@ -466,10 +478,9 @@ msgstr "Votes" msgid "Ballot %d" msgstr "Vote %d" -#: assignment/models.py:319 assignment/views.py:336 assignment/views.py:675 -#: assignment/views.py:690 -#: assignment/templates/assignment/base_assignment.html:14 -#: assignment/templates/assignment/overview.html:6 +#: assignment/models.py:319 assignment/views.py:338 assignment/views.py:677 +#: assignment/views.py:693 assignment/templates/assignment/config.html:10 +#: assignment/templates/assignment/overview.html:5 #: assignment/templates/assignment/overview.html:9 msgid "Elections" msgstr "Elections" @@ -487,27 +498,27 @@ msgstr "La nouvelle élection a été créée avec succès." msgid "Election was successfully modified." msgstr "L'élection a été modifiée avec succès." -#: assignment/views.py:130 motion/views.py:245 motion/views.py:689 -#: participant/views.py:508 participant/views.py:531 utils/views.py:222 -#: utils/views.py:240 utils/views.py:264 +#: assignment/views.py:130 motion/views.py:239 motion/views.py:683 +#: participant/views.py:504 participant/views.py:528 utils/views.py:218 +#: utils/views.py:236 utils/views.py:260 msgid "Please check the form for errors." msgstr "S'il vous plaît, vérifier si il a des erreurs dans le formulaire." -#: assignment/views.py:149 +#: assignment/views.py:150 #, python-format msgid "Election %s was successfully deleted." msgstr "L'election %s a été supprimée avec succès." -#: assignment/views.py:162 +#: assignment/views.py:163 #, python-format msgid "Election status was set to: %s." msgstr "Le statut de l'élection a été changé sur %s." -#: assignment/views.py:175 +#: assignment/views.py:176 msgid "You have set your candidature successfully." msgstr "Vous avez inséré votre candidature avec succès." -#: assignment/views.py:192 +#: assignment/views.py:193 msgid "" "You have withdrawn your candidature successfully. You can not be nominated " "by other participants anymore." @@ -515,101 +526,100 @@ msgstr "" "Vous avez retiré votre candidature avec succès. On ne peut plus vous " "nominer comme candidat" -#: assignment/views.py:213 +#: assignment/views.py:215 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Le candidat %s a été rejeté avec succès." -#: assignment/views.py:215 +#: assignment/views.py:217 #, python-format msgid "%s was unblocked successfully." msgstr "Le candidat %s a été nominé avec succès." -#: assignment/views.py:219 +#: assignment/views.py:221 #, python-format msgid "Do you really want to withdraw %s from the election?" msgstr "Voulez-vous vraiment exclure %s de cette élection?" -#: assignment/views.py:221 +#: assignment/views.py:223 #, python-format msgid "Do you really want to unblock %s for the election?" msgstr "" "Voulez-vous vraiment permettre %s de participer à nouveau à cette " "élection?" -#: assignment/views.py:236 +#: assignment/views.py:238 msgid "New ballot was successfully created." msgstr "Le nouveau vote a été créé avec succès" -#: assignment/views.py:268 +#: assignment/views.py:270 #, python-format msgid "Ballot ID %d does not exist." msgstr "L'identifiant %d de vote n'existe pas." -#: assignment/views.py:275 +#: assignment/views.py:277 msgid "Ballot successfully published." msgstr "Le vote a été publié avec succès." -#: assignment/views.py:277 +#: assignment/views.py:279 msgid "Ballot successfully unpublished." msgstr "Le vote a été retiré avec succès." -#: assignment/views.py:290 +#: assignment/views.py:292 msgid "not elected" msgstr "non élu" -#: assignment/views.py:293 assignment/views.py:482 -#: assignment/templates/assignment/view.html:48 +#: assignment/views.py:295 assignment/views.py:484 +#: assignment/templates/assignment/view.html:77 msgid "elected" msgstr "élu" -#: assignment/views.py:321 +#: assignment/views.py:323 msgid "Ballot was successfully deleted." msgstr "Le vote a été supprimé avec succès." -#: assignment/views.py:333 +#: assignment/views.py:335 msgid "Assignment" msgstr "Assignation" -#: assignment/views.py:356 assignment/templates/assignment/overview.html:59 -#: assignment/templates/assignment/widget.html:23 +#: assignment/views.py:358 assignment/templates/assignment/overview.html:74 +#: assignment/templates/assignment/widget.html:19 msgid "No assignments available." msgstr "Aucune assignation disponible." -#: assignment/views.py:375 +#: assignment/views.py:377 #, python-format msgid "Election: %s" msgstr "Election: %s" -#: assignment/views.py:388 assignment/views.py:424 -#: assignment/templates/assignment/overview.html:26 -#: assignment/templates/assignment/poll_view.html:18 -#: assignment/templates/assignment/view.html:37 -#: assignment/templates/assignment/view.html:120 +#: assignment/views.py:390 assignment/views.py:426 +#: assignment/templates/assignment/overview.html:36 +#: assignment/templates/assignment/poll_view.html:34 +#: assignment/templates/assignment/view.html:66 +#: assignment/templates/assignment/view.html:157 #: assignment/templates/projector/Assignment.html:38 #: assignment/templates/projector/Assignment.html:56 msgid "Candidates" msgstr "Candidats" -#: assignment/views.py:413 motion/views.py:823 -#: motion/templates/motion/view.html:44 +#: assignment/views.py:415 motion/views.py:817 +#: motion/templates/motion/view.html:187 msgid "Vote results" msgstr "Résultat du vote" -#: assignment/views.py:417 -#: assignment/templates/assignment/base_assignment.html:71 -#: assignment/templates/assignment/poll_view.html:5 -#: assignment/templates/assignment/poll_view.html:8 -#: assignment/templates/assignment/view.html:123 +#: assignment/views.py:419 assignment/templates/assignment/poll_view.html:5 +#: assignment/templates/assignment/poll_view.html:11 +#: assignment/templates/assignment/view.html:152 +#: assignment/templates/assignment/view.html:160 #: assignment/templates/projector/Assignment.html:59 msgid "ballot" msgstr "vote" -#: assignment/views.py:420 +#: assignment/views.py:422 msgid "ballots" msgstr "votes" -#: assignment/views.py:445 +#: assignment/views.py:447 #, python-format msgid "" "Y: %(YES)s\n" @@ -620,247 +630,258 @@ msgstr "" "N: %(NO)s\n" "A: %(ABSTAIN)s" -#: assignment/views.py:456 assignment/templates/assignment/poll_view.html:35 -#: assignment/templates/assignment/view.html:186 +#: assignment/views.py:458 assignment/templates/assignment/poll_view.html:51 +#: assignment/templates/assignment/view.html:224 #: assignment/templates/projector/Assignment.html:96 -#: motion/templates/motion/poll_view.html:31 +#: motion/templates/motion/poll_view.html:47 msgid "Invalid votes" msgstr "Votes invalides" -#: assignment/views.py:463 assignment/templates/assignment/poll_view.html:45 -#: assignment/templates/assignment/view.html:202 -#: assignment/templates/assignment/view.html:207 +#: assignment/views.py:465 assignment/templates/assignment/poll_view.html:61 +#: assignment/templates/assignment/view.html:240 +#: assignment/templates/assignment/view.html:245 #: assignment/templates/projector/Assignment.html:109 -#: assignment/templates/projector/Assignment.html:115 motion/views.py:830 -#: motion/templates/motion/poll_view.html:35 -#: motion/templates/motion/view.html:84 +#: assignment/templates/projector/Assignment.html:115 motion/views.py:824 +#: motion/templates/motion/poll_view.html:51 +#: motion/templates/motion/view.html:218 #: motion/templates/projector/Motion.html:42 poll/models.py:76 msgid "Votes cast" msgstr "Nombre de votants" -#: assignment/views.py:523 assignment/views.py:541 -#: assignment/templates/assignment/overview.html:25 +#: assignment/views.py:525 assignment/views.py:543 +#: assignment/templates/assignment/overview.html:35 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/view.html:6 #: assignment/templates/projector/Assignment.html:27 msgid "Election" msgstr "Election" -#: assignment/views.py:548 +#: assignment/views.py:550 #, python-format msgid "%d. ballot" msgstr "%d. vote" -#: assignment/views.py:550 +#: assignment/views.py:552 #, python-format msgid "%d candidate" msgid_plural "%d candidates" msgstr[0] "%d candidat" msgstr[1] "%d candidats" -#: assignment/views.py:552 +#: assignment/views.py:554 #, python-format msgid "%d available post" msgid_plural "%d available posts" msgstr[0] "%d poste disponible" msgstr[1] "%d postes disponibles" -#: assignment/views.py:588 assignment/templates/assignment/view.html:170 -#: assignment/templates/projector/Assignment.html:80 motion/views.py:830 -#: motion/views.py:883 motion/templates/motion/view.html:81 +#: assignment/views.py:590 assignment/templates/assignment/view.html:208 +#: assignment/templates/projector/Assignment.html:80 motion/views.py:824 +#: motion/views.py:877 motion/templates/motion/view.html:215 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Abstention" -#: assignment/views.py:668 +#: assignment/views.py:670 msgid "Election settings successfully saved." msgstr "Les paramètres de l'élection ont été enregistrés avec succès." -#: assignment/templates/assignment/base_assignment.html:16 -msgid "All elections" -msgstr "Toutes les élections" - -#: assignment/templates/assignment/base_assignment.html:18 -#: assignment/templates/assignment/edit.html:10 -#: assignment/templates/assignment/edit.html:19 -msgid "New election" -msgstr "Nouvelle élection" - -#: assignment/templates/assignment/base_assignment.html:20 -msgid "All elections as PDF" -msgstr "Toutes les élections en PDF" - -#: assignment/templates/assignment/base_assignment.html:31 -msgid "View election" -msgstr "Afficher l'élection" - -#: assignment/templates/assignment/base_assignment.html:39 -#: assignment/templates/assignment/edit.html:8 -#: assignment/templates/assignment/edit.html:17 -#: assignment/templates/assignment/overview.html:50 -msgid "Edit election" -msgstr "Modifier l'élection" - -#: assignment/templates/assignment/base_assignment.html:44 -#: assignment/templates/assignment/overview.html:51 -msgid "Delete election" -msgstr "Supprimer l'élection" - -#: assignment/templates/assignment/base_assignment.html:50 -#: assignment/templates/assignment/overview.html:53 -msgid "Election as PDF" -msgstr "L'élection en PDF" - -#: assignment/templates/assignment/base_assignment.html:56 -msgid "Show election" -msgstr "Projeter l'élection" - -#: assignment/templates/assignment/base_assignment.html:63 -#: motion/templates/motion/base_motion.html:61 -msgid "New agenda item" -msgstr "Nouveau point dans l'ordre du jour" - #: assignment/templates/assignment/config.html:5 -#: assignment/templates/assignment/config.html:8 msgid "Election settings" msgstr "Paramètres de l'élection" -#: assignment/templates/assignment/overview.html:14 -#: assignment/templates/assignment/overview.html:27 -#: assignment/templates/assignment/view.html:11 -#: assignment/templates/projector/Assignment.html:18 motion/views.py:801 -#: motion/templates/motion/overview.html:20 -#: motion/templates/motion/overview.html:40 -#: motion/templates/motion/view.html:34 +#: assignment/templates/assignment/edit.html:8 +#: assignment/templates/assignment/edit.html:17 +#: assignment/templates/assignment/view.html:34 +msgid "Edit election" +msgstr "Modifier l'élection" + +#: assignment/templates/assignment/edit.html:10 +#: assignment/templates/assignment/edit.html:19 +#: assignment/templates/assignment/overview.html:12 +msgid "New election" +msgstr "Nouvelle élection" + +#: assignment/templates/assignment/overview.html:15 +#, fuzzy +msgid "Print all elections as PDF" +msgstr "Toutes les élections en PDF" + +#: assignment/templates/assignment/overview.html:21 +#: participant/templates/participant/overview.html:53 +msgid "Filter" +msgstr "Filtre" + +#: assignment/templates/assignment/overview.html:23 +#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/view.html:272 +#: assignment/templates/projector/Assignment.html:18 motion/views.py:795 +#: motion/templates/motion/overview.html:35 +#: motion/templates/motion/overview.html:56 +#: motion/templates/motion/view.html:177 #: motion/templates/projector/Motion.html:11 -#: participant/templates/participant/overview.html:52 +#: participant/templates/participant/overview.html:84 msgid "Status" msgstr "Statut" -#: assignment/templates/assignment/overview.html:22 +#: assignment/templates/assignment/overview.html:31 msgid "election" msgid_plural "elections" msgstr[0] "élection" msgstr[1] "élections" -#: assignment/templates/assignment/overview.html:35 +#: assignment/templates/assignment/overview.html:44 #, python-format msgctxt "Number of searched candidates for an election" msgid "posts: %(posts)s" msgstr "postes: %(posts)s" -#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/overview.html:46 #, python-format msgid "candidates: %(candidates)s" msgstr "candidats: %(candidates)s" -#: assignment/templates/assignment/overview.html:39 +#: assignment/templates/assignment/overview.html:48 #, python-format msgid "elected: %(elected)s" msgstr "élus: %(elected)s" -#: assignment/templates/assignment/overview.html:45 -msgid "Activate election" -msgstr "Activer l'élection" +#: assignment/templates/assignment/overview.html:66 +#, fuzzy +msgid "Print election as PDF" +msgstr "Toutes les élections en PDF" -#: assignment/templates/assignment/poll_view.html:10 +#: assignment/templates/assignment/poll_view.html:14 +#, fuzzy +msgid "Back to election" +msgstr "Modifier l'élection" + +#: assignment/templates/assignment/poll_view.html:17 +#: assignment/templates/assignment/view.html:23 +msgid "Show election" +msgstr "Projeter l'élection" + +#: assignment/templates/assignment/poll_view.html:25 msgid "Short description (for ballot paper)" msgstr "Une courte déscription (pour le bulletin de vote)" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_view.html:30 msgid "Special values" msgstr "Valeurs spéciales" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:234 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_view.html:30 poll/models.py:234 msgid "majority" msgstr "majorité" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:236 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_view.html:30 poll/models.py:236 #: poll/models.py:238 msgid "undocumented" msgstr "non documenté" -#: assignment/templates/assignment/poll_view.html:59 -#: motion/templates/motion/poll_view.html:45 +#: assignment/templates/assignment/poll_view.html:74 +#: motion/templates/motion/poll_view.html:59 msgid "Ballot paper as PDF" msgstr "bulletin de vote en PDF" -#: assignment/templates/assignment/view.html:21 -msgid "Change status" -msgstr "Modifier le statut" +#: assignment/templates/assignment/poll_view.html:83 +#: assignment/templates/assignment/view.html:112 +#: motion/templates/motion/poll_view.html:68 +#: projector/templates/projector/control_overlay_message.html:7 +#: templates/formbuttons_saveapply.html:7 +msgid "Apply" +msgstr "Appliquer" -#: assignment/templates/assignment/view.html:44 -#: assignment/templates/assignment/view.html:106 +#: assignment/templates/assignment/view.html:36 +msgid "Delete election" +msgstr "Supprimer l'élection" + +#: assignment/templates/assignment/view.html:40 +#, fuzzy +msgid "Ballot" +msgstr "vote" + +#: assignment/templates/assignment/view.html:46 +#: motion/templates/motion/view.html:55 +msgid "New agenda item" +msgstr "Nouveau point dans l'ordre du jour" + +#: assignment/templates/assignment/view.html:73 +#: assignment/templates/assignment/view.html:132 msgid "Remove candidate" msgstr "Enlever le candidat" -#: assignment/templates/assignment/view.html:51 +#: assignment/templates/assignment/view.html:80 msgid "Mark candidate as not elected" msgstr "Marquer le candidat comme pas elu." -#: assignment/templates/assignment/view.html:57 +#: assignment/templates/assignment/view.html:88 #: assignment/templates/projector/Assignment.html:44 msgid "No candidates available." msgstr "Aucun candidat n'est disponible" -#: assignment/templates/assignment/view.html:69 +#: assignment/templates/assignment/view.html:98 msgid "Withdraw self candidature" msgstr "Retirer sa propre candidature" -#: assignment/templates/assignment/view.html:75 +#: assignment/templates/assignment/view.html:102 msgid "Self candidature" msgstr "Se proposer comme candidat" -#: assignment/templates/assignment/view.html:86 +#: assignment/templates/assignment/view.html:114 msgid "Add new participant" msgstr "Ajouter un nouveau participant" -#: assignment/templates/assignment/view.html:102 +#: assignment/templates/assignment/view.html:127 msgid "Blocked Candidates" msgstr "Candidats bloqués" -#: assignment/templates/assignment/view.html:109 +#: assignment/templates/assignment/view.html:137 msgid "No blocked candidates available." msgstr "Aucun candidat n'est disponible" -#: assignment/templates/assignment/view.html:115 +#: assignment/templates/assignment/view.html:145 #: assignment/templates/projector/Assignment.html:52 msgid "Election results" msgstr "Résultat des élections" -#: assignment/templates/assignment/view.html:128 +#: assignment/templates/assignment/view.html:165 msgid "Publish/unpublish results" msgstr "Publier/dépublier les résultats" -#: assignment/templates/assignment/view.html:140 -#: assignment/templates/assignment/view.html:223 +#: assignment/templates/assignment/view.html:180 +#: assignment/templates/assignment/view.html:261 msgid "New ballot" msgstr "Nouveau vote" -#: assignment/templates/assignment/view.html:155 +#: assignment/templates/assignment/view.html:193 #: assignment/templates/projector/Assignment.html:69 msgid "Candidate is elected" msgstr "Le candidat est élu" -#: assignment/templates/assignment/view.html:174 +#: assignment/templates/assignment/view.html:212 #: assignment/templates/projector/Assignment.html:84 msgid "was not a
    candidate" msgstr "n'était pas un
    candidat" -#: assignment/templates/assignment/view.html:191 -#: assignment/templates/projector/Assignment.html:100 motion/views.py:830 -#: motion/templates/motion/view.html:82 +#: assignment/templates/assignment/view.html:229 +#: assignment/templates/projector/Assignment.html:100 motion/views.py:824 +#: motion/templates/motion/view.html:216 #: motion/templates/projector/Motion.html:40 msgid "Invalid" msgstr "Invalide" -#: assignment/templates/assignment/view.html:219 -msgid "No results available." +#: assignment/templates/assignment/view.html:257 +#, fuzzy +msgid "No ballots available." msgstr "Aucun resultat n'est disponible" +#: assignment/templates/assignment/view.html:281 +msgid "Change status" +msgstr "Modifier le statut" + #: config/forms.py:22 msgid "Event name" msgstr "Nom de l'événement" @@ -885,7 +906,7 @@ msgstr "Organisateur de l'événement" msgid "Allow access for anonymous guest users" msgstr "Permettre l'accès anomyme" -#: config/forms.py:65 participant/forms.py:123 +#: config/forms.py:65 participant/forms.py:126 msgid "Welcome text" msgstr "Texte de bienvenue" @@ -905,14 +926,14 @@ msgstr "Bienvenue sur OpenSlides!" msgid "[Place for your welcome text.]" msgstr "[Insérer votre texte ici.]" -#: config/models.py:102 +#: config/models.py:102 config/templates/config/general.html:10 msgid "General" msgstr "Général" #: config/models.py:126 config/templates/config/version.html:5 #: config/templates/config/version.html:8 -#: config/templates/config/version.html:11 motion/views.py:815 -#: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244 +#: config/templates/config/version.html:13 motion/views.py:809 +#: motion/templates/motion/view.html:26 motion/templates/motion/view.html:93 msgid "Version" msgstr "Version" @@ -920,29 +941,24 @@ msgstr "Version" msgid "General settings successfully saved." msgstr "Les paramètres généraux ont été enregistrés avec succès." -#: config/views.py:110 config/templates/config/base_config.html:7 -msgid "Configuration" -msgstr "Configuration" - #: config/templates/config/general.html:5 -#: config/templates/config/general.html:8 msgid "General settings" msgstr "Paramètres généraux" -#: config/templates/config/general.html:11 +#: config/templates/config/general.html:15 msgid "Event" msgstr "Evénement" -#: config/templates/config/general.html:26 +#: config/templates/config/general.html:33 msgid "Welcome Widget" msgstr "Widget de bienvenue" -#: config/templates/config/general.html:41 +#: config/templates/config/general.html:51 msgid "System" msgstr "Système" -#: motion/forms.py:25 motion/models.py:541 motion/views.py:849 -#: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249 +#: motion/forms.py:25 motion/models.py:541 motion/views.py:843 +#: motion/templates/motion/view.html:80 motion/templates/motion/view.html:97 #: motion/templates/projector/Motion.html:77 msgid "Reason" msgstr "Motivation" @@ -955,18 +971,19 @@ msgstr "Changement trivial" msgid "Trivial changes don't create a new version." msgstr "Des changement triviaux ne créent pas une nouvelle version." -#: motion/forms.py:35 motion/models.py:63 motion/views.py:768 -#: motion/templates/motion/overview.html:41 -#: motion/templates/motion/view.html:18 +#: motion/forms.py:35 motion/models.py:63 motion/views.py:762 +#: motion/templates/motion/overview.html:57 +#: motion/templates/motion/view.html:161 #: motion/templates/projector/Motion.html:55 msgid "Submitter" msgstr "Requérant" -#: motion/forms.py:44 motion/views.py:788 motion/templates/motion/view.html:22 +#: motion/forms.py:44 motion/views.py:782 +#: motion/templates/motion/view.html:165 msgid "Supporters" msgstr "Partisants" -#: motion/forms.py:50 participant/forms.py:111 +#: motion/forms.py:50 participant/forms.py:114 msgid "CSV File" msgstr "Fichier CSV" @@ -1016,13 +1033,13 @@ msgstr "Publié" msgid "Permitted" msgstr "Permis" -#: motion/models.py:44 motion/templates/motion/overview.html:24 -#: motion/templates/motion/view.html:167 +#: motion/models.py:44 motion/templates/motion/overview.html:40 +#: motion/templates/motion/view.html:298 msgid "Accepted" msgstr "Accepté" -#: motion/models.py:45 motion/templates/motion/overview.html:25 -#: motion/templates/motion/view.html:172 +#: motion/models.py:45 motion/templates/motion/overview.html:41 +#: motion/templates/motion/view.html:303 msgid "Rejected" msgstr "Rejeté" @@ -1030,15 +1047,15 @@ msgstr "Rejeté" msgid "Withdrawed" msgstr "Retiré" -#: motion/models.py:47 motion/templates/motion/view.html:180 +#: motion/models.py:47 motion/templates/motion/view.html:317 msgid "Adjourned" msgstr "Ajourné" -#: motion/models.py:48 motion/templates/motion/view.html:183 +#: motion/models.py:48 motion/templates/motion/view.html:320 msgid "Not Concerned" msgstr "Non concerné" -#: motion/models.py:49 motion/templates/motion/view.html:186 +#: motion/models.py:49 motion/templates/motion/view.html:323 msgid "Commited a bill" msgstr "Transféré à (une commission)" @@ -1046,7 +1063,7 @@ msgstr "Transféré à (une commission)" msgid "Rejected (not authorized)" msgstr "Rejeté (non autorisé)" -#: motion/models.py:51 motion/templates/motion/overview.html:27 +#: motion/models.py:51 motion/templates/motion/overview.html:43 msgid "Needs Review" msgstr "Doit être revu" @@ -1142,15 +1159,15 @@ msgstr "Statut modifié" msgid "by" msgstr "par" -#: motion/models.py:453 motion/templates/motion/view.html:210 -#: motion/templates/motion/widget.html:27 +#: motion/models.py:453 motion/templates/motion/view.html:12 +#: motion/templates/motion/view.html:24 motion/templates/motion/widget.html:23 #: motion/templates/projector/Motion.html:65 #: participant/templates/participant/personal_info_widget.html:13 #: participant/templates/participant/personal_info_widget.html:32 msgid "no number" msgstr "pas de nombre" -#: motion/models.py:454 motion/templates/motion/widget.html:23 +#: motion/models.py:454 motion/templates/motion/widget.html:19 #: participant/templates/participant/personal_info_widget.html:9 #: participant/templates/participant/personal_info_widget.html:28 msgid "motion" @@ -1180,30 +1197,30 @@ msgstr "Peut gérer les motions" msgid "The assembly may decide," msgstr "Je demande a l'Assemblée de décider sur " -#: motion/models.py:603 motion/views.py:718 motion/views.py:943 -#: motion/views.py:954 motion/templates/motion/base_motion.html:9 -#: motion/templates/motion/overview.html:7 +#: motion/models.py:603 motion/views.py:712 motion/views.py:937 +#: motion/views.py:949 motion/templates/motion/config.html:10 +#: motion/templates/motion/overview.html:6 #: motion/templates/motion/overview.html:10 msgid "Motions" msgstr "Motions" -#: motion/views.py:173 +#: motion/views.py:167 msgid "You have not the necessary rights to create or edit motions." msgstr "Vous n'avez pas l'autorisation de créer ou modifier des motions." -#: motion/views.py:178 +#: motion/views.py:172 msgid "You can not edit this motion." msgstr "Vous ne pouvez pas modifier cette motion." -#: motion/views.py:236 +#: motion/views.py:230 msgid "New motion was successfully created." msgstr "La nouvelle motion a été créée avec succès." -#: motion/views.py:238 +#: motion/views.py:232 msgid "Motion was successfully modified." msgstr "La motion a été modifiée avec succès." -#: motion/views.py:252 +#: motion/views.py:246 msgid "" "Attention: Do you really want to edit this motion? The supporters will " "not be removed automatically because you can manage motions. Please " @@ -1214,7 +1231,7 @@ msgstr "" "gérer les motions. S'il vous plait vérifiez si les partisans sont valables " "après votre modification!" -#: motion/views.py:254 +#: motion/views.py:248 #, python-format msgid "" "Attention: Do you really want to edit this motion? All %s supporters " @@ -1223,182 +1240,182 @@ msgstr "" "Attention: Voulez-vous vraiment modifier cette motion? Tout les %s " "partisans seront supprimés! Essayez de convaincre les partisans à nouveau." -#: motion/views.py:286 +#: motion/views.py:280 msgid "Motion number was successfully set." msgstr "Le numéro de la motion a été mis avec succès." -#: motion/views.py:302 +#: motion/views.py:296 msgid "Motion was successfully authorized." msgstr "La motion a été autorisée avec succès." -#: motion/views.py:317 +#: motion/views.py:311 msgid "Motion was successfully rejected." msgstr "La motion a été rejetée avec succès. " -#: motion/views.py:333 +#: motion/views.py:327 #, python-format msgid "Motion status was set to: %s." msgstr "Le statut de la motion a été changé sur: %s" -#: motion/views.py:349 +#: motion/views.py:343 msgid "Motion status was reset." msgstr "Le statut de la motion a été remis à zéro." -#: motion/views.py:376 +#: motion/views.py:370 msgid "You can not support this motion." msgstr "Vous ne pouvez pas soutenir cette motion. " -#: motion/views.py:379 +#: motion/views.py:373 msgid "You can not unsupport this motion." msgstr "Vous ne pouvez pas retirer votre soutien pour cette motion. " -#: motion/views.py:390 +#: motion/views.py:384 msgid "Do you really want to support this motion?" msgstr "Voulez-vous vraiment soutenir cette motion?" -#: motion/views.py:392 +#: motion/views.py:386 msgid "Do you really want to unsupport this motion?" msgstr "Voulez-vous vraiment retirer votre soutien pour cette motion?" -#: motion/views.py:403 +#: motion/views.py:397 msgid "You have supported this motion successfully." msgstr "" "Vous soutenez maintenant cette motion, vous avez été ajouté avec succès." -#: motion/views.py:405 +#: motion/views.py:399 msgid "You have unsupported this motion successfully." msgstr "Vous avez retiré votre soutien pour cette motion avec succès. " -#: motion/views.py:419 +#: motion/views.py:413 msgid "New vote was successfully created." msgstr "Le nouveau vote a été créé avec succès." -#: motion/views.py:435 +#: motion/views.py:429 msgid "Poll deleted" msgstr "Sondage supprimé" -#: motion/views.py:436 +#: motion/views.py:430 msgid "Poll was successfully deleted." msgstr "Le sondage a été supprimé avec succès." -#: motion/views.py:438 +#: motion/views.py:432 #, python-format msgid "the %s. poll" msgstr "le %s. sondage" -#: motion/views.py:479 motion/views.py:488 +#: motion/views.py:473 motion/views.py:482 #, python-format msgid "You can not delete motion %s." msgstr "Vous ne pouvez pas supprimer la motion %s." -#: motion/views.py:484 motion/views.py:492 +#: motion/views.py:478 motion/views.py:486 #, python-format msgid "Motion %s was successfully deleted." msgstr "La motion %s a été supprimée avec succès." -#: motion/views.py:494 +#: motion/views.py:488 msgid "Invalid request" msgstr "Demande invalide" -#: motion/views.py:518 +#: motion/views.py:512 msgid "Poll was updated" msgstr "Le sondage a été actualisé" -#: motion/views.py:535 +#: motion/views.py:529 #, python-format msgid "Version %s accepted." msgstr "Version %s acceptée." -#: motion/views.py:537 +#: motion/views.py:531 #, python-format msgid "Do you really want to authorize version %s?" msgstr "Voulez-vous vraiment autoriser cette version %s" -#: motion/views.py:547 +#: motion/views.py:541 #, python-format msgid "Version %s rejected." msgstr "Version %s rejetée." -#: motion/views.py:549 +#: motion/views.py:543 msgid "ERROR by rejecting the version." msgstr "ERREUR en rejetant la version." -#: motion/views.py:551 +#: motion/views.py:545 #, python-format msgid "Do you really want to reject version %s?" msgstr "Voulez vous vraiment rejeter la version %s?" -#: motion/views.py:587 motion/views.py:591 motion/views.py:597 -#: motion/views.py:600 participant/api.py:81 +#: motion/views.py:581 motion/views.py:585 motion/views.py:591 +#: motion/views.py:594 participant/api.py:78 #, python-format msgid "Ignoring malformed line %d in import file." msgstr "La ligne %d mal formée dans le fichier d'entrée a été ignorée" -#: motion/views.py:608 +#: motion/views.py:602 #, python-format msgid "Ignoring line %d because the assigned group may not act as a person." msgstr "" "La ligne %d a été ignorée car le group assigné ne peut agir en tant que " "personne." -#: motion/views.py:617 +#: motion/views.py:611 msgid "Created by motion import." msgstr "Motion a été créé par l'import" -#: motion/views.py:631 +#: motion/views.py:625 #, python-format msgid "" "Ignoring line %d because it contains an incomplete first / last name pair." msgstr "La ligne %d a été ignorée car le nom ou prénom sont incomplets" -#: motion/views.py:669 +#: motion/views.py:663 #, python-format msgid "%d motion was successfully imported." msgid_plural "%d motions were successfully imported." msgstr[0] "%d la motion a été importée avec succès." msgstr[1] "%d les motions ont été importées avec succès." -#: motion/views.py:672 +#: motion/views.py:666 #, python-format msgid "%d motion was successfully modified." msgid_plural "%d motions were successfully modified." msgstr[0] "%d la motion a été modifiée avec succès." msgstr[1] "%d les motions ont été modifiées avec succès." -#: motion/views.py:675 +#: motion/views.py:669 #, python-format msgid "%d new user was added." msgid_plural "%d new users were added." msgstr[0] "%d nouvel utilisateur a été créé." msgstr[1] "%d nouveaux utilisateurs ont été créés." -#: motion/views.py:678 +#: motion/views.py:672 #, python-format msgid "%d new group was added." msgid_plural "%d new groups were added." msgstr[0] "%d le nouveau groupe a été ajouter" msgstr[1] "%d nouveaux groupes ont été ajouter" -#: motion/views.py:681 +#: motion/views.py:675 #, python-format msgid "%d group assigned to motions." msgid_plural "%d groups assigned to motions." msgstr[0] "%d groupe a été assigné aux motions." msgstr[1] "%d groupes ont été assignés aux motions." -#: motion/views.py:685 participant/api.py:97 +#: motion/views.py:679 participant/api.py:94 msgid "Import aborted because of severe errors in the input file." msgstr "" "l'importation a été interrompue en raison d'erreurs graves dans le fichier " "d'entrée" -#: motion/views.py:687 participant/api.py:99 +#: motion/views.py:681 participant/api.py:96 msgid "Import file has wrong character encoding, only UTF-8 is supported!" msgstr "" "Le fichier d'entrée a un mauvais encodage des caractères, seul UTF-8 est " "pris en charge!" -#: motion/views.py:691 +#: motion/views.py:685 msgid "" "Attention: Existing motions will be modified if you import new motions with " "the same number." @@ -1406,7 +1423,7 @@ msgstr "" "Attention: Les motions existantes seront modifiées si vous importez de " "nouvelles motions avec le même numéro." -#: motion/views.py:692 +#: motion/views.py:686 msgid "" "Attention: Importing an motions without a number multiple times will create " "duplicates." @@ -1414,116 +1431,86 @@ msgstr "" "Attention: L'importation d'une motion sans numéro à plusieurs reprises " "créera des doublons." -#: motion/views.py:725 motion/views.py:863 -#: motion/templates/motion/poll_view.html:7 -#: motion/templates/motion/poll_view.html:12 -#: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206 -#: motion/templates/motion/view.html:225 +#: motion/views.py:719 motion/views.py:857 +#: motion/templates/motion/poll_view.html:6 +#: motion/templates/motion/poll_view.html:14 +#: motion/templates/motion/view.html:8 motion/templates/motion/view.html:22 #: motion/templates/projector/Motion.html:7 #: motion/templates/projector/Motion.html:65 msgid "Motion" msgstr "Motion" -#: motion/views.py:739 motion/templates/motion/overview.html:84 +#: motion/views.py:733 motion/templates/motion/overview.html:105 msgid "No motions available." msgstr "Aucune motion disponible." -#: motion/views.py:744 motion/views.py:746 motion/views.py:761 -#: motion/views.py:763 motion/templates/motion/base_motion.html:24 -#: motion/templates/projector/Motion.html:63 +#: motion/views.py:738 motion/views.py:740 motion/views.py:755 +#: motion/views.py:757 motion/templates/projector/Motion.html:63 msgid "Motion No." msgstr "Motion No." -#: motion/views.py:778 +#: motion/views.py:772 msgid "Signature" msgstr "Signature" -#: motion/views.py:829 motion/templates/motion/base_motion.html:55 -#: motion/templates/motion/poll_view.html:8 -#: motion/templates/motion/poll_view.html:13 -#: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 +#: motion/views.py:823 motion/templates/motion/poll_view.html:6 +#: motion/templates/motion/poll_view.html:14 +#: motion/templates/motion/view.html:205 #: motion/templates/projector/Motion.html:33 msgid "Vote" msgstr "Vote" -#: motion/views.py:863 +#: motion/views.py:857 msgid "Poll" msgstr "Sondage" -#: motion/views.py:877 +#: motion/views.py:871 #, python-format msgid "Motion No. %s" msgstr "Motion No %s" -#: motion/views.py:879 +#: motion/views.py:873 #, python-format msgid "%d. Vote" msgstr "%d. Vote" -#: motion/views.py:936 +#: motion/views.py:930 msgid "Motion settings successfully saved." msgstr "Les paramètres des motions ont été enregistrés avec succès" -#: motion/templates/motion/base_motion.html:11 -msgid "All motions" -msgstr "Toutes les motions" - -#: motion/templates/motion/base_motion.html:13 -#: motion/templates/motion/edit.html:10 motion/templates/motion/edit.html:18 -msgid "New motion" -msgstr "Nouvelle motion" - -#: motion/templates/motion/base_motion.html:16 -#: motion/templates/motion/import.html:5 motion/templates/motion/import.html:8 -msgid "Import motions" -msgstr "Importer des motions" - -#: motion/templates/motion/base_motion.html:18 -msgid "All motions as PDF" -msgstr "Toutes les motions dans un PDF" - -#: motion/templates/motion/base_motion.html:34 -msgid "View motion" -msgstr "Afficher la motion" - -#: motion/templates/motion/base_motion.html:38 -#: motion/templates/motion/edit.html:8 motion/templates/motion/edit.html:16 -#: motion/templates/motion/overview.html:72 -msgid "Edit motion" -msgstr "Modifier la motion" - -#: motion/templates/motion/base_motion.html:42 -#: motion/templates/motion/overview.html:74 -msgid "Delete motion" -msgstr "Supprimer la motion" - -#: motion/templates/motion/base_motion.html:45 -#: motion/templates/motion/overview.html:77 -msgid "Motion as PDF" -msgstr "Motion dans un PDF" - -#: motion/templates/motion/base_motion.html:49 -msgid "Show Motion" -msgstr "Lancer l'animation" - -#: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8 +#: motion/templates/motion/config.html:5 msgid "Motion settings" msgstr "Paramètres de l'animation" -#: motion/templates/motion/import.html:9 +#: motion/templates/motion/edit.html:8 motion/templates/motion/edit.html:17 +#: motion/templates/motion/view.html:46 +msgid "Edit motion" +msgstr "Modifier la motion" + +#: motion/templates/motion/edit.html:10 motion/templates/motion/edit.html:19 +#: motion/templates/motion/overview.html:13 +msgid "New motion" +msgstr "Nouvelle motion" + +#: motion/templates/motion/import.html:5 motion/templates/motion/import.html:8 +#: motion/templates/motion/overview.html:16 +msgid "Import motions" +msgstr "Importer des motions" + +#: motion/templates/motion/import.html:14 msgid "Select a CSV file to import motions!" msgstr "Sélectionnez un fichier CSV pour importer les motions!" -#: motion/templates/motion/import.html:11 -#: participant/templates/participant/import.html:11 +#: motion/templates/motion/import.html:15 +#: participant/templates/participant/import.html:17 msgid "Required comma separated values" msgstr "Valeurs séparées par des virgules (CSV) nécessaires" -#: motion/templates/motion/import.html:12 +#: motion/templates/motion/import.html:16 msgid "number, title, text, reason, first_name, last_name, is_group" msgstr "numéro, titre, texte, motivation, prénom, nom, groupe" -#: motion/templates/motion/import.html:14 +#: motion/templates/motion/import.html:18 msgid "" "number, reason and is_group are " "optional and may be empty" @@ -1531,195 +1518,234 @@ msgstr "" "numero, motivation et est_groupe sont " "optional et peuvent être laisser vide" -#: motion/templates/motion/import.html:16 -#: participant/templates/participant/import.html:14 +#: motion/templates/motion/import.html:20 +#: participant/templates/participant/import.html:20 msgid "Required CSV file encoding: UTF-8 (Unicode)." msgstr "Le fichier CSV requiert un encodage de caractères UTF-8 (Unicode)" -#: motion/templates/motion/import.html:19 -#: participant/templates/participant/import.html:17 +#: motion/templates/motion/import.html:23 +#: participant/templates/participant/import.html:23 msgid "A CSV example file is available in OpenSlides Wiki." msgstr "Un exemple de fichier CSV est disponible sur le Wiki de Openslides. " -#: motion/templates/motion/import.html:26 -#: participant/templates/participant/import.html:24 +#: motion/templates/motion/import.html:41 +#: motion/templates/motion/overview.html:16 +#: participant/templates/participant/import.html:30 +#: participant/templates/participant/overview.html:22 msgid "Import" msgstr "Importation" -#: motion/templates/motion/overview.html:15 +#: motion/templates/motion/overview.html:18 +#, fuzzy +msgid "Print all motions as PDF" +msgstr "Toutes les motions dans un PDF" + +#: motion/templates/motion/overview.html:26 msgid "Need supporters" msgstr "A besoin de partisans" -#: motion/templates/motion/overview.html:18 +#: motion/templates/motion/overview.html:31 msgid "Without number" msgstr "Sans numéro" -#: motion/templates/motion/overview.html:22 +#: motion/templates/motion/overview.html:38 msgid "Not yet authorized" msgstr "N'est pas encore autorisé" -#: motion/templates/motion/overview.html:23 +#: motion/templates/motion/overview.html:39 msgid "Authorized" msgstr "Autorisé" -#: motion/templates/motion/overview.html:26 +#: motion/templates/motion/overview.html:42 msgid "Withdrawen (by submitter)" msgstr "retiré (par le requérant)" -#: motion/templates/motion/overview.html:32 +#: motion/templates/motion/overview.html:47 msgctxt "number of motions" msgid "motion" msgid_plural "motions" msgstr[0] "motion" msgstr[1] "motions" -#: motion/templates/motion/overview.html:35 -msgid "Number" -msgstr "Numéro" +#: motion/templates/motion/overview.html:51 +msgid "#" +msgstr "" -#: motion/templates/motion/overview.html:36 +#: motion/templates/motion/overview.html:52 msgid "Motion title" msgstr "Titre de la motion" -#: motion/templates/motion/overview.html:38 +#: motion/templates/motion/overview.html:54 msgid "Number of supporters" msgstr "Nombre de partisans" -#: motion/templates/motion/overview.html:42 -#: motion/templates/motion/view.html:109 +#: motion/templates/motion/overview.html:58 +#: motion/templates/motion/view.html:241 msgid "Creation Time" msgstr "Temps de création" -#: motion/templates/motion/overview.html:67 -msgid "Activate motion" -msgstr "Activer la motion" +#: motion/templates/motion/overview.html:96 +#, fuzzy +msgid "Print motion as PDF" +msgstr "Toutes les motions dans un PDF" + +#: motion/templates/motion/poll_view.html:18 +#, fuzzy +msgid "Back to motion" +msgstr "Modifier la motion" #: motion/templates/motion/poll_view.html:21 +#: motion/templates/motion/view.html:34 +#, fuzzy +msgid "Show motion" +msgstr "Lancer l'animation" + +#: motion/templates/motion/poll_view.html:37 msgid "Option" msgstr "Option" -#: motion/templates/motion/view.html:51 motion/templates/motion/view.html:91 -msgid "New vote" -msgstr "Nouveau vote" +#: motion/templates/motion/view.html:31 +#, fuzzy +msgid "Print this motion as PDF" +msgstr "Toutes les motions dans un PDF" -#: motion/templates/motion/view.html:67 -msgid "Edit Vote" -msgstr "Modifier le vote" +#: motion/templates/motion/view.html:50 +msgid "Delete motion" +msgstr "Supprimer la motion" -#: motion/templates/motion/view.html:70 -msgid "Delete Vote" -msgstr "Supprimer le vote" - -#: motion/templates/motion/view.html:99 -msgid "Enter result" -msgstr "Insérer le résultat" - -#: motion/templates/motion/view.html:116 -msgid "Withdraw" -msgstr "Retirer" - -#: motion/templates/motion/view.html:124 -msgid "Unsupport" -msgstr "Ne plus soutenir" - -#: motion/templates/motion/view.html:130 -msgid "Support" -msgstr "Soutenir" - -#: motion/templates/motion/view.html:136 -msgid "minimum required supporters" -msgstr "Nombres minimum de partisans requis" - -#: motion/templates/motion/view.html:143 -msgid "Manage motion" -msgstr "Gérer la motion" - -#: motion/templates/motion/view.html:146 -msgid "Formal validation" -msgstr "Validation formelle" - -#: motion/templates/motion/view.html:148 -msgid "Publish" -msgstr "Publier" - -#: motion/templates/motion/view.html:151 -msgid "Permit" -msgstr "Permettre" - -#: motion/templates/motion/view.html:154 -msgid "Not permit (reject)" -msgstr "Non autorisé (rejeter)" - -#: motion/templates/motion/view.html:157 -msgid "Set number" -msgstr "Insérer un numéro" - -#: motion/templates/motion/view.html:164 -msgid "Result after vote" -msgstr "Résultat après le vote" - -#: motion/templates/motion/view.html:178 -msgid "Result after debate" -msgstr "Résultat après la discussion" - -#: motion/templates/motion/view.html:189 -msgid "Withdrawed by submitter" -msgstr "Retiré par le requérant" - -#: motion/templates/motion/view.html:194 -msgid "For Administration only:" -msgstr "Seulement pour les administrateurs" - -#: motion/templates/motion/view.html:196 -msgid "Reset" -msgstr "Réinitialiser" - -#: motion/templates/motion/view.html:219 +#: motion/templates/motion/view.html:69 msgid "This is not the newest version." msgstr "Ce n'est pas la version la plus récente" -#: motion/templates/motion/view.html:219 motion/templates/motion/view.html:221 +#: motion/templates/motion/view.html:69 motion/templates/motion/view.html:71 msgid "Go to version" msgstr "Aller à la version" -#: motion/templates/motion/view.html:221 +#: motion/templates/motion/view.html:71 msgid "This is not the authorized version." msgstr "Ce n'est pas la version autorisée" -#: motion/templates/motion/view.html:239 +#: motion/templates/motion/view.html:76 +#, fuzzy +msgid "Motion text" +msgstr "Titre de la motion" + +#: motion/templates/motion/view.html:89 msgid "Version History" msgstr "Historique des versions" -#: motion/templates/motion/view.html:245 +#: motion/templates/motion/view.html:94 msgid "Time" msgstr "Temps" -#: motion/templates/motion/view.html:256 -msgid "Version authorized" -msgstr "Version autorisée" +#: motion/templates/motion/view.html:104 +#, fuzzy +msgid "This version is authorized" +msgstr "Version %s autorisée" -#: motion/templates/motion/view.html:259 -msgid "Permit Version" +#: motion/templates/motion/view.html:107 +#, fuzzy +msgid "Permit this version" msgstr "Permettre la version" -#: motion/templates/motion/view.html:262 -msgid "Reject Version" +#: motion/templates/motion/view.html:110 +#, fuzzy +msgid "Reject this version" msgstr "Rejeter la version " -#: motion/templates/motion/view.html:266 -msgid "Version rejected" +#: motion/templates/motion/view.html:114 +#, fuzzy +msgid "This version is rejected" msgstr "Version rejetée" -#: motion/templates/motion/view.html:276 motion/templates/motion/view.html:283 -#: motion/templates/motion/view.html:290 +#: motion/templates/motion/view.html:124 motion/templates/motion/view.html:131 +#: motion/templates/motion/view.html:138 msgid "unchanged" msgstr "non modifié" -#: motion/templates/motion/view.html:299 -msgid "Log" -msgstr "Log" +#: motion/templates/motion/view.html:148 +#, fuzzy +msgid "Show log" +msgstr "Projeter l'élection" -#: motion/templates/motion/widget.html:31 +#: motion/templates/motion/view.html:193 motion/templates/motion/view.html:225 +msgid "New vote" +msgstr "Nouveau vote" + +#: motion/templates/motion/view.html:207 +msgid "Edit Vote" +msgstr "Modifier le vote" + +#: motion/templates/motion/view.html:208 +msgid "Delete Vote" +msgstr "Supprimer le vote" + +#: motion/templates/motion/view.html:232 +#, fuzzy +msgid "No results" +msgstr "Résultat du vote" + +#: motion/templates/motion/view.html:247 +#, fuzzy +msgid "Withdraw motion" +msgstr "Retirer" + +#: motion/templates/motion/view.html:255 +#, fuzzy +msgid "Unsupport motion" +msgstr "Peut soutenir les motions" + +#: motion/templates/motion/view.html:261 +msgid "Support" +msgstr "Soutenir" + +#: motion/templates/motion/view.html:268 +msgid "minimum required supporters" +msgstr "Nombres minimum de partisans requis" + +#: motion/templates/motion/view.html:275 +msgid "Manage motion" +msgstr "Gérer la motion" + +#: motion/templates/motion/view.html:278 +msgid "Formal validation" +msgstr "Validation formelle" + +#: motion/templates/motion/view.html:280 +msgid "Publish" +msgstr "Publier" + +#: motion/templates/motion/view.html:283 +msgid "Permit" +msgstr "Permettre" + +#: motion/templates/motion/view.html:286 +#, fuzzy +msgid "Not permit" +msgstr "Non autorisé (rejeter)" + +#: motion/templates/motion/view.html:289 +msgid "Set number" +msgstr "Insérer un numéro" + +#: motion/templates/motion/view.html:294 +msgid "Result after vote" +msgstr "Résultat après le vote" + +#: motion/templates/motion/view.html:326 +#, fuzzy +msgid "Withdrawed by Submitter" +msgstr "Retiré par le requérant" + +#: motion/templates/motion/view.html:333 +msgid "For Administration only:" +msgstr "Seulement pour les administrateurs" + +#: motion/templates/motion/view.html:335 +msgid "Reset" +msgstr "Réinitialiser" + +#: motion/templates/motion/widget.html:27 msgid "No motion available." msgstr "Aucune motion disponible" @@ -1735,77 +1761,78 @@ msgstr "Aucun résultat de sondage disponible" msgid "Participant" msgstr "Participant" -#: participant/forms.py:27 participant/views.py:607 -#: participant/templates/participant/group_overview.html:7 -#: participant/templates/participant/group_overview.html:10 -#: participant/templates/participant/user_detail.html:14 +#: participant/forms.py:28 participant/views.py:605 +#: participant/templates/participant/group_overview.html:6 +#: participant/templates/participant/group_overview.html:9 +#: participant/templates/participant/overview.html:21 +#: participant/templates/participant/user_detail.html:18 msgid "Groups" msgstr "Groupe" -#: participant/forms.py:52 +#: participant/forms.py:53 msgid "Permissions" msgstr "Permissions" -#: participant/forms.py:55 participant/views.py:546 participant/views.py:593 -#: participant/templates/participant/base_participant.html:12 +#: participant/forms.py:56 participant/views.py:543 participant/views.py:591 +#: participant/templates/participant/config.html:10 #: participant/templates/participant/overview.html:7 -#: participant/templates/participant/overview.html:18 -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:16 +#: participant/templates/participant/overview.html:95 msgid "Participants" msgstr "Participants" -#: participant/forms.py:92 +#: participant/forms.py:93 msgid "You can not edit the name for this group." msgstr "Vous ne pouvez pas modifier le nom de ce groupe." -#: participant/forms.py:96 +#: participant/forms.py:97 #, python-format msgid "Group name \"%s\" is reserved for internal use." msgstr "Ce nom de groupe \"%s\" est réservé pour une utilisation interne." -#: participant/forms.py:118 +#: participant/forms.py:121 msgid "System URL" msgstr "URL du système" -#: participant/forms.py:119 participant/forms.py:124 +#: participant/forms.py:122 participant/forms.py:127 msgid "Printed in PDF of first time passwords only." msgstr "" "Imprimé dans le PDF avec la liste des premiers mots de passe seulement." -#: participant/forms.py:127 +#: participant/forms.py:130 msgid "Sort participants by first name" msgstr "Classer les participants par prénom" -#: participant/forms.py:128 +#: participant/forms.py:131 msgid "Disable for sorting by last name" msgstr "Désactiver le classement par nom" -#: participant/models.py:33 participant/templates/participant/overview.html:25 +#: participant/models.py:33 participant/templates/participant/overview.html:57 msgid "Male" msgstr "Masculin" -#: participant/models.py:34 participant/templates/participant/overview.html:26 +#: participant/models.py:34 participant/templates/participant/overview.html:58 msgid "Female" msgstr "Féminin" -#: participant/models.py:37 participant/templates/participant/overview.html:38 +#: participant/models.py:37 participant/templates/participant/overview.html:70 msgid "Delegate" msgstr "Délégué" -#: participant/models.py:38 participant/templates/participant/overview.html:39 +#: participant/models.py:38 participant/templates/participant/overview.html:71 msgid "Observer" msgstr "Observateur" -#: participant/models.py:39 participant/templates/participant/overview.html:40 +#: participant/models.py:39 participant/templates/participant/overview.html:72 msgid "Staff" msgstr "Personnel" -#: participant/models.py:40 participant/templates/participant/overview.html:41 +#: participant/models.py:40 participant/templates/participant/overview.html:73 msgid "Guest" msgstr "Invité" -#: participant/models.py:45 participant/templates/participant/overview.html:30 -#: participant/templates/participant/overview.html:68 +#: participant/models.py:45 participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:102 msgid "Structure level" msgstr "Niveau de structure" @@ -1813,8 +1840,8 @@ msgstr "Niveau de structure" msgid "Will be shown after the name." msgstr "Apparait après le nom." -#: participant/models.py:49 participant/templates/participant/overview.html:24 -#: participant/templates/participant/user_detail.html:24 +#: participant/models.py:49 participant/templates/participant/overview.html:56 +#: participant/templates/participant/user_detail.html:28 msgid "Gender" msgstr "Sexe" @@ -1826,15 +1853,15 @@ msgstr "Seulement pour filtrer la liste des utilisateurs." msgid "Typ" msgstr "Type" -#: participant/models.py:54 participant/views.py:255 -#: participant/templates/participant/overview.html:45 -#: participant/templates/participant/overview.html:70 -#: participant/templates/participant/user_detail.html:34 +#: participant/models.py:54 participant/views.py:248 +#: participant/templates/participant/overview.html:77 +#: participant/templates/participant/overview.html:104 +#: participant/templates/participant/user_detail.html:38 msgid "Committee" msgstr "Comité" #: participant/models.py:57 -#: participant/templates/participant/user_detail.html:39 +#: participant/templates/participant/user_detail.html:43 msgid "About me" msgstr "A propos de moi" @@ -1870,98 +1897,100 @@ msgstr "Par exemple, comme initiant d'une motion." msgid "Welcome to OpenSlides!" msgstr "Bienvenue sur OpenSlides!" -#: participant/views.py:207 +#: participant/views.py:200 msgid "You can not delete yourself." msgstr "Vous ne pouvez pas vous suprimer vous même." -#: participant/views.py:228 +#: participant/views.py:221 msgid "You can not deactivate yourself." msgstr "Vous ne pouvez pas vous désactiver vous-même" -#: participant/views.py:231 +#: participant/views.py:224 msgid "You can not deactivate the administrator." msgstr "Vous ne pouvez pas désactiver l'administrateur." -#: participant/views.py:250 +#: participant/views.py:243 msgid "Participant-list" msgstr "Liste des participants" -#: participant/views.py:251 +#: participant/views.py:244 msgid "List of Participants" msgstr "La liste des participants" -#: participant/views.py:254 participant/templates/participant/overview.html:67 +#: participant/views.py:247 +#: participant/templates/participant/overview.html:101 msgid "Last Name" msgstr "Nom" -#: participant/views.py:254 participant/templates/participant/overview.html:66 +#: participant/views.py:247 +#: participant/templates/participant/overview.html:100 msgid "First Name" msgstr "Prénom" -#: participant/views.py:254 -#: participant/templates/participant/group_overview.html:13 +#: participant/views.py:247 +#: participant/templates/participant/group_overview.html:18 msgid "Group" msgstr "Groupe" -#: participant/views.py:254 participant/templates/participant/overview.html:37 -#: participant/templates/participant/overview.html:69 -#: participant/templates/participant/user_detail.html:29 +#: participant/views.py:247 participant/templates/participant/overview.html:69 +#: participant/templates/participant/overview.html:103 +#: participant/templates/participant/user_detail.html:33 msgid "Type" msgstr "Type" -#: participant/views.py:286 +#: participant/views.py:279 msgid "Participant-passwords" msgstr "Mot de passe du participant" -#: participant/views.py:308 +#: participant/views.py:301 msgid "Account for OpenSlides" msgstr "Compte pour OpenSlides" -#: participant/views.py:310 +#: participant/views.py:303 #, python-format msgid "for %s" msgstr "pour %s" -#: participant/views.py:313 +#: participant/views.py:306 #, python-format msgid "User: %s" msgstr "Utilisateur: %s" -#: participant/views.py:317 +#: participant/views.py:310 #, python-format msgid "Password: %s" msgstr "Mot de passe: %s" -#: participant/views.py:322 +#: participant/views.py:315 #, python-format msgid "URL: %s" msgstr "URL: %s" -#: participant/views.py:364 +#: participant/views.py:357 #, python-format msgid "%d new participants were successfully imported." msgstr "%d nouveaux participants ont été importés avec succès. " -#: participant/views.py:375 +#: participant/views.py:368 msgid "Do you really want to reset the password?" msgstr "Voulez-vous vraiment reinitialser le mot de passe?" -#: participant/views.py:388 +#: participant/views.py:381 #, python-format msgid "The Password for %s was successfully reset." msgstr "Le mot de passe de %s a été initialisé avec succès" -#: participant/views.py:445 +#: participant/views.py:438 msgid "You can not delete this Group." msgstr "Vous ne pouvez pas suprimer se groupe." -#: participant/views.py:473 +#: participant/views.py:466 msgid "Participants settings successfully saved." msgstr "" "Les modifications des paramètres des participants ont été appliquées avec " "succès" -#: participant/views.py:483 +#: participant/views.py:476 #, python-format msgid "" "Installation was successfully! Use %(user)s (password: %(password)s) for " @@ -1975,197 +2004,172 @@ msgstr "" "ce message apparaîtra toujours pour tout le monde et pourrait représenter un " "risque de sécurité." -#: participant/views.py:506 +#: participant/views.py:502 msgid "User settings successfully saved." msgstr "Les paramètres d'utilisateurs ont été enregistrés avec succès." -#: participant/views.py:528 +#: participant/views.py:525 msgid "Password successfully changed." msgstr "Le mot de passe a été changé avec succès." -#: participant/views.py:579 +#: participant/views.py:577 msgid "My motions and elections" msgstr "Mes motions et élections" -#: participant/templates/participant/base_participant.html:15 -msgid "All participants" -msgstr "Tout les participants" - -#: participant/templates/participant/base_participant.html:18 -#: participant/templates/participant/edit.html:10 -#: participant/templates/participant/edit.html:19 -msgid "New participant" -msgstr "Nouveau participant" - -#: participant/templates/participant/base_participant.html:19 -msgid "All groups" -msgstr "Tout les groupes" - -#: participant/templates/participant/base_participant.html:20 -#: participant/templates/participant/group_edit.html:10 -#: participant/templates/participant/group_edit.html:18 -msgid "New group" -msgstr "Nouveau groupe" - -#: participant/templates/participant/base_participant.html:21 -#: participant/templates/participant/import.html:5 -#: participant/templates/participant/import.html:8 -msgid "Import participants" -msgstr "Importer des participants" - -#: participant/templates/participant/base_participant.html:24 -msgid "List of participants as PDF" -msgstr "La liste des participants en PDF" - -#: participant/templates/participant/base_participant.html:27 -msgid "First time passwords as PDF" -msgstr "La liste des premiers mots de passe en PDF" - -#: participant/templates/participant/base_participant.html:38 -msgid "View participant" -msgstr "Afficher participant" - -#: participant/templates/participant/base_participant.html:45 -#: participant/templates/participant/edit.html:8 -#: participant/templates/participant/edit.html:17 -#: participant/templates/participant/overview.html:94 -msgid "Edit participant" -msgstr "Modifier le participant" - -#: participant/templates/participant/base_participant.html:50 -#: participant/templates/participant/overview.html:98 -msgid "Delete participant" -msgstr "Supprimer le participant" - -#: participant/templates/participant/base_participant.html:60 -msgid "View group" -msgstr "Afficher le groupe" - -#: participant/templates/participant/base_participant.html:65 -#: participant/templates/participant/group_edit.html:8 -#: participant/templates/participant/group_edit.html:16 -#: participant/templates/participant/group_overview.html:19 -msgid "Edit group" -msgstr "Modifier le groupe" - -#: participant/templates/participant/base_participant.html:71 -#: participant/templates/participant/group_overview.html:21 -msgid "Delete group" -msgstr "Supprimer le groupe" - #: participant/templates/participant/config.html:5 -#: participant/templates/participant/config.html:8 msgid "Participant settings" msgstr "Paramètres du participant" -#: participant/templates/participant/edit.html:26 +#: participant/templates/participant/edit.html:8 +#: participant/templates/participant/edit.html:17 +msgid "Edit participant" +msgstr "Modifier le participant" + +#: participant/templates/participant/edit.html:10 +#: participant/templates/participant/edit.html:19 +#: participant/templates/participant/overview.html:20 +msgid "New participant" +msgstr "Nouveau participant" + +#: participant/templates/participant/edit.html:30 msgid "Reset to First Password" msgstr "Initialiser au premier mot de passe" -#: participant/templates/participant/group_detail.html:14 +#: participant/templates/participant/group_detail.html:18 msgid "Members" msgstr "Membres" -#: participant/templates/participant/group_detail.html:19 +#: participant/templates/participant/group_detail.html:24 msgid "No members available." msgstr "Aucun membre n'est disponible" -#: participant/templates/participant/group_overview.html:27 -#: participant/templates/participant/group_widget.html:24 +#: participant/templates/participant/group_edit.html:8 +#: participant/templates/participant/group_edit.html:17 +msgid "Edit group" +msgstr "Modifier le groupe" + +#: participant/templates/participant/group_edit.html:10 +#: participant/templates/participant/group_edit.html:19 +#: participant/templates/participant/group_overview.html:11 +msgid "New group" +msgstr "Nouveau groupe" + +#: participant/templates/participant/group_overview.html:12 +#, fuzzy +msgid "Back to participants overview" +msgstr "Aucun participant disponible" + +#: participant/templates/participant/group_widget.html:21 msgid "No groups available." msgstr "Aucun groupe n'est disponible" +#: participant/templates/participant/import.html:5 #: participant/templates/participant/import.html:9 +#: participant/templates/participant/overview.html:22 +msgid "Import participants" +msgstr "Importer des participants" + +#: participant/templates/participant/import.html:15 msgid "Select a CSV file to import participants!" msgstr "Selectionnez un fichier CSV pour importer des participants" -#: participant/templates/participant/import.html:12 +#: participant/templates/participant/import.html:18 msgid "" "first_name, last_name, gender, structure level, type, committee, comment" msgstr "prénom, nom, sexe, position, type, comité, commentaire" -#: participant/templates/participant/login.html:8 -#: participant/templates/participant/login.html:16 -#: participant/templates/participant/login.html:58 templates/base.html:32 -msgid "Login" -msgstr "Connexion" - -#: participant/templates/participant/login.html:21 -#: participant/templates/participant/login.html:34 templates/base.html:57 -#: templates/base.html.py:64 -msgid "Close this notification" -msgstr "Fermez cette notification" - -#: participant/templates/participant/login.html:27 +#: participant/templates/participant/login.html:19 msgid "Your username and password were not accepted. Please try again." msgstr "" "Votre nom d'utilisateur et votre mot de passe n'ont pas été acceptés. " "Veuillez essayer à nouveau." -#: participant/templates/participant/login.html:62 +#: participant/templates/participant/login.html:38 +msgid "Username" +msgstr "" + +#: participant/templates/participant/login.html:42 +#, fuzzy +msgid "Password" +msgstr "Mot de passe: %s" + +#: participant/templates/participant/login.html:47 +#: participant/templates/participant/overview.html:37 templates/base.html:46 +msgid "Login" +msgstr "Connexion" + +#: participant/templates/participant/login.html:51 msgid "Continue as guest" msgstr "Continuer en tant qu'invité" -#: participant/templates/participant/overview.html:27 +#: participant/templates/participant/overview.html:21 +#, fuzzy +msgid "All groups" +msgstr "Tout les groupes" + +#: participant/templates/participant/overview.html:33 +#, fuzzy +msgid "List of participants" +msgstr "La liste des participants" + +#: participant/templates/participant/overview.html:34 +#, fuzzy +msgid "First time passwords" +msgstr "La liste des premiers mots de passe en PDF" + #: participant/templates/participant/overview.html:42 +#, fuzzy +msgid "Print list of participants as PDF" +msgstr "La liste des participants en PDF" + +#: participant/templates/participant/overview.html:45 +#, fuzzy +msgid "Print first time passwords as PDF" +msgstr "La liste des premiers mots de passe en PDF" + +#: participant/templates/participant/overview.html:59 +#: participant/templates/participant/overview.html:74 msgid "Not specified" msgstr "Non spécifié" -#: participant/templates/participant/overview.html:53 projector/models.py:63 +#: participant/templates/participant/overview.html:85 projector/models.py:63 msgid "Active" msgstr "Actif" -#: participant/templates/participant/overview.html:54 +#: participant/templates/participant/overview.html:86 msgid "Inactive" msgstr "Inactif" -#: participant/templates/participant/overview.html:60 +#: participant/templates/participant/overview.html:93 msgid "participant" msgid_plural "participants" msgstr[0] "participant" msgstr[1] "participants" -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:95 msgid "of" msgstr "de" -#: participant/templates/participant/overview.html:73 -#: participant/templates/participant/user_detail.html:49 +#: participant/templates/participant/overview.html:107 +#: participant/templates/participant/user_detail.html:53 msgid "Last Login" msgstr "Dernière connexion" -#: participant/templates/participant/overview.html:102 -msgid "Change status to inactive" +#: participant/templates/participant/overview.html:143 +#, fuzzy +msgid "Change status (active/inactive)" msgstr "Changer le statut sur inactif" -#: participant/templates/participant/overview.html:105 -msgid "Change status to active" -msgstr "Changer le statut sur actif" - -#: participant/templates/participant/overview.html:115 -#: participant/templates/participant/user_widget.html:22 +#: participant/templates/participant/overview.html:153 +#: participant/templates/participant/user_widget.html:19 msgid "No participants available." msgstr "Aucun participant disponible" #: participant/templates/participant/password_change.html:5 -#: participant/templates/participant/password_change.html:11 -#: participant/templates/participant/password_change.html:16 -#: participant/templates/participant/settings.html:11 +#: participant/templates/participant/password_change.html:8 msgid "Password Settings" msgstr "Paramètres du mot de passe" -#: participant/templates/participant/password_change.html:8 -#: participant/templates/participant/settings.html:8 templates/base.html:29 -msgid "User Settings" -msgstr "Paramètres d'utilisateur" - -#: participant/templates/participant/password_change.html:10 -#: participant/templates/participant/settings.html:5 -#: participant/templates/participant/settings.html:10 -#: participant/templates/participant/settings.html:16 -msgid "Personal Settings" -msgstr "Paramètres personnels" - #: participant/templates/participant/personal_info_widget.html:5 msgid "I submitted the following motions:" msgstr "Je propose les motions suivantes:" @@ -2184,11 +2188,17 @@ msgstr "Je soutien les motions suivantes" msgid "I am candidate for the following elections:" msgstr "Je suis candidat aux élections suivantes" -#: participant/templates/participant/user_detail.html:19 +#: participant/templates/participant/settings.html:5 +#: participant/templates/participant/settings.html:8 templates/base.html:40 +#, fuzzy +msgid "Edit profile" +msgstr "Modifier l'élément" + +#: participant/templates/participant/user_detail.html:23 msgid "The participant is not member of any group." msgstr "Le participant n'est membre d'aucun groupe" -#: participant/templates/participant/user_detail.html:53 +#: participant/templates/participant/user_detail.html:57 msgid "The participant has not logged in yet." msgstr "Le participant ne s'est pas encore authentifié." @@ -2220,89 +2230,78 @@ msgstr "Peut voir la vue d'ensemble" msgid "Errors in the form" msgstr "Erreurs dans le formulaire" -#: projector/views.py:375 projector/templates/projector/base_projector.html:7 -#: projector/templates/projector/base_projector.html:12 -#: projector/templates/projector/dashboard.html:17 +#: projector/views.py:375 projector/templates/projector/dashboard.html:18 msgid "Dashboard" msgstr "Vue d'ensemble" -#: projector/views.py:402 +#: projector/views.py:403 msgid "Projector live view" msgstr "Vue projecteur live" -#: projector/views.py:428 +#: projector/views.py:429 msgid "Overlays" msgstr "Superpositions" -#: projector/views.py:440 +#: projector/views.py:441 msgid "Custom Slides" msgstr "Diapositives personnalisées" -#: projector/templates/projector/base_projector.html:15 -msgid "Overview" -msgstr "Vue d'ensemble" - -#: projector/templates/projector/base_projector.html:18 -#: projector/templates/projector/select_widgets.html:5 -#: projector/templates/projector/select_widgets.html:8 -msgid "Select widgets" -msgstr "Sélectionner les composants" - -#: projector/templates/projector/base_projector.html:22 -msgid "Projector view" -msgstr "Vue projecteur" - -#: projector/templates/projector/control_countdown.html:6 +#: projector/templates/projector/control_countdown.html:7 msgctxt "seconds" msgid "s" msgstr "s" -#: projector/templates/projector/control_countdown.html:7 -msgid "Save as default" +#: projector/templates/projector/control_countdown.html:9 +#, fuzzy +msgid "Save time as default" msgstr "Enregistrer par défault " -#: projector/templates/projector/control_countdown.html:10 -#: projector/templates/projector/control_countdown.html:11 +#: projector/templates/projector/control_countdown.html:12 msgid "Reset countdown" msgstr "Remettre le compte à rebours à zéro" -#: projector/templates/projector/control_countdown.html:13 +#: projector/templates/projector/control_countdown.html:15 msgid "Start countdown" msgstr "Démarrer le compte à rebours" -#: projector/templates/projector/control_countdown.html:16 +#: projector/templates/projector/control_countdown.html:18 msgid "Stop countdown" msgstr "Arrêter le compte à rebours " -#: projector/templates/projector/control_overlay_message.html:11 +#: projector/templates/projector/control_overlay_message.html:10 msgid "Clean message" msgstr "Supprimer le message" -#: projector/templates/projector/custom_slide_widget.html:14 +#: projector/templates/projector/custom_slide_widget.html:12 msgid "Welcome Page" msgstr "Page d'accueil" -#: projector/templates/projector/custom_slide_widget.html:41 -msgid "New slide" -msgstr "nouvelle diapositive" +#: projector/templates/projector/dashboard.html:20 +#, fuzzy +msgid "Manage widgets" +msgstr "Sélectionner les composants" -#: projector/templates/projector/live_view_widget.html:10 +#: projector/templates/projector/dashboard.html:20 +msgid "Widgets" +msgstr "" + +#: projector/templates/projector/live_view_widget.html:8 msgid "Zoom in" msgstr "Zoom avant" -#: projector/templates/projector/live_view_widget.html:13 +#: projector/templates/projector/live_view_widget.html:11 msgid "Zoom out" msgstr "Zoom arrière" -#: projector/templates/projector/live_view_widget.html:18 +#: projector/templates/projector/live_view_widget.html:16 msgid "Scroll text up" msgstr "Faire défiler le texte vers le haut" -#: projector/templates/projector/live_view_widget.html:21 +#: projector/templates/projector/live_view_widget.html:19 msgid "Scroll text down" msgstr "Faire défiler le texte vers le bas" -#: projector/templates/projector/live_view_widget.html:26 +#: projector/templates/projector/live_view_widget.html:24 msgid "Reset projector view" msgstr "Remettre la vue projecteur à zéro" @@ -2311,7 +2310,21 @@ msgstr "Remettre la vue projecteur à zéro" msgid "Custom slide" msgstr "Diapositive personnalisée" -#: projector/templates/projector/select_widgets.html:17 +#: projector/templates/projector/overlay_widget.html:22 +msgid "Countdown for speaking time" +msgstr "" + +#: projector/templates/projector/overlay_widget.html:26 +#, fuzzy +msgid "Message" +msgstr "Supprimer le message" + +#: projector/templates/projector/select_widgets.html:5 +#: projector/templates/projector/select_widgets.html:8 +msgid "Select widgets" +msgstr "Sélectionner les composants" + +#: projector/templates/projector/select_widgets.html:23 msgid "No widgets available" msgstr "Pas d'éléments disponibles." @@ -2323,19 +2336,20 @@ msgstr "N'a pas pu trouver la page." msgid "Server Error" msgstr "Erreur du serveur" -#: templates/base.html:21 +#: templates/base.html:29 msgid "Home" msgstr "Accueil" -#: templates/base.html:27 +#: templates/base.html:41 +#, fuzzy +msgid "Change password" +msgstr "Premier mot de passe" + +#: templates/base.html:43 msgid "Logout" msgstr "Déconnecter" -#: templates/base.html:30 -msgid "Welcome" -msgstr "Bienvenue" - -#: templates/base.html:79 +#: templates/base.html:100 msgid "" "Get professional " "support for OpenSlides." @@ -2343,52 +2357,170 @@ msgstr "" "Obtenir un support " "professionel pour OpenSlides." -#: utils/pdf.py:227 +#: utils/pdf.py:226 #, python-format msgid "As of: %s" msgstr "A partir de: %s" -#: utils/pdf.py:238 utils/pdf.py:247 +#: utils/pdf.py:237 utils/pdf.py:246 #, python-format msgid "Page %s" msgstr "Page %s" -#: utils/utils.py:63 utils/views.py:287 +#: utils/utils.py:59 utils/views.py:283 #, python-format msgid "Do you really want to delete %s?" msgstr "Voulez-vous vraiment supprimer %s?" -#: utils/utils.py:110 +#: utils/utils.py:106 msgid "Sorry, you have no rights to see this page." msgstr "Désolé, vous n'avez pas le droit de voir cette page" -#: utils/views.py:106 +#: utils/views.py:102 msgid "Are you sure?" msgstr "Etes-vous sûr?" -#: utils/views.py:107 +#: utils/views.py:103 msgid "Thank you for your answer" msgstr "Merci pour votre réponse" -#: utils/views.py:244 +#: utils/views.py:240 #, python-format msgid "%s was successfully modified." msgstr "%s a été modifié avec succès." -#: utils/views.py:275 +#: utils/views.py:271 #, python-format msgid "%s was successfully created." msgstr "%s a été créé avec succès." -#: utils/views.py:293 +#: utils/views.py:289 #, python-format msgid "%s was successfully deleted." msgstr "%s a été supprimé avec succès" -#: utils/views.py:308 +#: utils/views.py:304 msgid "undefined-filename" msgstr "nom de fichier indéterminé" #: utils/jsonfield/fields.py:22 msgid "Enter valid JSON" msgstr "Entrez un JSON valide" + +#, fuzzy +#~ msgid "Countdown" +#~ msgstr "Arrêter le compte à rebours " + +#~ msgid "Activate summary for this item" +#~ msgstr "Activez le résumé pour cet élément" + +#, fuzzy +#~ msgid "Show agenda" +#~ msgstr "Nouveau point dans l'ordre du jour" + +#, fuzzy +#~ msgid "Activate agenda" +#~ msgstr "Activez l'élément" + +#~ msgid "Show item" +#~ msgstr "Afficher l'élément" + +#, fuzzy +#~ msgid "User groups" +#~ msgstr "Nouveau groupe" + +#~ msgid "All items" +#~ msgstr "Tous les éléments" + +#~ msgid "View item" +#~ msgstr "Afficher l'élément" + +#~ msgid "Mark item as done" +#~ msgstr "Marquez l'élément comme terminé" + +#~ msgid "Item closed" +#~ msgstr "Elément fermé" + +#~ msgid "Done" +#~ msgstr "Terminé" + +#~ msgid "All elections" +#~ msgstr "Toutes les élections" + +#~ msgid "View election" +#~ msgstr "Afficher l'élection" + +#~ msgid "Election as PDF" +#~ msgstr "L'élection en PDF" + +#~ msgid "Activate election" +#~ msgstr "Activer l'élection" + +#~ msgid "All motions" +#~ msgstr "Toutes les motions" + +#~ msgid "View motion" +#~ msgstr "Afficher la motion" + +#~ msgid "Motion as PDF" +#~ msgstr "Motion dans un PDF" + +#~ msgid "Number" +#~ msgstr "Numéro" + +#~ msgid "Activate motion" +#~ msgstr "Activer la motion" + +#~ msgid "Enter result" +#~ msgstr "Insérer le résultat" + +#~ msgid "Unsupport" +#~ msgstr "Ne plus soutenir" + +#~ msgid "Result after debate" +#~ msgstr "Résultat après la discussion" + +#~ msgid "Version authorized" +#~ msgstr "Version autorisée" + +#~ msgid "Log" +#~ msgstr "Log" + +#~ msgid "All participants" +#~ msgstr "Tout les participants" + +#~ msgid "View participant" +#~ msgstr "Afficher participant" + +#~ msgid "Delete participant" +#~ msgstr "Supprimer le participant" + +#~ msgid "View group" +#~ msgstr "Afficher le groupe" + +#~ msgid "Delete group" +#~ msgstr "Supprimer le groupe" + +#~ msgid "Close this notification" +#~ msgstr "Fermez cette notification" + +#~ msgid "Change status to active" +#~ msgstr "Changer le statut sur actif" + +#~ msgid "User Settings" +#~ msgstr "Paramètres d'utilisateur" + +#~ msgid "Personal Settings" +#~ msgstr "Paramètres personnels" + +#~ msgid "Overview" +#~ msgstr "Vue d'ensemble" + +#~ msgid "Projector view" +#~ msgstr "Vue projecteur" + +#~ msgid "New slide" +#~ msgstr "nouvelle diapositive" + +#~ msgid "Welcome" +#~ msgstr "Bienvenue" diff --git a/openslides/main.py b/openslides/main.py index d25305a4d..b94eebfda 100755 --- a/openslides/main.py +++ b/openslides/main.py @@ -90,6 +90,10 @@ def process_options(argv=None): parser.add_option( "--no-reload", action="store_true", help="Do not reload the development server.") + parser.add_option( + "--no-browser", + action="store_false", dest="start_browser", default=True, + help="Do not automatically start web browser.") parser.add_option( "--version", action="store_true", help="Show version and exit.") @@ -172,7 +176,11 @@ def _main(opts, database_path=None): extra_args = ['--noreload'] else: extra_args = [] - start_openslides(addr, port, start_browser_url=url, extra_args=extra_args) + + if opts.start_browser: + start_browser(url) + + start_openslides(addr, port, extra_args=extra_args) def create_settings(settings_path, database_path=None): diff --git a/openslides/motion/__init__.py b/openslides/motion/__init__.py index e69de29bb..d9b4927bc 100644 --- a/openslides/motion/__init__.py +++ b/openslides/motion/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" + openslides.motion + ~~~~~~~~~~~~~~~~~ + + The OpenSlides motion app appends the functionality to OpenSlides, to + manage motions. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +import openslides.motion.signals +import openslides.motion.slides diff --git a/openslides/motion/forms.py b/openslides/motion/forms.py index 6fbfc9cff..ed1b02155 100644 --- a/openslides/motion/forms.py +++ b/openslides/motion/forms.py @@ -2,68 +2,101 @@ # -*- coding: utf-8 -*- """ openslides.motion.forms - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~ - Forms for the motion app. + Defines the DjangoForms for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext as _ from openslides.utils.forms import CssClassMixin from openslides.utils.person import PersonFormField, MultiplePersonFormField -from openslides.motion.models import Motion +from .models import Motion +from .workflow import motion_workflow_choices -class MotionForm(forms.Form, CssClassMixin): +class BaseMotionForm(forms.ModelForm, CssClassMixin): + """Base FormClass for a Motion. + + For it's own, it append the version data es fields. + + The Class can be mixed with the following Mixins to add fields for the + submitter, supporters etc. + """ + title = forms.CharField(widget=forms.TextInput(), label=_("Title")) + """Title of the Motion. Will be saved in a MotionVersion object.""" + text = forms.CharField(widget=forms.Textarea(), label=_("Text")) + """Text of the Motion. Will be saved in a MotionVersion object.""" + reason = forms.CharField( widget=forms.Textarea(), required=False, label=_("Reason")) - - -class MotionFormTrivialChanges(MotionForm): - trivial_change = forms.BooleanField( - required=False, label=_("Trivial change"), - help_text=_("Trivial changes don't create a new version.")) - - -class MotionManagerForm(forms.ModelForm, CssClassMixin): - submitter = PersonFormField(label=_("Submitter")) + """Reason of the Motion. will be saved in a MotionVersion object.""" class Meta: model = Motion - exclude = ('number', 'status', 'permitted', 'log', 'supporter') + fields = () + + def __init__(self, *args, **kwargs): + """Fill the FormFields releated to the version data with initial data.""" + self.motion = kwargs.get('instance', None) + self.initial = kwargs.setdefault('initial', {}) + if self.motion is not None: + self.initial['title'] = self.motion.title + self.initial['text'] = self.motion.text + self.initial['reason'] = self.motion.reason + super(BaseMotionForm, self).__init__(*args, **kwargs) -class MotionManagerFormSupporter(MotionManagerForm): - # TODO: Do not show the submitter in the user-list +class MotionSubmitterMixin(forms.ModelForm): + """Mixin to append the submitter field to a MotionForm.""" + + submitter = MultiplePersonFormField(label=_("Submitter")) + """Submitter of the Motion. Can be one or more persons.""" + + def __init__(self, *args, **kwargs): + """Fill in the submitter of the motion as default value.""" + if self.motion is not None: + submitter = [submitter.person.person_id for submitter in self.motion.submitter.all()] + self.initial['submitter'] = submitter + super(MotionSubmitterMixin, self).__init__(*args, **kwargs) + + +class MotionSupporterMixin(forms.ModelForm): + """Mixin to append the supporter field to a Motionform.""" + supporter = MultiplePersonFormField(required=False, label=_("Supporters")) + """Supporter of the Motion. Can be one or more persons.""" + + def __init__(self, *args, **kwargs): + """Fill in the supporter of the motions as default value.""" + if self.motion is not None: + supporter = [supporter.person.person_id for supporter in self.motion.supporter.all()] + self.initial['supporter'] = supporter + super(MotionSupporterMixin, self).__init__(*args, **kwargs) -class MotionImportForm(forms.Form, CssClassMixin): - csvfile = forms.FileField( - widget=forms.FileInput(attrs={'size': '50'}), - label=_("CSV File"), - ) - import_permitted = forms.BooleanField( - required=False, - label=_("Import motions with status \"authorized\""), - help_text=_('Set the initial status for each motion to ' - '"authorized"'), - ) +class MotionCreateNewVersionMixin(forms.ModelForm): + """Mixin to add the option to the form, to choose, to create a new version.""" + + new_version = forms.BooleanField( + required=False, label=_("Create new version"), initial=True, + help_text=_("Trivial changes don't create a new version.")) + """BooleanField to decide, if a new version will be created, or the + last_version will be used.""" -class ConfigForm(forms.Form, CssClassMixin): +class ConfigForm(CssClassMixin, forms.Form): + """Form for the configuration tab of OpenSlides.""" motion_min_supporters = forms.IntegerField( widget=forms.TextInput(attrs={'class': 'small-input'}), label=_("Number of (minimum) required supporters for a motion"), - initial=4, - min_value=0, - max_value=8, + initial=4, min_value=0, max_value=8, help_text=_("Choose 0 to disable the supporting system"), ) motion_preamble = forms.CharField( @@ -98,9 +131,18 @@ class ConfigForm(forms.Form, CssClassMixin): label=_("Preamble text for PDF document (all motions)") ) - motion_allow_trivial_change = forms.BooleanField( - label=_("Allow trivial changes"), - help_text=_('Warning: Trivial changes undermine the motions ' - 'autorisation system.'), + motion_create_new_version = forms.ChoiceField( + widget=forms.Select(), + label=_("Create new versions"), required=False, + choices=( + ('ALLWASY_CREATE_NEW_VERSION', _('create allways a new versions')), + ('NEVER_CREATE_NEW_VERSION', _('create never a new version')), + ('ASK_USER', _('Let the user choose if he wants to create a new version'))) ) + + motion_workflow = forms.ChoiceField( + widget=forms.Select(), + label=_("Workflow for the motions"), + required=True, + choices=motion_workflow_choices()) diff --git a/openslides/motion/models.py b/openslides/motion/models.py index 7127e521c..adcfcabec 100644 --- a/openslides/motion/models.py +++ b/openslides/motion/models.py @@ -2,11 +2,14 @@ # -*- coding: utf-8 -*- """ openslides.motion.models - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~ Models for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + To use a motion object, you only have to import the Motion class. Any + functionality can be reached from a motion object. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ @@ -17,7 +20,7 @@ from django.db import models from django.db.models import Max from django.dispatch import receiver from django.utils.translation import pgettext -from django.utils.translation import ugettext_lazy as _, ugettext_noop, ugettext +from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ from openslides.utils.utils import _propper_unicode from openslides.utils.person import PersonField @@ -30,577 +33,622 @@ from openslides.projector.api import register_slidemodel from openslides.projector.models import SlideMixin from openslides.agenda.models import Item - -class MotionSupporter(models.Model): - motion = models.ForeignKey("Motion") - person = PersonField() +from .workflow import (motion_workflow_choices, get_state, State, WorkflowError, + DUMMY_STATE) -class Motion(models.Model, SlideMixin): +class Motion(SlideMixin, models.Model): + """The Motion Class. + + This class is the main entry point to all other classes related to a motion. + """ + prefix = "motion" - STATUS = ( - ('pub', _('Published')), - ('per', _('Permitted')), - ('acc', _('Accepted')), - ('rej', _('Rejected')), - ('wit', _('Withdrawed')), - ('adj', _('Adjourned')), - ('noc', _('Not Concerned')), - ('com', _('Commited a bill')), - ('nop', _('Rejected (not authorized)')), - ('rev', _('Needs Review')), # Where is this status used? - #additional actions: - # edit - # delete - # setnumber - # support - # unsupport - # createitem - # activateitem - # genpoll - ) + """Prefix for the slide system.""" - submitter = PersonField(verbose_name=_("Submitter")) - number = models.PositiveSmallIntegerField(blank=True, null=True, - unique=True) - status = models.CharField(max_length=3, choices=STATUS, default='pub') - permitted = models.ForeignKey('AVersion', related_name='permitted', - null=True, blank=True) - log = models.TextField(blank=True, null=True) + active_version = models.ForeignKey('MotionVersion', null=True, + related_name="active_version") + """Points to a specific version. + + Used be the permitted-version-system to deside witch version is the active + Version. Could also be used to only choose a specific version as a default + version. Like the Sighted versions on Wikipedia. + """ + + state_id = models.CharField(max_length=3) + """The id of a state object. + + This Attribute is used be motion.state to identify the current state of the + motion. + """ + + identifier = models.CharField(max_length=255, null=True, blank=True, + unique=True) + """A string as human readable identifier for the motion.""" + + # category = models.ForeignKey('Category', null=True, blank=True) + # TODO: proposal + #master = models.ForeignKey('self', null=True, blank=True) + + class Meta: + permissions = ( + ('can_see_motion', ugettext_noop('Can see motions')), + ('can_create_motion', ugettext_noop('Can create motions')), + ('can_support_motion', ugettext_noop('Can support motions')), + ('can_manage_motion', ugettext_noop('Can manage motions')), + ) + # TODO: order per default by category and identifier + # ordering = ('number',) + + def __unicode__(self): + """Return a human readable name of this motion.""" + return self.get_title() + + # TODO: Use transaction + def save(self, *args, **kwargs): + """Save the motion. + + 1. Set the state of a new motion to the default motion. + 2. Save the motion object. + 3. Save the version Data. + 4. Set the active version for the motion. + + A new version will be saved if motion.new_version was called + between the creation of this object and the last call of motion.save() + + or + + If the motion has new version data (title, text, reason) + + and + + the config 'motion_create_new_version' is set to + 'ALLWASY_CREATE_NEW_VERSION'. + """ + if not self.state_id: + self.reset_state() + + super(Motion, self).save(*args, **kwargs) + + # Find out if the version data has changed + for attr in ['title', 'text', 'reason']: + if not self.versions.exists(): + new_data = True + break + if getattr(self, attr) != getattr(self.last_version, attr): + new_data = True + break + else: + new_data = False + + need_new_version = config['motion_create_new_version'] == 'ALLWASY_CREATE_NEW_VERSION' + if hasattr(self, '_new_version') or (new_data and need_new_version): + version = self.new_version + del self._new_version + version.motion = self # Test if this line is realy neccessary. + elif new_data and not need_new_version: + version = self.last_version + else: + # We do not need to save the motion version. + return + + # Save title, text and reason in the version object + for attr in ['title', 'text', 'reason']: + _attr = '_%s' % attr + try: + setattr(version, attr, getattr(self, _attr)) + delattr(self, _attr) + except AttributeError: + if self.versions.exists(): + # If the _attr was not set, use the value from last_version + setattr(version, attr, getattr(self.last_version, attr)) + + # Set version_number of the new Version (if neccessary) and save it into the DB + if version.id is None: + # TODO: auto increment the version_number in the Database + version_number = self.versions.aggregate(Max('version_number'))['version_number__max'] or 0 + version.version_number = version_number + 1 + version.save() + + # Set the active Version of this motion. This has to be done after the + # version is saved to the db + if not self.state.version_permission or self.active_version is None: + self.active_version = version + self.save() + + def get_absolute_url(self, link='detail'): + """Return an URL for this version. + + The keywordargument 'link' can be 'detail', 'view', 'edit' or 'delete'. + """ + if link == 'view' or link == 'detail': + return reverse('motion_detail', args=[str(self.id)]) + if link == 'edit': + return reverse('motion_edit', args=[str(self.id)]) + if link == 'delete': + return reverse('motion_delete', args=[str(self.id)]) + + def get_title(self): + """Get the title of the motion. + + The titel is taken from motion.version. + """ + try: + return self._title + except AttributeError: + return self.version.title + + def set_title(self, title): + """Set the titel of the motion. + + The titel will me saved into the version object, wenn motion.save() is + called. + """ + self._title = title + + title = property(get_title, set_title) + """The title of the motion. + + Is saved in a MotionVersion object. + """ + + def get_text(self): + """Get the text of the motion. + + Simular to get_title(). + """ + try: + return self._text + except AttributeError: + return self.version.text + + def set_text(self, text): + """ Set the text of the motion. + + Simular to set_title(). + """ + self._text = text + + text = property(get_text, set_text) + """The text of a motin. + + Is saved in a MotionVersion object. + """ + + def get_reason(self): + """Get the reason of the motion. + + Simular to get_title(). + """ + try: + return self._reason + except AttributeError: + return self.version.reason + + def set_reason(self, reason): + """Set the reason of the motion. + + Simular to set_title(). + """ + self._reason = reason + + reason = property(get_reason, set_reason) + """The reason for the motion. + + Is saved in a MotionVersion object. + """ + + @property + def new_version(self): + """Return a Version object, not saved in the database. + + On the first call, it creates a new version. On any later call, it + use the existing new version. + + The new_version object will be deleted when it is saved into the db. + """ + try: + return self._new_version + except AttributeError: + self._new_version = MotionVersion(motion=self) + return self._new_version + + def get_version(self): + """Get the 'active' version object. + + This version will be used to get the data for this motion. + """ + try: + return self._version + except AttributeError: + return self.last_version + + def set_version(self, version): + """Set the 'active' version object. + + The keyargument 'version' can be a MotionVersion object or the + version_number of a VersionObject or None. + + If the argument is None, the newest version will be used. + """ + if version is None: + try: + del self._version + except AttributeError: + pass + else: + if type(version) is int: + version = self.versions.get(version_number=version) + elif type(version) is not MotionVersion: + raise ValueError('The argument \'version\' has to be int or ' + 'MotionVersion, not %s' % type(version)) + # TODO: Test, that the version is one of this motion + self._version = version + + version = property(get_version, set_version) + """The active version of this motion.""" @property def last_version(self): - """ - Return last version of the motion. - """ + """Return the newest version of the motion.""" + # TODO: Fix the case, that the motion has no Version try: - return AVersion.objects.filter(motion=self).order_by('id') \ - .reverse()[0] + return self.versions.order_by('-version_number')[0] except IndexError: - return None + return self.new_version - @property - def public_version(self): - """ - Return permitted, if the motion was permitted, else last_version - """ - if self.permitted is not None: - return self.permitted - else: - return self.last_version - - def accept_version(self, version, user=None): - """ - accept a Version - """ - self.permitted = version - self.save(nonewversion=True) - version.rejected = False - version.save() - self.writelog(_("Version %d authorized") % version.aid, user) - - def reject_version(self, version, user=None): - if version.id > self.permitted.id: - version.rejected = True - version.save() - self.writelog(pgettext( - "Rejected means not authorized", "Version %d rejected") - % version.aid, user) - return True - return False - - @property - def versions(self): - """ - Return a list of all versions of the motion. - """ - return AVersion.objects.filter(motion=self) - - @property - def creation_time(self): - """ - Return the time of the creation of the motion. - """ - try: - return self.versions[0].time - except IndexError: - return None - - @property - def notes(self): - """ - Return some information of the motion. - """ - note = [] - if self.status == "pub" and not self.enough_supporters: - note.append(ugettext("Searching for supporters.")) - if self.status == "pub" and self.permitted is None: - note.append(ugettext("Not yet authorized.")) - elif self.unpermitted_changes and self.permitted: - note.append(ugettext("Not yet authorized changes.")) - return note - - @property - def unpermitted_changes(self): - """ - Return True if the motion has unpermitted changes. - - The motion has unpermitted changes, if the permitted-version - is not the lastone and the lastone is not rejected. - TODO: rename the property in unchecked__changes - """ - if (self.last_version != self.permitted and - not self.last_version.rejected): - return True - else: - return False - - @property - def supporters(self): - return sorted([object.person for object in self.motionsupporter_set.all()], - key=lambda person: person.sort_name) + def is_submitter(self, person): + """Return True, if person is a submitter of this motion. Else: False.""" + self.submitter.filter(person=person).exists() def is_supporter(self, person): - try: - return self.motionsupporter_set.filter(person=person).exists() - except AttributeError: - return False - - @property - def enough_supporters(self): - """ - Return True, if the motion has enough supporters - """ - min_supporters = int(config['motion_min_supporters']) - if self.status == "pub": - return self.count_supporters() >= min_supporters - else: - return True - - def count_supporters(self): - return self.motionsupporter_set.count() - - @property - def missing_supporters(self): - """ - Return number of missing supporters - """ - min_supporters = int(config['motion_min_supporters']) - delta = min_supporters - self.count_supporters() - if delta > 0: - return delta - else: - return 0 - - def save(self, user=None, nonewversion=False, trivial_change=False): - """ - Save the Motion, and create a new AVersion if necessary - """ - super(Motion, self).save() - if nonewversion: - return - last_version = self.last_version - fields = ["text", "title", "reason"] - if last_version is not None: - changed_fields = [ - f for f in fields - if getattr(last_version, f) != getattr(self, f)] - if not changed_fields: - return # No changes - try: - if trivial_change and last_version is not None: - last_version.text = self.text - last_version.title = self.title - last_version.reason = self.reason - last_version.save() - - meta = AVersion._meta - field_names = [ - unicode(meta.get_field(f).verbose_name) - for f in changed_fields] - - self.writelog( - _("Trivial changes to version %(version)d; " - "changed fields: %(changed_fields)s") - % dict(version=last_version.aid, - changed_fields=", ".join(field_names))) - return # Done - - version = AVersion( - title=getattr(self, 'title', ''), - text=getattr(self, 'text', ''), - reason=getattr(self, 'reason', ''), - motion=self) - version.save() - self.writelog(_("Version %s created") % version.aid, user) - is_manager = user.has_perm('motion.can_manage_motion') - except AttributeError: - is_manager = False - - supporters = self.motionsupporter_set.all() - if (self.status == "pub" and - supporters and not is_manager): - supporters.delete() - self.writelog(_("Supporters removed"), user) - - def reset(self, user): - """ - Reset the motion. - """ - self.status = "pub" - self.permitted = None - self.save() - self.writelog(_("Status reseted to: %s") % (self.get_status_display()), user) + """Return True, if person is a supporter of this motion. Else: False.""" + return self.supporter.filter(person=person).exists() def support(self, person): - """ - Add a Supporter to the list of supporters of the motion. - """ - if person == self.submitter: - # TODO: Use own Exception - raise NameError('Supporter can not be the submitter of a ' - 'motion.') - if not self.is_supporter(person): - MotionSupporter(motion=self, person=person).save() - self.writelog(_("Supporter: +%s") % (person)) - # TODO: Raise a precise exception for the view in else-clause + """Add 'person' as a supporter of this motion.""" + if self.state.support: + if not self.is_supporter(person): + MotionSupporter(motion=self, person=person).save() + else: + raise WorkflowError("You can not support a motion in state %s" % self.state.name) def unsupport(self, person): + """Remove 'person' as supporter from this motion.""" + if self.state.support: + self.supporter.filter(person=person).delete() + else: + raise WorkflowError("You can not unsupport a motion in state %s" % self.state.name) + + def create_poll(self): + """Create a new poll for this motion. + + Return the new poll object. """ - remove a supporter from the list of supporters of the motion + if self.state.create_poll: + # TODO: auto increment the poll_number in the Database + poll_number = self.polls.aggregate(Max('poll_number'))['poll_number__max'] or 0 + poll = MotionPoll.objects.create(motion=self, poll_number=poll_number + 1) + poll.set_options() + return poll + else: + raise WorkflowError("You can not create a poll in state %s" % self.state.name) + + def get_state(self): + """Return the state of the motion. + + State is a State object. See openslides.motion.workflow for more informations. """ try: - self.motionsupporter_set.get(person=person).delete() - except MotionSupporter.DoesNotExist: - # TODO: Don't do nothing but raise a precise exception for the view - pass + return get_state(self.state_id) + except WorkflowError: + return DUMMY_STATE + + def set_state(self, next_state): + """Set the state of this motion. + + The keyargument 'next_state' has to be a State object or an id of a + State object. + """ + if not isinstance(next_state, State): + next_state = get_state(next_state) + if next_state in self.state.next_states: + self.state_id = next_state.id else: - self.writelog(_("Supporter: -%s") % (person)) + raise WorkflowError('%s is not a valid next_state' % next_state) - def set_number(self, number=None, user=None): - """ - Set a number for ths motion. - """ - if self.number is not None: - # TODO: Use own Exception - raise NameError('This motion has already a number.') - if number is None: - try: - number = Motion.objects.aggregate(Max('number'))['number__max'] + 1 - except TypeError: - number = 1 - self.number = number - self.save() - self.writelog(_("Number set: %s") % (self.number), user) - return self.number + state = property(get_state, set_state) + """The state of the motion as Ste object.""" - def permit(self, user=None): - """ - Change the status of this motion to permit. - """ - self.set_status(user, "per") - aversion = self.last_version - if self.number is None: - self.set_number() - self.permitted = aversion - self.save() - self.writelog(_("Version %s authorized") % (aversion.aid), user) - return self.permitted - - def notpermit(self, user=None): - """ - Change the status of this motion to 'not permitted (rejected)'. - """ - self.set_status(user, "nop") - #TODO: reject last version - if self.number is None: - self.set_number() - self.save() - self.writelog(_("Version %s not authorized") % (self.last_version.aid), user) - - def set_status(self, user, status, force=False): - """ - Set the status of the motion. - """ - error = True - for a, b in Motion.STATUS: - if status == a: - error = False - break - if error: - # TODO: Use the Right Error - raise NameError(_('%s is not a valid status.') % status) - if self.status == status: - # TODO: Use the Right Error - raise NameError(_('The motion status is already \'%s.\'') - % self.status) - - actions = [] - actions = self.get_allowed_actions(user) - if status not in actions and not force: - #TODO: Use the Right Error - raise NameError(_( - 'The motion status is: \'%(currentstatus)s\'. ' - 'You can not set the status to \'%(newstatus)s\'.') % { - 'currentstatus': self.status, - 'newstatus': status}) - - oldstatus = self.get_status_display() - self.status = status - self.save() - self.writelog(_("Status modified") + ": %s -> %s" - % (oldstatus, self.get_status_display()), user) - - def get_allowed_actions(self, user): - """ - Return a list of all the allowed status. - """ - actions = [] - - # check if user allowed to withdraw an motion - if ((self.status == "pub" - and self.number - and user == self.submitter) - or (self.status == "pub" - and self.number - and user.has_perm("motion.can_manage_motion")) - or (self.status == "per" - and user == self.submitter) - or (self.status == "per" - and user.has_perm("motion.can_manage_motion"))): - actions.append("wit") - #Check if the user can review the motion - if (self.status == "rev" - and (self.submitter == user - or user.has_perm("motion.can_manage_motion"))): - actions.append("pub") - - # Check if the user can support and unspoort the motion - if (self.status == "pub" - and user != self.submitter - and not self.is_supporter(user)): - actions.append("support") - - if self.status == "pub" and self.is_supporter(user): - actions.append("unsupport") - - #Check if the user can edit the motion - if (user == self.submitter \ - and (self.status in ('pub', 'per'))) \ - or user.has_perm("motion.can_manage_motion"): - actions.append("edit") - - # Check if the user can delete the motion (admin, manager, owner) - # reworked as requiered in #100 - if (user.has_perm("motion.can_delete_all_motions") or - (user.has_perm("motion.can_manage_motion") and - self.number is None) or - (self.submitter == user and self.number is None)): - actions.append("delete") - - #For the rest, all actions need the manage permission - if not user.has_perm("motion.can_manage_motion"): - return actions - - if self.status == "pub": - actions.append("nop") - actions.append("per") - if self.number == None: - actions.append("setnumber") - - if self.status == "per": - actions.append("acc") - actions.append("rej") - actions.append("adj") - actions.append("noc") - actions.append("com") - actions.append("genpoll") - if self.unpermitted_changes: - actions.append("permitversion") - actions.append("rejectversion") - - return actions - - def delete(self, force=False): - """ - Delete the motion. It is not possible, if the motion has - allready a number - """ - if self.number and not force: - raise NameError('The motion has already a number. ' - 'You can not delete it.') - - for item in Item.objects.filter(related_sid=self.sid): - item.delete() - super(Motion, self).delete() - - def writelog(self, text, user=None): - if not self.log: - self.log = "" - self.log += u"%s | %s" % (datetime.now().strftime("%d.%m.%Y %H:%M:%S"), _propper_unicode(text)) - if user is not None: - if isinstance(user, User): - self.log += u" (%s %s)" % (_("by"), _propper_unicode(user.username)) - else: - self.log += u" (%s %s)" % (_("by"), _propper_unicode(str(user))) - self.log += "\n" - self.save() - - def get_agenda_title(self): - return self.public_version.title - - def get_agenda_title_supplement(self): - number = self.number or '[%s]' % ugettext('no number') - return '(%s %s)' % (ugettext('motion'), number) - - def __getattr__(self, name): - """ - if name is title, text, reason or time, - Return this attribute from the newest version of the motion - """ - if name in ('title', 'text', 'reason', 'time', 'aid'): - try: - if name == 'aid': - return self.last_version.aid - return self.last_version.__dict__[name] - except TypeError: - raise AttributeError(name) - except AttributeError: - raise AttributeError(name) - raise AttributeError(name) - - def gen_poll(self, user=None): - """ - Generates a poll object for the motion - """ - poll = MotionPoll(motion=self) - poll.save() - poll.set_options() - self.writelog(_("Poll created"), user) - return poll - - @property - def polls(self): - return self.motionpoll_set.all() - - @property - def results(self): - return self.get_poll_results() - - def get_poll_results(self): - """ - Return a list of voting results - """ - results = [] - for poll in self.polls: - for option in poll.get_options(): - if option.get_votes().exists(): - results.append(( - option['Yes'], option['No'], - option['Abstain'], poll.print_votesinvalid(), - poll.print_votescast())) - return results + def reset_state(self): + """Set the state to the default state.""" + self.state_id = get_state('default').id def slide(self): - """ - return the slide dict - """ + """Return the slide dict.""" data = super(Motion, self).slide() data['motion'] = self data['title'] = self.title data['template'] = 'projector/Motion.html' return data - def get_absolute_url(self, link='view'): - if link == 'view': - return reverse('motion_view', args=[str(self.id)]) - if link == 'edit': - return reverse('motion_edit', args=[str(self.id)]) - if link == 'delete': - return reverse('motion_delete', args=[str(self.id)]) + def get_agenda_title(self): + """Return a title for the Agenda.""" + return self.last_version.title - def __unicode__(self): - try: - return self.last_version.title - except AttributeError: - return "no title jet" + ## def get_agenda_title_supplement(self): + ## number = self.number or '[%s]' % ugettext('no number') + ## return '(%s %s)' % (ugettext('motion'), number) + + def get_allowed_actions(self, person): + """Return a dictonary with all allowed actions for a specific person. + + The dictonary contains the following actions. + + * edit + * delete + * create_poll + * support + * unsupport + * change_state + * reset_state + """ + actions = { + 'edit': ((self.is_submitter(person) and + self.state.edit_as_submitter) or + person.has_perm('motion.can_manage_motion')), + + 'create_poll': (person.has_perm('motion.can_manage_motion') and + self.state.create_poll), + + 'support': (self.state.support and + config['motion_min_supporters'] > 0 and + not self.is_submitter(person)), + + 'change_state': person.has_perm('motion.can_manage_motion'), + + } + actions['delete'] = actions['edit'] # TODO: Only if the motion has no number + actions['unsupport'] = actions['support'] + actions['reset_state'] = 'change_state' + return actions + + def write_log(self, message, person=None): + """Write a log message. + + Message should be in english and translatable. + + e.G: motion.write_log(ugettext_noob('Message Text')) + """ + MotionLog.objects.create(motion=self, message=message, person=person) + + def activate_version(self, version): + """Set the active state of a version to True. + + 'version' can be a version object, or the version_number of a version. + """ + if type(version) is int: + version = self.versions.get(version_number=version) + self.active_version = version + + if version.rejected: + version.rejected = False + version.save() + + def reject_version(self, version): + """Reject a version of this motion. + + 'version' can be a version object, or the version_number of a version. + """ + if type(version) is int: + version = self.versions.get(version_number=version) + + if version.active: + raise MotionError('The active version can not be rejected') + + version.rejected = True + version.save() + + +class MotionVersion(models.Model): + """ + A MotionVersion object saves some date of the motion.""" + + motion = models.ForeignKey(Motion, related_name='versions') + """The Motion, to witch the version belongs.""" + + version_number = models.PositiveIntegerField(default=1) + """An id for this version in realation to a motion. + + Is unique for each motion. + """ + + title = models.CharField(max_length=255, verbose_name=ugettext_lazy("Title")) + """The Title of a motion.""" + + text = models.TextField(verbose_name=_("Text")) + """The text of a motion.""" + + reason = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Reason")) + """The reason for a motion.""" + + rejected = models.BooleanField(default=False) + """Saves, if the version is rejected.""" + + creation_time = models.DateTimeField(auto_now=True) + """Time, when the version was saved.""" + + #identifier = models.CharField(max_length=255, verbose_name=ugettext_lazy("Version identifier")) + #note = models.TextField(null=True, blank=True) class Meta: - permissions = ( - ('can_see_motion', ugettext_noop("Can see motions")), - ('can_create_motion', ugettext_noop("Can create motions")), - ('can_support_motion', ugettext_noop("Can support motions")), - ('can_manage_motion', ugettext_noop("Can manage motions")), - ) - ordering = ('number',) - - -class AVersion(models.Model): - title = models.CharField(max_length=100, verbose_name=_("Title")) - text = models.TextField(verbose_name=_("Text")) - reason = models.TextField(null=True, blank=True, verbose_name=_("Reason")) - rejected = models.BooleanField() # = Not Permitted - time = models.DateTimeField(auto_now=True) - motion = models.ForeignKey(Motion) + unique_together = ("motion", "version_number") def __unicode__(self): - return "%s %s" % (self.id, self.title) + """Return a string, representing this object.""" + counter = self.version_number or _('new') + return "%s Version %s" % (self.motion, counter) + + def get_absolute_url(self, link='detail'): + """Return the URL of this Version. + + The keyargument link can be 'view' or 'detail'. + """ + if link == 'view' or link == 'detail': + return reverse('motion_version_detail', args=[str(self.motion.id), + str(self.version_number)]) @property - def aid(self): - try: - return self._aid - except AttributeError: - self._aid = AVersion.objects \ - .filter(motion=self.motion) \ - .filter(id__lte=self.id).count() - return self._aid + def active(self): + """Return True, if the version is the active version of a motion. Else: False.""" + return self.active_version.exists() -register_slidemodel(Motion) + +class MotionSubmitter(models.Model): + """Save the submitter of a Motion.""" + + motion = models.ForeignKey('Motion', related_name="submitter") + """The motion to witch the object belongs.""" + + person = PersonField() + """The person, who is the submitter.""" + + def __unicode__(self): + """Return the name of the submitter as string.""" + return unicode(self.person) + + +class MotionSupporter(models.Model): + """Save the submitter of a Motion.""" + + motion = models.ForeignKey('Motion', related_name="supporter") + """The motion to witch the object belongs.""" + + person = PersonField() + """The person, who is the supporter.""" + + def __unicode__(self): + """Return the name of the supporter as string.""" + return unicode(self.person) + + +## class Category(models.Model): + ## name = models.CharField(max_length=255, verbose_name=ugettext_lazy("Category name")) + ## prefix = models.CharField(max_length=32, verbose_name=ugettext_lazy("Category prefix")) + + ## def __unicode__(self): + ## return self.name + + +## class Comment(models.Model): + ## motion_version = models.ForeignKey(MotionVersion) + ## text = models.TextField() + ## author = PersonField() + ## creation_time = models.DateTimeField(auto_now=True) + + +class MotionLog(models.Model): + """Save a logmessage for a motion.""" + + motion = models.ForeignKey(Motion, related_name='log_messages') + """The motion to witch the object belongs.""" + + message = models.CharField(max_length=255) + """The log message. + + Should be in english. + """ + + person = PersonField(null=True) + """A person object, who created the log message. Optional.""" + + time = models.DateTimeField(auto_now=True) + """The Time, when the loged action was performed.""" + + class Meta: + ordering = ['-time'] + + def __unicode__(self): + """Return a string, representing the log message.""" + # TODO: write time in the local time format. + if self.person is None: + return "%s %s" % (self.time, _(self.message)) + else: + return "%s %s by %s" % (self.time, _(self.message), self.person) + + +class MotionError(Exception): + """Exception raised when errors in the motion accure.""" + pass class MotionVote(BaseVote): + """Saves the votes for a MotionPoll. + + There should allways be three MotionVote objects for each poll, + one for 'yes', 'no', and 'abstain'.""" + option = models.ForeignKey('MotionOption') + """The option object, to witch the vote belongs.""" class MotionOption(BaseOption): + """Links between the MotionPollClass and the MotionVoteClass. + + There should be one MotionOption object for each poll.""" + poll = models.ForeignKey('MotionPoll') + """The poll object, to witch the object belongs.""" + vote_class = MotionVote + """The VoteClass, to witch this Class links.""" -class MotionPoll(BasePoll, CountInvalid, CountVotesCast): +class MotionPoll(CountInvalid, CountVotesCast, BasePoll): + """The Class to saves the poll results for a motion poll.""" + + motion = models.ForeignKey(Motion, related_name='polls') + """The motion to witch the object belongs.""" + option_class = MotionOption + """The option class, witch links between this object the the votes.""" + vote_values = [ ugettext_noop('Yes'), ugettext_noop('No'), ugettext_noop('Abstain')] + """The possible anwers for the poll. 'Yes, 'No' and 'Abstain'.""" - motion = models.ForeignKey(Motion) + poll_number = models.PositiveIntegerField(default=1) + """An id for this poll in realation to a motion. - def get_motion(self): - return self.motion + Is unique for each motion. + """ + + class Meta: + unique_together = ("motion", "poll_number") + + def __unicode__(self): + """Return a string, representing the poll.""" + return _('Ballot %d') % self.poll_number + + def get_absolute_url(self, link='edit'): + """Return an URL for the poll. + + The keyargument 'link' can be 'edit' or 'delete'. + """ + if link == 'edit': + return reverse('motion_poll_edit', args=[str(self.motion.pk), + str(self.poll_number)]) + if link == 'delete': + return reverse('motion_poll_delete', args=[str(self.motion.pk), + str(self.poll_number)]) def set_options(self): + """Create the option class for this poll.""" #TODO: maybe it is possible with .create() to call this without poll=self + # or call this in save() self.get_option_class()(poll=self).save() def append_pollform_fields(self, fields): + """Apend the fields for invalid and votecast to the ModelForm.""" CountInvalid.append_pollform_fields(self, fields) CountVotesCast.append_pollform_fields(self, fields) - - def get_absolute_url(self): - return reverse('motion_poll_view', args=[self.id]) - - def get_ballot(self): - return self.motion.motionpoll_set.filter(id__lte=self.id).count() - - -@receiver(default_config_value, dispatch_uid="motion_default_config") -def default_config(sender, key, **kwargs): - return { - 'motion_min_supporters': 0, - 'motion_preamble': _('The assembly may decide,'), - 'motion_pdf_ballot_papers_selection': 'CUSTOM_NUMBER', - 'motion_pdf_ballot_papers_number': '8', - 'motion_pdf_title': _('Motions'), - 'motion_pdf_preamble': '', - 'motion_allow_trivial_change': False, - }.get(key) diff --git a/openslides/motion/pdf.py b/openslides/motion/pdf.py new file mode 100644 index 000000000..fcee6c2e7 --- /dev/null +++ b/openslides/motion/pdf.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.motion.pdf + ~~~~~~~~~~~~~~~~~~~~~ + + Functions to generate the PDFs for the motion app. +""" + +from reportlab.lib import colors +from reportlab.lib.units import cm +from reportlab.platypus import ( + SimpleDocTemplate, PageBreak, Paragraph, Spacer, Table, TableStyle) +from django.utils.translation import ugettext as _ + +from openslides.config.models import config +from openslides.utils.pdf import stylesheet + +from .models import Motion + + +def motions_to_pdf(pdf): + """Create a PDF with all motions.""" + + motions = Motion.objects.all() + all_motion_cover(pdf, motions) + for motion in motions: + pdf.append(PageBreak()) + motion_to_pdf(pdf, motion) + + +def motion_to_pdf(pdf, motion): + """Create a PDF for one motion.""" + + pdf.append(Paragraph(_("Motion: %s") % motion.title, stylesheet['Heading1'])) + + motion_data = [] + + # submitter + cell1a = [] + cell1a.append(Spacer(0, 0.2 * cm)) + cell1a.append(Paragraph("%s:" % _("Submitter"), + stylesheet['Heading4'])) + cell1b = [] + cell1b.append(Spacer(0, 0.2 * cm)) + cell1b.append(Paragraph(unicode(motion.submitter), stylesheet['Normal'])) + motion_data.append([cell1a, cell1b]) + + # TODO: choose this in workflow + if motion.state.edit_as_submitter: + # Cell for the signature + cell2a = [] + cell2b = [] + cell2a.append(Paragraph("%s:" % + _("Signature"), stylesheet['Heading4'])) + cell2b.append(Paragraph(42 * "_", stylesheet['Signaturefield'])) + cell2b.append(Spacer(0, 0.1 * cm)) + cell2b.append(Spacer(0, 0.2 * cm)) + motion_data.append([cell2a, cell2b]) + + # supporters + if config['motion_min_supporters']: + cell3a = [] + cell3b = [] + cell3a.append(Paragraph("%s:" + % _("Supporters"), stylesheet['Heading4'])) + supporters = motion.supporter.all() + for supporter in supporters: + cell3b.append(Paragraph(".  %s" % unicode(supporter), + stylesheet['Signaturefield'])) + if motion.state.support: + for count in range(config['motion_min_supporters'] - supporters.count()): + cell3b.append(Paragraph(". " + 42 * "_", + stylesheet['Signaturefield'])) + cell3b.append(Spacer(0, 0.2 * cm)) + motion_data.append([cell3a, cell3b]) + + ## # status + ## cell4a = [] + ## cell4b = [] + ## note = " ".join(motion.notes) + ## cell4a.append(Paragraph("%s:" % _("Status"), stylesheet['Heading4'])) + ## if note != "": + ## if motion.status == "pub": + ## cell4b.append(Paragraph(note, stylesheet['Normal'])) + ## else: + ## cell4b.append(Paragraph("%s | %s" % (motion.get_status_display(), note), stylesheet['Normal'])) + ## else: + ## cell4b.append(Paragraph("%s" % motion.get_status_display(), stylesheet['Normal'])) + ## data.append([cell4a, cell4b]) + + # Motion state + cell4a = [] + cell4b = [] + cell4a.append(Paragraph("%s:" % _("State"), + stylesheet['Heading4'])) + cell4b.append(Paragraph(motion.state.name, stylesheet['Normal'])) + motion_data.append([cell4a, cell4b]) + + # Version number (aid) + if motion.versions.count() > 1: + cell5a = [] + cell5b = [] + cell5a.append(Paragraph("%s:" % _("Version"), + stylesheet['Heading4'])) + cell5b.append(Paragraph("%s" % motion.version.version_number, stylesheet['Normal'])) + motion_data.append([cell5a, cell5b]) + + # voting results + polls = [] + for poll in motion.polls.all(): + if not poll.has_votes(): + continue + polls.append(poll) + + if polls: + cell6a = [] + cell6b = [] + cell6a.append(Paragraph("%s:" % + _("Vote results"), stylesheet['Heading4'])) + ballotcounter = 0 + for poll in polls: + ballotcounter += 1 + option = poll.get_options()[0] + yes, no, abstain, invalid, votecast = ( + option['Yes'], option['No'], option['Abstain'], + poll.print_voteinvalid(), poll.print_votecast()) + + if len(polls) > 1: + cell6b.append(Paragraph("%s. %s" % (ballotcounter, _("Vote")), + stylesheet['Bold'])) + cell6b.append(Paragraph( + "%s: %s
    %s: %s
    %s: %s
    %s: %s
    %s: %s" % + (_("Yes"), yes, _("No"), no, _("Abstention"), abstain, _("Invalid"), + invalid, _("Votes cast"), votecast), stylesheet['Normal'])) + cell6b.append(Spacer(0, 0.2 * cm)) + motion_data.append([cell6a, cell6b]) + + # Creating Table + table = Table(motion_data) + table._argW[0] = 4.5 * cm + table._argW[1] = 11 * cm + table.setStyle(TableStyle([('BOX', (0, 0), (-1, -1), 1, colors.black), + ('VALIGN', (0, 0), (-1, -1), 'TOP')])) + pdf.append(table) + pdf.append(Spacer(0, 1 * cm)) + + pdf.append(Paragraph(motion.title, stylesheet['Heading3'])) + pdf.append(Paragraph(motion.text.replace('\r\n', '
    '), stylesheet['Paragraph'])) + if motion.reason: + pdf.append(Paragraph(_("Reason:"), stylesheet['Heading3'])) + pdf.append(Paragraph(motion.reason.replace('\r\n', '
    '), stylesheet['Paragraph'])) + return pdf + + +def all_motion_cover(pdf, motions): + """Create a coverpage for all motions.""" + pdf.append(Paragraph(config["motion_pdf_title"], stylesheet['Heading1'])) + + preamble = config["motion_pdf_preamble"] + if preamble: + pdf.append(Paragraph("%s" % preamble.replace('\r\n', '
    '), stylesheet['Paragraph'])) + + pdf.append(Spacer(0, 0.75 * cm)) + + if not motions: + pdf.append(Paragraph(_("No motions available."), stylesheet['Heading3'])) + else: + for motion in motions: + pdf.append(Paragraph(motion.title, stylesheet['Heading3'])) diff --git a/openslides/motion/signals.py b/openslides/motion/signals.py new file mode 100644 index 000000000..fb1dffd9a --- /dev/null +++ b/openslides/motion/signals.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.motion.signales + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Signals for the motion app. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from openslides.config.signals import default_config_value + + +@receiver(default_config_value, dispatch_uid="motion_default_config") +def default_config(sender, key, **kwargs): + """Return the default config values for the motion app.""" + return { + 'motion_min_supporters': 0, + 'motion_preamble': _('The assembly may decide,'), + 'motion_pdf_ballot_papers_selection': 'CUSTOM_NUMBER', + 'motion_pdf_ballot_papers_number': '8', + 'motion_pdf_title': _('Motions'), + 'motion_pdf_preamble': '', + 'motion_create_new_version': 'ALLWASY_CREATE_NEW_VERSION', + 'motion_workflow': 'default'}.get(key) diff --git a/openslides/motion/slides.py b/openslides/motion/slides.py new file mode 100644 index 000000000..e269dc243 --- /dev/null +++ b/openslides/motion/slides.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.motion.slides + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Defines the Slides for the motion app. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +from openslides.projector.api import register_slidemodel +from .models import Motion + +register_slidemodel(Motion) diff --git a/openslides/motion/templates/motion/base_motion.html b/openslides/motion/templates/motion/base_motion.html deleted file mode 100644 index 0dc5846a6..000000000 --- a/openslides/motion/templates/motion/base_motion.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block submenu %} - {% url 'motion_overview' as url_motionoverview %} -

    {% trans "Motions" %}

    - - - {# second submenu #} - {% if motion %} -
    -

    {% trans "Motion No." %} - {% if motion.number != None %} - {{ motion.number }} - {% else %} - [-] - {% endif %} -

    - - {% endif %} -{% endblock %} diff --git a/openslides/motion/templates/motion/config.html b/openslides/motion/templates/motion/config.html index 42e064444..b36f60a68 100644 --- a/openslides/motion/templates/motion/config.html +++ b/openslides/motion/templates/motion/config.html @@ -5,18 +5,19 @@ {% block title %}{{ block.super }} – {% trans "Motion settings" %}{% endblock %} {% block content %} -

    {% trans "Motion settings" %}

    +

    + {% trans "Configuration" %} + {% trans "Motions" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

    {% csrf_token %} - {{ form.as_p }} -

    - - - - -

    + {% include "form.html" %} +

    + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %} + +

    + * {% trans "required" %}
    {% endblock %} diff --git a/openslides/motion/templates/motion/edit.html b/openslides/motion/templates/motion/edit.html deleted file mode 100644 index 7c5f09ed4..000000000 --- a/openslides/motion/templates/motion/edit.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load i18n %} - -{% block title %} - {{ block.super }} – - {% if motion %} - {% trans "Edit motion" %} - {% else %} - {% trans "New motion" %} - {% endif %} -{% endblock %} - -{% block content %} - {% if motion %} -

    {% trans "Edit motion" %}

    - {% else %} -

    {% trans "New motion" %}

    - {% endif %} - -
    {% csrf_token %} - {{ form.as_p }} - {{ managerform.as_p }} -

    - - - - - -

    - * {% trans "required" %} -
    - -{% endblock %} diff --git a/openslides/motion/templates/motion/import.html b/openslides/motion/templates/motion/import.html deleted file mode 100644 index 8a0d8eab1..000000000 --- a/openslides/motion/templates/motion/import.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load i18n %} - -{% block title %}{{ block.super }} – {% trans "Import motions" %} {% endblock %} - -{% block content %} -

    {% trans "Import motions" %}

    -

    {% trans 'Select a CSV file to import motions!' %}

    - -

    {% trans 'Required comma separated values' %}: - ({% trans 'number, title, text, reason, first_name, last_name, is_group' %}) -
    - {% trans 'number, reason and is_group are optional and may be empty' %}. -
    - {% trans 'Required CSV file encoding: UTF-8 (Unicode).' %} -

    - -

    {% trans 'A CSV example file is available in OpenSlides Wiki.' %} -

    - -
    {% csrf_token %} - {{ form.as_p }} -

    - - - - -

    - * {% trans "required" %} -
    -{% endblock %} diff --git a/openslides/motion/templates/motion/motion_detail.html b/openslides/motion/templates/motion/motion_detail.html new file mode 100644 index 000000000..dcafd3878 --- /dev/null +++ b/openslides/motion/templates/motion/motion_detail.html @@ -0,0 +1,100 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} +{% load staticfiles %} + +{% block title %}{{ block.super }} – {% trans "Motion" %} "{{ motion.title }}"{% endblock %} + +{% block content %} +

    Titel: {{ motion.title }}

    +

    Text: {{ motion.text }}

    +

    Reason: {{ motion.reason }}

    +

    Submitter: {% for submitter in motion.submitter.all %}{{ submitter.person }} {% endfor %}

    +

    Supporter: {% for supporter in motion.supporter.all %}{{ supporter.person }} {% endfor %}

    +

    Active Version: {{ motion.active_version }}

    +

    State: {{ motion.state }}

    +

    possible stats:

    + + + +

    Versions

    +
      +{% for motion_version in motion.versions.all %} +
    1. + {% if motion_version.id == motion.version.id %} + {{ motion_version }} + {% else %} + {{ motion_version }} + {% endif %} + {% if motion_version.active %} + (active) + {% endif %} + {% if motion_version.rejected %} + (rejected) + {% endif %} +
    2. +{% endfor %} +
    + + +

    {% trans "Vote results" %}:

    + {% with motion.polls.all as polls %} +
      + {% for poll in polls %} + {% if perms.motion.can_manage_motion or poll.has_votes %} +
    • + {% if perms.motion.can_manage_motion %} + {{ forloop.counter }}. {% trans "Vote" %} + + + + + + + {% elif poll.has_votes %} + {{ forloop.counter }}. {% trans "Vote" %}: + {% endif %} +
      + {% if poll.has_votes %} + {% with poll.get_options.0 as option %} + {{ option.Yes }}
      + {{ option.No }}
      + {{ option.Abstain }}
      + {{ poll.print_votesinvalid }}
      +
      + {{ poll.print_votescast }} +
      + {% endwith %} + {% else %} + {% if perms.motion.can_manage_motion %} + + {% trans 'Enter result' %} + + {% endif %} + {% endif %} +
    • + {% endif %} + {% endfor %} +
    + {% if allowed_actions.create_poll %} + + {% trans 'New vote' %} + + {% endif %} + {% endwith %} + + +

    log

    +
      + {% for message in motion.log_messages.all %} +
    • {{ message }}
    • + {% endfor %} +
    + +{% endblock %} diff --git a/openslides/motion/templates/motion/motion_form.html b/openslides/motion/templates/motion/motion_form.html new file mode 100644 index 000000000..ddffb8254 --- /dev/null +++ b/openslides/motion/templates/motion/motion_form.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} +{% load staticfiles %} + +{% block title %}{{ block.super }} – {% trans "Motion Form" %}{% endblock %} + +{% block content %} +

    {% trans "Motions Forms" %}

    +
    {% csrf_token %} + {{ form.as_p }} + + + + + + * {% trans "required" %} +
    +{% endblock %} diff --git a/openslides/motion/templates/motion/motion_list.html b/openslides/motion/templates/motion/motion_list.html new file mode 100644 index 000000000..9cb2e5506 --- /dev/null +++ b/openslides/motion/templates/motion/motion_list.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} +{% load staticfiles %} + +{% block title %}{{ block.super }} – {% trans "Motions" %}{% endblock %} + +{% block content %} +

    {% trans "Motions" %}

    +
      + {% for motion in motion_list %} +
    1. {{ motion }}
    2. + {% endfor %} +
    +{% endblock %} diff --git a/openslides/motion/templates/motion/overview.html b/openslides/motion/templates/motion/overview.html deleted file mode 100644 index e11c6f2b5..000000000 --- a/openslides/motion/templates/motion/overview.html +++ /dev/null @@ -1,88 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block title %}{{ block.super }} – {% trans "Motions" %}{% endblock %} - -{% block content %} -

    {% trans "Motions" %}

    -

    - {% trans "Filter" %}: - {% if min_supporters > 0 %} - {% trans "Need supporters" %}   - {% endif %} - {% trans "Without number" %}   - {% trans "Status" %}: - -
    -

    - {{ motions|length }} - {% blocktrans count counter=motions|length context "number of motions"%}motion{% plural %}motions{% endblocktrans %} - - - - - {% if min_supporters > 0 %} - - {% endif %} - - - - - - {% for app_info in motions %} - {% with motion=app_info.motion useractions=app_info.actions %} - - - - {% if min_supporters > 0 %} - - {% endif %} - - - - - - {% endwith %} - {% empty %} - - - - {% endfor %} -
    {% trans "Number" %}{% trans "Motion title" %}{% trans "Number of supporters" %}{% trans "Status" %}{% trans "Submitter" %}{% trans "Creation Time" %}{% trans "Actions" %}
    {% if motion.number %}{{ motion.number }}{% else %}-{% endif %}{{ motion.public_version.title }}{{ motion.count_supporters }}{% if motion.status != "pub" %} - {{ motion.get_status_display }}
    - {% endif %} - {% for note in motion.notes %} - {{ note }} - {% if not forloop.last %}
    {%endif%} - {% endfor %} -
    {{ motion.submitter }}{{ motion.creation_time }} - - {% if perms.projector.can_manage_projector %} - - - - {% endif %} - {% if perms.motion.can_manage_motion %} - - {% if "delete" in useractions %} - - {% endif %} - {% endif %} - - -
    {% trans "No motions available." %}
    -{% endblock %} diff --git a/openslides/motion/templates/motion/poll_form.html b/openslides/motion/templates/motion/poll_form.html new file mode 100644 index 000000000..f7cd3635a --- /dev/null +++ b/openslides/motion/templates/motion/poll_form.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} + +{% load i18n %} +{% load staticfiles %} +{% load tags %} + +{% block content %} +

    {{ motion }}

    + {% trans "Special values" %}: -1 = {% trans 'majority' %}; -2 = {% trans 'undocumented' %} +
    {% csrf_token %} + {{ pre_form }} + + + + + + + {% for value in forms.0 %} + + + + + {% endfor %} + + + + + + + + +
    {% trans "Option" %}{% trans "Votes" %}
    {{ value.label }}{{ value.errors }}{{ value }}
    {% trans "Invalid votes" %}{{ pollform.votesinvalid.errors }}{{ pollform.votesinvalid }}
    {% trans "Votes cast" %}{{ pollform.votescast.errors }}{{ pollform.votescast }}
    + + {{ post_form }} + +

    + + + + {% trans 'Cancel' %} + +

    +
    +{% endblock %} diff --git a/openslides/motion/templates/motion/poll_view.html b/openslides/motion/templates/motion/poll_view.html deleted file mode 100644 index 9894cd51e..000000000 --- a/openslides/motion/templates/motion/poll_view.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends 'motion/base_motion.html' %} - -{% load i18n %} -{% load staticfiles %} - -{% block title %} - {{ block.super }} – {% trans "Motion" %} "{{ motion.public_version.title }}" - – {{ ballot }}. {% trans "Vote" %} -{% endblock %} - -{% block content %} -

    {{ motion.public_version.title }} ({% trans "Motion" %} - {{ motion.number }}) – {{ ballot }}. {% trans "Vote" %}

    - {% trans "Special values" %}: -1 = {% trans 'majority' %}; -2 = {% trans 'undocumented' %} -
    {% csrf_token %} - {{ pre_form }} - - - - - - - - {% for value in forms.0 %} - - - - - {% endfor %} - - - - - - - - -
    {% trans "Option" %}{% trans "Votes" %}
    {{ value.label }}{{ value.errors }}{{ value }}
    {% trans "Invalid votes" %}{{ pollform.votesinvalid.errors }}{{ pollform.votesinvalid }}
    {% trans "Votes cast" %}{{ pollform.votescast.errors }}{{ pollform.votescast }}
    - - {{ post_form }} - -

    - - - -

    - -

    - - - - - -

    -
    -{% endblock %} diff --git a/openslides/motion/templates/motion/view.html b/openslides/motion/templates/motion/view.html deleted file mode 100644 index 18d61fa3d..000000000 --- a/openslides/motion/templates/motion/view.html +++ /dev/null @@ -1,303 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block title %}{{ block.super }} – {% trans "Motion" %} "{{ version.title }}"{% endblock %} - - -{% block submenu %} - {{ block.super }} - -{% endblock %} - -{% block content %} - - - -
    -

    - {{ version.title }} - ({% trans "Motion" %} - {% if motion.number != None %} - {{ motion.number }}) - {% else %} - [{% trans "no number" %}]) - {% endif %} -

    - - {% trans "Version" %} {{ version.aid }} - - {% if motion.public_version != motion.last_version %} - ⋅ - {% if version == motion.public_version %} - {% trans "This is not the newest version." %} {% trans "Go to version" %} {{ motion.last_version.aid }}. - {% else %} - {% trans "This is not the authorized version." %} {% trans "Go to version" %} {{ motion.public_version.aid }}. - {% endif %} - {% endif %} - -

    {% trans "Motion" %}:

    - - {{ version.text|linebreaks }} - -

    {% trans "Reason" %}:

    - - {% if version.reason %} - {{ version.reason|linebreaks }} - {% else %} - – - {% endif %} - - - {% if motion.versions|length > 1 %} -

    {% trans "Version History" %}:

    - - - - - - - - - - - - {% for revision in motion.versions %} - - - - - - - - - {% endfor %} -
    {% trans "Version" %}{% trans "Time" %}{% trans "Title" %}{% trans "Text" %}{% trans "Reason" %}
    - {% if motion.status != "pub" %} - {% if revision == motion.permitted %} - - {% else %} - {% if perms.motion.can_manage_motion %} - - {% endif %} - {% if not revision.rejected and revision.id > motion.permitted.id and perms.motion.can_manage_motion %} - - {% endif %} - {% endif %} - {% if revision.rejected %} - - {% endif %} - {% endif %} - {{ revision.aid }}{{ revision.time }} - {% ifchanged %} - {{ revision.title }} - {% else %} - [{% trans "unchanged" %}] - {% endifchanged %} - - {% ifchanged %} - {{ revision.text|linebreaks }} - {% else %} - [{% trans "unchanged" %}] - {% endifchanged %} - - {% ifchanged %} - {{ revision.reason|linebreaks }} - {% else %} - [{% trans "unchanged" %}] - {% endifchanged %} -
    - {% endif %} - - {% if perms.motion.can_manage_motion %} -

    {% trans "Log" %}:

    - {{ motion.log|linebreaks }} - {% endif %} -
    -{% endblock %} diff --git a/openslides/motion/templates/motion/widget.html b/openslides/motion/templates/motion/widget.html index c0796de89..37302db51 100644 --- a/openslides/motion/templates/motion/widget.html +++ b/openslides/motion/templates/motion/widget.html @@ -1,21 +1,17 @@ -{% load staticfiles %} {% load i18n %} {% load tags %}
      {% for motion in motions %}
    • - -
      +
      + +   + + - - - - - - - - + + {{ motion.public_version.title }} diff --git a/openslides/motion/templates/projector/Motion.html b/openslides/motion/templates/projector/Motion.html index ab094313f..8d2e6699e 100644 --- a/openslides/motion/templates/projector/Motion.html +++ b/openslides/motion/templates/projector/Motion.html @@ -11,15 +11,15 @@

      {% trans "Status" %}:
      {% if motion.status != "pub" %} {% if motion.status == "acc" %} - + {% endif %} {% if motion.status == "rej" %} - + {% endif %} - {% trans motion.get_status_display %} + {% trans motion.status %} {% else %} {% for note in motion.notes %} - {{ note }} + {{ note }} {% endfor %} {% endif %}

      @@ -34,12 +34,12 @@ {% endif %} {% with poll.get_options.0 as option %}
      - {{ option.Yes }}
      - {{ option.No }}
      - {{ option.Abstain }}
      - {{ poll.print_votesinvalid }}
      + {{ option.Yes }}
      + {{ option.No }}
      + {{ option.Abstain }}
      + {{ poll.print_votesinvalid }}

      - {{ poll.print_votescast }} + {{ poll.print_votescast }}
      {% endwith %} {% else %} @@ -53,7 +53,7 @@ {% endwith %}

      {% trans "Submitter" %}:
      - {{ motion.submitter }} + {{ motion.submitter.person }}

      @@ -65,7 +65,7 @@ {% trans "Motion" %} [{% trans "no number" %}] {% endif %} - {{ motion.public_version.title }} + {{ motion.title }}
      {% endblock %} diff --git a/openslides/motion/urls.py b/openslides/motion/urls.py index 177a5b04f..8ff7c0d33 100644 --- a/openslides/motion/urls.py +++ b/openslides/motion/urls.py @@ -2,140 +2,104 @@ # -*- coding: utf-8 -*- """ openslides.motion.urls - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~ - URL list for the motion app. + Defines the URL patterns for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import url, patterns - -from openslides.motion.views import (MotionDelete, ViewPoll, - MotionPDF, MotionPollPDF, CreateAgendaItem, SupportView) +from django.conf.urls import url, patterns urlpatterns = patterns('openslides.motion.views', url(r'^$', - 'overview', - name='motion_overview', + 'motion_list', + name='motion_list', ), - url(r'^(?P\d+)/$', - 'view', - name='motion_view', - ), - - url(r'^(?P\d+)/agenda/$', - CreateAgendaItem.as_view(), - name='motion_create_agenda', - ), - - url(r'^(?P\d+)/newest/$', - 'view', - {'newest': True}, - name='motion_view_newest', - ), - - url(r'^new/$', - 'edit', + url(r'^create/$', + 'motion_create', name='motion_new', ), - url(r'^import/$', - 'motion_import', - name='motion_import', + url(r'^(?P\d+)/$', + 'motion_detail', + name='motion_detail', ), - url(r'^(?P\d+)/edit/$', - 'edit', + url(r'^(?P\d+)/edit/$', + 'motion_edit', name='motion_edit', ), - url(r'^(?P\d+)/del/$', - MotionDelete.as_view(), + url(r'^(?P\d+)/del/$', + 'motion_delete', name='motion_delete', ), - url(r'^del/$', - MotionDelete.as_view(), - { 'motion_id' : None , 'motion_ids' : None }, - name='motion_delete', + url(r'^(?P\d+)/version/(?P\d+)/$', + 'motion_detail', + name='motion_version_detail', ), - url(r'^(?P\d+)/setnumber/$', - 'set_number', - name='motion_set_number', - ), - - url(r'^(?P\d+)/setstatus/(?P[a-z]{3})/$', - 'set_status', - name='motion_set_status', - ), - - url(r'^(?P\d+)/permit/$', - 'permit', - name='motion_permit', - ), - - url(r'^version/(?P\d+)/permit/$', - 'permit_version', + url(r'^(?P\d+)/version/(?P\d+)/permit/$', + 'version_permit', name='motion_version_permit', ), - url(r'^version/(?P\d+)/reject/$', - 'reject_version', + url(r'^(?P\d+)/version/(?P\d+)/reject/$', + 'version_reject', name='motion_version_reject', ), - url(r'^(?P\d+)/notpermit/$', - 'notpermit', - name='motion_notpermit', - ), - - url(r'^(?P\d+)/reset/$', - 'reset', - name='motion_reset', - ), - - url(r'^(?P\d+)/support/$', - SupportView.as_view(support=True), + url(r'^(?P\d+)/support/$', + 'motion_support', name='motion_support', ), - url(r'^(?P\d+)/unsupport/$', - SupportView.as_view(support=False), + url(r'^(?P\d+)/unsupport/$', + 'motion_unsupport', name='motion_unsupport', ), - url(r'^(?P\d+)/gen_poll/$', - 'gen_poll', - name='motion_gen_poll', + url(r'^(?P\d+)/create_poll/$', + 'poll_create', + name='motion_poll_create', ), - url(r'^print/$', - MotionPDF.as_view(), - {'motion_id': None}, - name='print_motions', + url(r'^(?P\d+)/poll/(?P\d+)/edit/$', + 'poll_edit', + name='motion_poll_edit', ), - url(r'^(?P\d+)/print/$', - MotionPDF.as_view(), - name='print_motion', - ), - - url(r'^poll/(?P\d+)/print/$', - MotionPollPDF.as_view(), - name='print_motion_poll', - ), - - url(r'^poll/(?P\d+)/$', - ViewPoll.as_view(), - name='motion_poll_view', - ), - - url(r'^poll/(?P\d+)/del/$', - 'delete_poll', + url(r'^(?P\d+)/poll/(?P\d+)/del/$', + 'poll_delete', name='motion_poll_delete', ), + + url(r'^(?P\d+)/set_state/(?P[a-z]{3})/$', + 'set_state', + name='motion_set_state', + ), + + url(r'^(?P\d+)/reset_state/$', + 'reset_state', + name='motion_reset_state', + ), + + url(r'^(?P\d+)/agenda/$', + 'create_agenda_item', + name='motion_create_agenda', + ), + + url(r'^pdf/$', + 'motion_list_pdf', + name='motion_list_pdf', + ), + + url(r'^(?P\d+)/pdf/$', + 'motion_detail_pdf', + name='motion_detail_pdf', + ), ) diff --git a/openslides/motion/views.py b/openslides/motion/views.py index deff7eaef..9f26faec1 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -2,911 +2,479 @@ # -*- coding: utf-8 -*- """ openslides.motion.views - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~ Views for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + Will automaticly imported from openslides.motion.urls.py + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ -import csv -import os - -from urlparse import parse_qs - -from reportlab.lib import colors -from reportlab.lib.units import cm -from reportlab.platypus import ( - SimpleDocTemplate, PageBreak, Paragraph, Spacer, Table, TableStyle) - -from django.conf import settings -from django.contrib import messages -from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse +from django.contrib import messages from django.db import transaction -from django.shortcuts import redirect -from django.utils.translation import ugettext as _, ungettext +from django.db.models import Model +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop +from django.views.generic.detail import SingleObjectMixin +from django.http import Http404 -from openslides.utils import csv_ext from openslides.utils.pdf import stylesheet -from openslides.utils.template import Tab -from openslides.utils.utils import ( - template, permission_required, del_confirm_form, gen_confirm_form) from openslides.utils.views import ( - PDFView, RedirectView, DeleteView, FormView, SingleObjectMixin, - QuestionMixin) -from openslides.utils.person import get_person -from openslides.config.models import config -from openslides.projector.projector import Widget + TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView, + DetailView, ListView, FormView, QuestionMixin, SingleObjectMixin) +from openslides.utils.template import Tab +from openslides.utils.utils import html_strong from openslides.poll.views import PollFormView -from openslides.participant.api import gen_username, gen_password -from openslides.participant.models import User, Group +from openslides.projector.api import get_active_slide +from openslides.projector.projector import Widget, SLIDE +from openslides.config.models import config from openslides.agenda.models import Item -from openslides.motion.models import Motion, AVersion, MotionPoll -from openslides.motion.forms import ( - MotionForm, MotionFormTrivialChanges, MotionManagerForm, - MotionManagerFormSupporter, MotionImportForm, ConfigForm) + +from .models import Motion, MotionSubmitter, MotionSupporter, MotionPoll, MotionVersion +from .forms import (BaseMotionForm, MotionSubmitterMixin, MotionSupporterMixin, + MotionCreateNewVersionMixin, ConfigForm) +from .workflow import WorkflowError +from .pdf import motions_to_pdf, motion_to_pdf -@permission_required('motion.can_see_motion') -@template('motion/overview.html') -def overview(request): - """ - View all motions - """ - try: - sortfilter = parse_qs(request.COOKIES['votecollector_sortfilter']) - for value in sortfilter: - sortfilter[value] = sortfilter[value][0] - except KeyError: - sortfilter = {} +class MotionListView(ListView): + """View, to list all motions.""" + permission_required = 'motion.can_see_motion' + model = Motion - for value in [u'sort', u'reverse', u'number', u'status', u'needsup', u'statusvalue']: - if value in request.REQUEST: - if request.REQUEST[value] == '0': - try: - del sortfilter[value] - except KeyError: - pass - else: - sortfilter[value] = request.REQUEST[value] - - query = Motion.objects.all() - if 'number' in sortfilter: - query = query.filter(number=None) - if 'status' in sortfilter: - if 'statusvalue' in sortfilter and 'on' in sortfilter['status']: - query = query.filter(status__iexact=sortfilter['statusvalue']) - - if 'sort' in sortfilter: - if sortfilter['sort'] == 'title': - sort = 'aversion__title' - elif sortfilter['sort'] == 'time': - sort = 'aversion__time' - else: - sort = sortfilter['sort'] - query = query.order_by(sort) - if sort.startswith('aversion_'): - # limit result to last version of an motion - query = query.filter(aversion__id__in=[x.last_version.id for x in Motion.objects.all()]) - - if 'reverse' in sortfilter: - query = query.reverse() - - # todo: rewrite this with a .filter() - if 'needsup' in sortfilter: - motions = [] - for motion in query.all(): - if not motion.enough_supporters: - motions.append(motion) - else: - motions = query - - if type(motions) is not list: - motions = list(query.all()) - - # not the most efficient way to do this but 'get_allowed_actions' - # is not callable from within djangos templates.. - for (i, motion) in enumerate(motions): - try: - motions[i] = { - 'actions': motion.get_allowed_actions(request.user), - 'motion': motion - } - except: - # todo: except what? - motions[i] = { - 'actions': [], - 'motion': motion - } - - return { - 'motions': motions, - 'min_supporters': int(config['motion_min_supporters']), - } +motion_list = MotionListView.as_view() -@permission_required('motion.can_see_motion') -@template('motion/view.html') -def view(request, motion_id, newest=False): - """ - View one motion. - """ - motion = Motion.objects.get(pk=motion_id) - if newest: - version = motion.last_version - else: - version = motion.public_version - revisions = motion.versions - actions = motion.get_allowed_actions(user=request.user) - - return { - 'motion': motion, - 'revisions': revisions, - 'actions': actions, - 'min_supporters': int(config['motion_min_supporters']), - 'version': version, - #'results': motion.results - } - - -@login_required -@template('motion/edit.html') -def edit(request, motion_id=None): - """ - View a form to edit or create a motion. - """ - if request.user.has_perm('motion.can_manage_motion'): - is_manager = True - else: - is_manager = False - - if not is_manager \ - and not request.user.has_perm('motion.can_create_motion'): - messages.error(request, _("You have not the necessary rights to create or edit motions.")) - return redirect(reverse('motion_overview')) - if motion_id is not None: - motion = Motion.objects.get(id=motion_id) - if not 'edit' in motion.get_allowed_actions(request.user): - messages.error(request, _("You can not edit this motion.")) - return redirect(reverse('motion_view', args=[motion.id])) - actions = motion.get_allowed_actions(user=request.user) - else: - motion = None - actions = None - - formclass = MotionFormTrivialChanges \ - if config['motion_allow_trivial_change'] and motion_id \ - else MotionForm - - managerformclass = MotionManagerFormSupporter \ - if config['motion_min_supporters'] \ - else MotionManagerForm - - if request.method == 'POST': - dataform = formclass(request.POST, prefix="data") - valid = dataform.is_valid() - - if is_manager: - managerform = managerformclass(request.POST, - instance=motion, - prefix="manager") - valid = valid and managerform.is_valid() - else: - managerform = None - - if valid: - if is_manager: - motion = managerform.save(commit=False) - elif motion_id is None: - motion = Motion(submitter=request.user) - motion.title = dataform.cleaned_data['title'] - motion.text = dataform.cleaned_data['text'] - motion.reason = dataform.cleaned_data['reason'] +class GetVersionMixin(object): + """Mixin to set a specific version to a motion.""" + def get_object(self): + """Return a Motion object. The id is taken from the url and the version + is set to the version with the 'version_number' from the URL.""" + object = super(GetVersionMixin, self).get_object() + version_number = self.kwargs.get('version_number', None) + if version_number is not None: try: - trivial_change = config['motion_allow_trivial_change'] \ - and dataform.cleaned_data['trivial_change'] - except KeyError: - trivial_change = False - motion.save(request.user, trivial_change=trivial_change) - if is_manager: - try: - new_supporters = set(managerform.cleaned_data['supporter']) - except KeyError: - # The managerform has no field for the supporters - pass - else: - old_supporters = set(motion.supporters) - # add new supporters - for supporter in new_supporters.difference(old_supporters): - motion.support(supporter) - # remove old supporters - for supporter in old_supporters.difference(new_supporters): - motion.unsupport(supporter) - - if motion_id is None: - messages.success(request, _('New motion was successfully created.')) - else: - messages.success(request, _('Motion was successfully modified.')) - - if not 'apply' in request.POST: - return redirect(reverse('motion_view', args=[motion.id])) - if motion_id is None: - return redirect(reverse('motion_edit', args=[motion.id])) - else: - messages.error(request, _('Please check the form for errors.')) - else: - if motion_id is None: - initial = {'text': config['motion_preamble']} - else: - if motion.status == "pub" and motion.supporters: - if request.user.has_perm('motion.can_manage_motion'): - messages.warning(request, _("Attention: Do you really want to edit this motion? The supporters will not be removed automatically because you can manage motions. Please check if the supports are valid after your changing!")) - else: - messages.warning(request, _("Attention: Do you really want to edit this motion? All %s supporters will be removed! Try to convince the supporters again.") % motion.count_supporters() ) - initial = {'title': motion.title, - 'text': motion.text, - 'reason': motion.reason} - - dataform = formclass(initial=initial, prefix="data") - if is_manager: - if motion_id is None: - initial = {'submitter': request.user.person_id} - else: - initial = {'submitter': motion.submitter.person_id, - 'supporter': [supporter.person_id for supporter in motion.supporters]} - managerform = managerformclass(initial=initial, - instance=motion, prefix="manager") - else: - managerform = None - return { - 'form': dataform, - 'managerform': managerform, - 'motion': motion, - 'actions': actions, - } + object.version = int(version_number) + except MotionVersion.DoesNotExist: + raise Http404('Version %s not found' % version_number) + return object -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def set_number(request, motion_id): - """ - set a number for an motion. - """ - try: - Motion.objects.get(pk=motion_id).set_number(user=request.user) - messages.success(request, _("Motion number was successfully set.")) - except Motion.DoesNotExist: - pass - except NameError: - pass - return redirect(reverse('motion_view', args=[motion_id])) +class MotionDetailView(GetVersionMixin, DetailView): + """Show one motion.""" + permission_required = 'motion.can_see_motion' + model = Motion + + def get_context_data(self, **kwargs): + """Return the template context. + + Append the allowed actions for the motion to the context. + """ + context = super(MotionDetailView, self).get_context_data(**kwargs) + context['allowed_actions'] = self.object.get_allowed_actions(self.request.user) + return context + +motion_detail = MotionDetailView.as_view() -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def permit(request, motion_id): - """ - permit an motion. - """ - try: - Motion.objects.get(pk=motion_id).permit(user=request.user) - messages.success(request, _("Motion was successfully authorized.")) - except Motion.DoesNotExist: - pass - except NameError, e: - messages.error(request, e) - return redirect(reverse('motion_view', args=[motion_id])) +class MotionMixin(object): + """Mixin for MotionViewsClasses, to save the version data.""" -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def notpermit(request, motion_id): - """ - reject (not permit) an motion. - """ - try: - Motion.objects.get(pk=motion_id).notpermit(user=request.user) - messages.success(request, _("Motion was successfully rejected.")) - except Motion.DoesNotExist: - pass - except NameError, e: - messages.error(request, e) - return redirect(reverse('motion_view', args=[motion_id])) + def manipulate_object(self, form): + """Save the version data into the motion object before it is saved in + the Database.""" -@template('motion/view.html') -def set_status(request, motion_id=None, status=None): - """ - set a status of an motion. - """ - try: - if status is not None: - motion = Motion.objects.get(pk=motion_id) - motion.set_status(user=request.user, status=status) - messages.success(request, _("Motion status was set to: %s.") % motion.get_status_display()) - except Motion.DoesNotExist: - pass - except NameError, e: - messages.error(request, e) - return redirect(reverse('motion_view', args=[motion_id])) + super(MotionMixin, self).manipulate_object(form) + for attr in ['title', 'text', 'reason']: + setattr(self.object, attr, form.cleaned_data[attr]) + + try: + if form.cleaned_data['new_version']: + self.object.new_version + except KeyError: + pass + + def post_save(self, form): + """Save the submitter an the supporter so the motion.""" + super(MotionMixin, self).post_save(form) + # TODO: only delete and save neccessary submitters and supporter + if 'submitter' in form.cleaned_data: + self.object.submitter.all().delete() + MotionSubmitter.objects.bulk_create( + [MotionSubmitter(motion=self.object, person=person) + for person in form.cleaned_data['submitter']]) + if 'supporter' in form.cleaned_data: + self.object.supporter.all().delete() + MotionSupporter.objects.bulk_create( + [MotionSupporter(motion=self.object, person=person) + for person in form.cleaned_data['supporter']]) + + def get_form_class(self): + """Return the FormClass to Create or Update the Motion. + + forms.BaseMotionForm is the base for the Class, and some FormMixins + will be mixed in dependence of some config values. See motion.forms + for more information on the mixins. + """ + + form_classes = [BaseMotionForm] + if self.request.user.has_perm('motion.can_manage_motion'): + form_classes.append(MotionSubmitterMixin) + if config['motion_min_supporters'] > 0: + form_classes.append(MotionSupporterMixin) + if config['motion_create_new_version'] == 'ASK_USER': + form_classes.append(MotionCreateNewVersionMixin) + return type('MotionForm', tuple(form_classes), {}) -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def reset(request, motion_id): - """ - reset an motion. - """ - try: - Motion.objects.get(pk=motion_id).reset(user=request.user) - messages.success(request, _("Motion status was reset.") ) - except Motion.DoesNotExist: - pass - return redirect(reverse('motion_view', args=[motion_id])) +class MotionCreateView(MotionMixin, CreateView): + """View to create a motion.""" + permission_required = 'motion.can_create_motion' + model = Motion + + def form_valid(self, form): + """Write a log message, if the form is valid.""" + value = super(MotionCreateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Motion created'), self.request.user) + return value + +motion_create = MotionCreateView.as_view() + + +class MotionUpdateView(MotionMixin, UpdateView): + """View to update a motion.""" + model = Motion + + def has_permission(self, request, *args, **kwargs): + """Check, if the request.user has the permission to edit the motion.""" + return self.get_object().get_allowed_actions(request.user)['edit'] + + def form_valid(self, form): + """Write a log message, if the form is valid.""" + value = super(MotionUpdateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Motion updated'), self.request.user) + return value + +motion_edit = MotionUpdateView.as_view() + + +class MotionDeleteView(DeleteView): + """View to delete a motion.""" + model = Motion + success_url_name = 'motion_list' + + def has_permission(self, request, *args, **kwargs): + """Check if the request.user has the permission to delete the motion.""" + return self.get_object().get_allowed_actions(request.user)['delete'] + +motion_delete = MotionDeleteView.as_view() + + +class VersionPermitView(GetVersionMixin, SingleObjectMixin, QuestionMixin, RedirectView): + """View to permit a version of a motion.""" + + model = Motion + question_url_name = 'motion_version_detail' + success_url_name = 'motion_version_detail' + + def get(self, *args, **kwargs): + """Set self.object to a motion.""" + self.object = self.get_object() + return super(VersionPermitView, self).get(*args, **kwargs) + + def get_url_name_args(self): + """Return a list with arguments to create the success- and question_url.""" + return [self.object.pk, self.object.version.version_number] + + def get_question(self): + """Return a string, shown to the user as question to permit the version.""" + return _('Are you sure you want permit Version %s?') % self.object.version.version_number + + def case_yes(self): + """Activate the version, if the user chooses 'yes'.""" + self.object.activate_version(self.object.version) + self.object.save() + +version_permit = VersionPermitView.as_view() + + +class VersionRejectView(GetVersionMixin, SingleObjectMixin, QuestionMixin, RedirectView): + """View to reject a version.""" + model = Motion + question_url_name = 'motion_version_detail' + success_url_name = 'motion_version_detail' + + def get(self, *args, **kwargs): + """Set self.object to a motion.""" + self.object = self.get_object() + return super(VersionRejectView, self).get(*args, **kwargs) + + def get_url_name_args(self): + """Return a list with arguments to create the success- and question_url.""" + return [self.object.pk, self.object.version.version_number] + + def get_question(self): + return _('Are you sure you want reject Version %s?') % self.object.version.version_number + + def case_yes(self): + """Reject the version, if the user chooses 'yes'.""" + self.object.reject_version(self.object.version) + self.object.save() + +version_reject = VersionRejectView.as_view() class SupportView(SingleObjectMixin, QuestionMixin, RedirectView): + """View to support or unsupport a motion. + + If self.support is True, the view will append a request.user to the supporter list. + + If self.support is False, the view will remove a request.user from the supporter list. """ - Classed based view to support or unsupport a motion. Use - support=True or support=False in urls.py - """ + permission_required = 'motion.can_support_motion' model = Motion - pk_url_kwarg = 'motion_id' support = True def get(self, request, *args, **kwargs): + """Set self.object to a motion.""" self.object = self.get_object() return super(SupportView, self).get(request, *args, **kwargs) - def check_allowed_actions(self, request): - """ - Checks whether request.user can support or unsupport the motion. - Returns True or False. - """ + def check_permission(self, request): + """Return True if the user can support or unsupport the motion. Else: False.""" + allowed_actions = self.object.get_allowed_actions(request.user) - if self.support and not 'support' in allowed_actions: + if self.support and not allowed_actions['support']: messages.error(request, _('You can not support this motion.')) return False - elif not self.support and not 'unsupport' in allowed_actions: + elif not self.support and not allowed_actions['unsupport']: messages.error(request, _('You can not unsupport this motion.')) return False else: return True - def pre_redirect(self, request, *args, **kwargs): - if self.check_allowed_actions(request): - super(SupportView, self).pre_redirect(request, *args, **kwargs) - def get_question(self): + """Return the question string.""" if self.support: return _('Do you really want to support this motion?') else: return _('Do you really want to unsupport this motion?') def case_yes(self): - if self.check_allowed_actions(self.request): + """Append or remove the request.user from the motion. + + First the methode checks the permissions, and writes a log message after + appending or removing the user. + """ + if self.check_permission(self.request): + user = self.request.user if self.support: - self.object.support(person=self.request.user) + self.object.support(person=user) + self.object.write_log(ugettext_noop("Supporter: +%s") % user, user) else: - self.object.unsupport(person=self.request.user) + self.object.unsupport(person=user) + self.object.write_log(ugettext_noop("Supporter: -%s") % user, user) def get_success_message(self): + """Return the success message.""" if self.support: return _("You have supported this motion successfully.") else: return _("You have unsupported this motion successfully.") def get_redirect_url(self, **kwargs): - return reverse('motion_view', args=[kwargs[self.pk_url_kwarg]]) + """Return the url, the view should redirect to.""" + return self.object.get_absolute_url() + +motion_support = SupportView.as_view(support=True) +motion_unsupport = SupportView.as_view(support=False) -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def gen_poll(request, motion_id): - """ - gen a poll for this motion. - """ - try: - poll = Motion.objects.get(pk=motion_id).gen_poll(user=request.user) - messages.success(request, _("New vote was successfully created.") ) - except Motion.DoesNotExist: - pass # TODO: do not call poll after this excaption - return redirect(reverse('motion_poll_view', args=[poll.id])) - - -@permission_required('motion.can_manage_motion') -def delete_poll(request, poll_id): - """ - delete a poll from this motion - """ - poll = MotionPoll.objects.get(pk=poll_id) - motion = poll.motion - count = motion.polls.filter(id__lte=poll_id).count() - if request.method == 'POST': - poll.delete() - motion.writelog(_("Poll deleted"), request.user) - messages.success(request, _('Poll was successfully deleted.')) - else: - del_confirm_form(request, poll, name=_("the %s. poll") % count, delete_link=reverse('motion_poll_delete', args=[poll_id])) - return redirect(reverse('motion_view', args=[motion.id])) - - -class MotionDelete(DeleteView): - """ - Delete one or more Motions. - """ +class PollCreateView(SingleObjectMixin, RedirectView): + """View to create a poll for a motion.""" + permission_required = 'motion.can_manage_motion' model = Motion - url = 'motion_overview' - - def has_permission(self, request, *args, **kwargs): - self.kwargs = kwargs - return self.get_object().get_allowed_actions(request.user) - - def get_object(self): - self.motions = [] - - if self.kwargs.get('motion_id', None): - try: - return Motion.objects.get(id=int(self.kwargs['motion_id'])) - except Motion.DoesNotExist: - return None - - if self.kwargs.get('motion_ids', []): - for appid in self.kwargs['motion_ids']: - try: - self.motions.append(Motion.objects.get(id=int(appid))) - except Motion.DoesNotExist: - pass - - if self.motions: - return self.motions[0] - return None - - def pre_post_redirect(self, request, *args, **kwargs): - self.object = self.get_object() - - if len(self.motions): - for motion in self.motions: - if not 'delete' in motion.get_allowed_actions(user=request.user): - messages.error(request, _("You can not delete motion %s.") % motion) - continue - - title = motion.title - motion.delete(force=True) - messages.success(request, _("Motion %s was successfully deleted.") % title) - - elif self.object: - if not 'delete' in self.object.get_allowed_actions(user=request.user): - messages.error(request, _("You can not delete motion %s.") % self.object) - elif self.get_answer() == 'yes': - title = self.object.title - self.object.delete(force=True) - messages.success(request, _("Motion %s was successfully deleted.") % title) - else: - messages.error(request, _("Invalid request")) - - -class ViewPoll(PollFormView): - permission_required = 'motion.can_manage_motion' - poll_class = MotionPoll - template_name = 'motion/poll_view.html' - - def get_context_data(self, **kwargs): - context = super(ViewPoll, self).get_context_data(**kwargs) - self.motion = self.poll.get_motion() - context['motion'] = self.motion - context['ballot'] = self.poll.get_ballot() - context['actions'] = self.motion.get_allowed_actions(user=self.request.user) - return context - - def get_modelform_class(self): - cls = super(ViewPoll, self).get_modelform_class() - user = self.request.user - - class ViewPollFormClass(cls): - def save(self, commit = True): - instance = super(ViewPollFormClass, self).save(commit) - motion = instance.motion - motion.writelog(_("Poll was updated"), user) - return instance - - return ViewPollFormClass - - def get_success_url(self): - if not 'apply' in self.request.POST: - return reverse('motion_view', args=[self.poll.motion.id]) - return '' - - -@permission_required('motion.can_manage_motion') -def permit_version(request, aversion_id): - aversion = AVersion.objects.get(pk=aversion_id) - motion = aversion.motion - if request.method == 'POST': - motion.accept_version(aversion, user=request.user) - messages.success(request, _("Version %s accepted.") % (aversion.aid)) - else: - gen_confirm_form(request, _('Do you really want to authorize version %s?') % aversion.aid, reverse('motion_version_permit', args=[aversion.id])) - return redirect(reverse('motion_view', args=[motion.id])) - - -@permission_required('motion.can_manage_motion') -def reject_version(request, aversion_id): - aversion = AVersion.objects.get(pk=aversion_id) - motion = aversion.motion - if request.method == 'POST': - if motion.reject_version(aversion, user=request.user): - messages.success(request, _("Version %s rejected.") % (aversion.aid)) - else: - messages.error(request, _("ERROR by rejecting the version.") ) - else: - gen_confirm_form(request, _('Do you really want to reject version %s?') % aversion.aid, reverse('motion_version_reject', args=[aversion.id])) - return redirect(reverse('motion_view', args=[motion.id])) - - -@permission_required('motion.can_manage_motion') -@template('motion/import.html') -def motion_import(request): - if request.method == 'POST': - form = MotionImportForm(request.POST, request.FILES) - if form.is_valid(): - import_permitted = form.cleaned_data['import_permitted'] - try: - # check for valid encoding (will raise UnicodeDecodeError if not) - request.FILES['csvfile'].read().decode('utf-8') - request.FILES['csvfile'].seek(0) - - users_generated = 0 - motions_generated = 0 - motions_modified = 0 - groups_assigned = 0 - groups_generated = 0 - with transaction.commit_on_success(): - dialect = csv.Sniffer().sniff(request.FILES['csvfile'].readline()) - dialect = csv_ext.patchup(dialect) - request.FILES['csvfile'].seek(0) - for (lno, line) in enumerate(csv.reader(request.FILES['csvfile'], dialect=dialect)): - # basic input verification - if lno < 1: - continue - try: - (number, title, text, reason, first_name, last_name, is_group) = line[:7] - if is_group.strip().lower() in ['y', 'j', 't', 'yes', 'ja', 'true', '1', 1]: - is_group = True - else: - is_group = False - except ValueError: - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - form = MotionForm({'title': title, 'text': text, 'reason': reason}) - if not form.is_valid(): - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - if number: - try: - number = abs(long(number)) - if number < 1: - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - except ValueError: - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - - if is_group: - # fetch existing groups or issue an error message - try: - user = Group.objects.get(name=last_name) - if user.group_as_person == False: - messages.error(request, _('Ignoring line %d because the assigned group may not act as a person.') % (lno + 1)) - continue - else: - user = get_person(user.person_id) - - groups_assigned += 1 - except Group.DoesNotExist: - group = Group() - group.group_as_person = True - group.description = _('Created by motion import.') - group.name = last_name - group.save() - groups_generated += 1 - - user = get_person(group.person_id) - else: - # fetch existing users or create new users as needed - try: - user = User.objects.get(first_name=first_name, last_name=last_name) - except User.DoesNotExist: - user = None - if user is None: - if not first_name or not last_name: - messages.error(request, _('Ignoring line %d because it contains an incomplete first / last name pair.') % (lno + 1)) - continue - - user = User() - user.last_name = last_name - user.first_name = first_name - user.username = gen_username(first_name, last_name) - user.structure_level = '' - user.committee = '' - user.gender = '' - user.type = '' - user.default_password = gen_password() - user.save() - user.reset_password() - users_generated += 1 - # create / modify the motion - motion = None - if number: - try: - motion = Motion.objects.get(number=number) - motions_modified += 1 - except Motion.DoesNotExist: - motion = None - if motion is None: - motion = Motion(submitter=user) - if number: - motion.number = number - motions_generated += 1 - - motion.title = form.cleaned_data['title'] - motion.text = form.cleaned_data['text'] - motion.reason = form.cleaned_data['reason'] - if import_permitted: - motion.status = 'per' - - motion.save(user, trivial_change=True) - - if motions_generated: - messages.success(request, ungettext('%d motion was successfully imported.', - '%d motions were successfully imported.', motions_generated) % motions_generated) - if motions_modified: - messages.success(request, ungettext('%d motion was successfully modified.', - '%d motions were successfully modified.', motions_modified) % motions_modified) - if users_generated: - messages.success(request, ungettext('%d new user was added.', '%d new users were added.', users_generated) % users_generated) - - if groups_generated: - messages.success(request, ungettext('%d new group was added.', '%d new groups were added.', groups_generated) % groups_generated) - - if groups_assigned: - messages.success(request, ungettext('%d group assigned to motions.', '%d groups assigned to motions.', groups_assigned) % groups_assigned) - return redirect(reverse('motion_overview')) - - except csv.Error: - messages.error(request, _('Import aborted because of severe errors in the input file.')) - except UnicodeDecodeError: - messages.error(request, _('Import file has wrong character encoding, only UTF-8 is supported!')) - else: - messages.error(request, _('Please check the form for errors.')) - else: - messages.warning(request, _("Attention: Existing motions will be modified if you import new motions with the same number.")) - messages.warning(request, _("Attention: Importing an motions without a number multiple times will create duplicates.")) - form = MotionImportForm() - return { - 'form': form, - } - - -class CreateAgendaItem(RedirectView): - permission_required = 'agenda.can_manage_agenda' - - def pre_redirect(self, request, *args, **kwargs): - self.motion = Motion.objects.get(pk=kwargs['motion_id']) - self.item = Item(related_sid=self.motion.sid) - self.item.save() - - def get_redirect_url(self, **kwargs): - return reverse('item_overview') - - -class MotionPDF(PDFView): - permission_required = 'motion.can_see_motion' - top_space = 0 - - def get_filename(self): - motion_id = self.kwargs['motion_id'] - if motion_id is None: - filename = _("Motions") - else: - motion = Motion.objects.get(id=motion_id) - if motion.number: - number = motion.number - else: - number = "" - filename = u'%s%s' % (_("Motion"), str(number)) - return filename - - def append_to_pdf(self, story): - motion_id = self.kwargs['motion_id'] - if motion_id is None: #print all motions - title = config["motion_pdf_title"] - story.append(Paragraph(title, stylesheet['Heading1'])) - preamble = config["motion_pdf_preamble"] - if preamble: - story.append(Paragraph("%s" % preamble.replace('\r\n','
      '), stylesheet['Paragraph'])) - story.append(Spacer(0,0.75*cm)) - motions = Motion.objects.all() - if not motions: # No motions existing - story.append(Paragraph(_("No motions available."), stylesheet['Heading3'])) - else: # Print all Motions - # List of motions - for motion in motions: - if motion.number: - story.append(Paragraph(_("Motion No.")+" %s: %s" % (motion.number, motion.title), stylesheet['Heading3'])) - else: - story.append(Paragraph(_("Motion No.")+"   : %s" % (motion.title), stylesheet['Heading3'])) - # Motions details (each motion on single page) - for motion in motions: - story.append(PageBreak()) - story = self.get_motion(motion, story) - else: # print selected motion - motion = Motion.objects.get(id=motion_id) - story = self.get_motion(motion, story) - - def get_motion(self, motion, story): - # Preparing Table - data = [] - - # motion number - if motion.number: - story.append(Paragraph(_("Motion No.")+" %s" % motion.number, stylesheet['Heading1'])) - else: - story.append(Paragraph(_("Motion No."), stylesheet['Heading1'])) - - # submitter - cell1a = [] - cell1a.append(Spacer(0, 0.2 * cm)) - cell1a.append(Paragraph("%s:" % _("Submitter"), stylesheet['Heading4'])) - cell1b = [] - cell1b.append(Spacer(0, 0.2 * cm)) - cell1b.append(Paragraph("%s" % motion.submitter, stylesheet['Normal'])) - data.append([cell1a, cell1b]) - - if motion.status == "pub": - # Cell for the signature - cell2a = [] - cell2b = [] - cell2a.append(Paragraph("%s:" % _("Signature"), stylesheet['Heading4'])) - cell2b.append(Paragraph("__________________________________________", stylesheet['Signaturefield'])) - cell2b.append(Spacer(0, 0.1 * cm)) - cell2b.append(Spacer(0,0.2*cm)) - data.append([cell2a, cell2b]) - - # supporters - if config['motion_min_supporters']: - cell3a = [] - cell3b = [] - cell3a.append(Paragraph("%s:" % _("Supporters"), stylesheet['Heading4'])) - for supporter in motion.supporters: - cell3b.append(Paragraph(".  %s" % supporter, stylesheet['Signaturefield'])) - if motion.status == "pub": - for x in range(motion.missing_supporters): - cell3b.append(Paragraph(".  __________________________________________",stylesheet['Signaturefield'])) - cell3b.append(Spacer(0, 0.2 * cm)) - data.append([cell3a, cell3b]) - - # status - cell4a = [] - cell4b = [] - note = " ".join(motion.notes) - cell4a.append(Paragraph("%s:" % _("Status"), stylesheet['Heading4'])) - if note != "": - if motion.status == "pub": - cell4b.append(Paragraph(note, stylesheet['Normal'])) - else: - cell4b.append(Paragraph("%s | %s" % (motion.get_status_display(), note), stylesheet['Normal'])) - else: - cell4b.append(Paragraph("%s" % motion.get_status_display(), stylesheet['Normal'])) - data.append([cell4a, cell4b]) - - # Version number (aid) - if motion.public_version.aid > 1: - cell5a = [] - cell5b = [] - cell5a.append(Paragraph("%s:" % _("Version"), stylesheet['Heading4'])) - cell5b.append(Paragraph("%s" % motion.public_version.aid, stylesheet['Normal'])) - data.append([cell5a, cell5b]) - - # voting results - poll_results = motion.get_poll_results() - if poll_results: - cell6a = [] - cell6a.append(Paragraph("%s:" % _("Vote results"), stylesheet['Heading4'])) - cell6b = [] - ballotcounter = 0 - for result in poll_results: - ballotcounter += 1 - if len(poll_results) > 1: - cell6b.append(Paragraph("%s. %s" % (ballotcounter, _("Vote")), stylesheet['Bold'])) - cell6b.append(Paragraph("%s: %s
      %s: %s
      %s: %s
      %s: %s
      %s: %s" % (_("Yes"), result[0], _("No"), result[1], _("Abstention"), result[2], _("Invalid"), result[3], _("Votes cast"), result[4]), stylesheet['Normal'])) - cell6b.append(Spacer(0, 0.2*cm)) - data.append([cell6a, cell6b]) - - # Creating Table - t = Table(data) - t._argW[0] = 4.5 * cm - t._argW[1] = 11 * cm - t.setStyle(TableStyle([('BOX', (0, 0), (-1, -1), 1, colors.black), - ('VALIGN', (0,0), (-1,-1), 'TOP')])) - story.append(t) - story.append(Spacer(0, 1 * cm)) - - # title - story.append(Paragraph(motion.public_version.title, stylesheet['Heading3'])) - # text - story.append(Paragraph("%s" % motion.public_version.text.replace('\r\n','
      '), stylesheet['Paragraph'])) - # reason - if motion.public_version.reason: - story.append(Paragraph(_("Reason")+":", stylesheet['Heading3'])) - story.append(Paragraph("%s" % motion.public_version.reason.replace('\r\n','
      '), stylesheet['Paragraph'])) - return story - - -class MotionPollPDF(PDFView): - permission_required = 'motion.can_manage_motion' - top_space = 0 def get(self, request, *args, **kwargs): - self.poll = MotionPoll.objects.get(id=self.kwargs['poll_id']) - return super(MotionPollPDF, self).get(request, *args, **kwargs) + """Set self.object to a motion.""" + self.object = self.get_object() + return super(PollCreateView, self).get(request, *args, **kwargs) + + def pre_redirect(self, request, *args, **kwargs): + """Create the poll for the motion.""" + self.poll = self.object.create_poll() + self.object.write_log(ugettext_noop("Poll created"), request.user) + messages.success(request, _("New vote was successfully created.")) + + def get_redirect_url(self, **kwargs): + """Return the URL to the EditView of the poll.""" + return reverse('motion_poll_edit', args=[self.object.pk, self.poll.poll_number]) + +poll_create = PollCreateView.as_view() + + +class PollMixin(object): + """Mixin for the PollUpdateView and the PollDeleteView.""" + permission_required = 'motion.can_manage_motion' + success_url_name = 'motion_detail' + + def get_object(self): + """Return a MotionPoll object. + + Use the motion id and the poll_number from the url kwargs to get the + object. + """ + return MotionPoll.objects.filter( + motion=self.kwargs['pk'], + poll_number=self.kwargs['poll_number']).get() + + def get_url_name_args(self): + """Return the arguments to create the url to the success_url""" + return [self.object.motion.pk] + + +class PollUpdateView(PollMixin, PollFormView): + """View to update a MotionPoll.""" + + poll_class = MotionPoll + """Poll Class to use for this view.""" + + template_name = 'motion/poll_form.html' + + def get_context_data(self, **kwargs): + """Return the template context. + + Append the motion object to the context. + """ + context = super(PollUpdateView, self).get_context_data(**kwargs) + context.update({ + 'motion': self.poll.motion}) + return context + + def form_valid(self, form): + """Write a log message, if the form is valid.""" + value = super(PollUpdateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Poll updated'), self.request.user) + return value + +poll_edit = PollUpdateView.as_view() + + +class PollDeleteView(PollMixin, DeleteView): + """View to delete a MotionPoll.""" + model = MotionPoll + + def case_yes(self): + """Write a log message, if the form is valid.""" + super(PollDeleteView, self).case_yes() + self.object.write_log(ugettext_noop('Poll deleted'), self.request.user) + +poll_delete = PollDeleteView.as_view() + + +class MotionSetStateView(SingleObjectMixin, RedirectView): + """View to set the state of a motion. + + If self.reset is False, the new state is taken from url. + + If self.reset is True, the default state is taken. + """ + permission_required = 'motion.can_manage_motion' + url_name = 'motion_detail' + model = Motion + reset = False + + def pre_redirect(self, request, *args, **kwargs): + """Save the new state and write a log message.""" + self.object = self.get_object() + try: + if self.reset: + self.object.reset_state() + else: + self.object.state = kwargs['state'] + except WorkflowError, e: + messages.error(request, e) + else: + self.object.save() + # TODO: the state is not translated + self.object.write_log(ugettext_noop('Changed state to %s') % + self.object.state.name, self.request.user) + messages.success(request, _('Motion status was set to: %s.' + % html_strong(self.object.state))) + + def get_url_name_args(self): + """Return the arguments to generate the redirect_url.""" + return [self.object.pk] + +set_state = MotionSetStateView.as_view() +reset_state = MotionSetStateView.as_view(reset=True) + + +class CreateAgendaItemView(SingleObjectMixin, RedirectView): + """View to create and agenda item for a motion.""" + permission_required = 'agenda.can_manage_agenda' + url_name = 'item_overview' + model = Motion + + def get(self, request, *args, **kwargs): + """Set self.object to a motion.""" + self.object = self.get_object() + return super(CreateAgendaItemView, self).get(request, *args, **kwargs) + + def pre_redirect(self, request, *args, **kwargs): + """Create the agenda item.""" + self.item = Item.objects.create(related_sid=self.object.sid) + self.object.write_log(ugettext_noop('Created Agenda Item'), self.request.user) + +create_agenda_item = CreateAgendaItemView.as_view() + + +class MotionPDFView(SingleObjectMixin, PDFView): + """Create the PDF for one, or all motions. + + If self.print_all_motions is True, the view returns a PDF with all motions. + + If self.print_all_motions is False, the view returns a PDF with only one + motion.""" + permission_required = 'motion.can_manage_motion' + model = Motion + top_space = 0 + print_all_motions = False + + def get(self, request, *args, **kwargs): + """Set self.object to a motion.""" + if not self.print_all_motions: + self.object = self.get_object() + return super(MotionPDFView, self).get(request, *args, **kwargs) def get_filename(self): - filename = u'%s%s_%s' % (_("Motion"), str(self.poll.motion.number), _("Poll")) - return filename + """Return the filename for the PDF.""" + if self.print_all_motions: + return _("Motions") + else: + return _("Motion: %s") % unicode(self.object) - def get_template(self, buffer): - return SimpleDocTemplate(buffer, topMargin=-6, bottomMargin=-6, leftMargin=0, rightMargin=0, showBoundary=False) + def append_to_pdf(self, pdf): + """Append PDF objects.""" + if self.print_all_motions: + motions_to_pdf(pdf) + else: + motion_to_pdf(pdf, self.object) - def build_document(self, pdf_document, story): - pdf_document.build(story) - - def append_to_pdf(self, story): - imgpath = os.path.join(settings.SITE_ROOT, 'static/images/circle.png') - circle = "  " % imgpath - cell = [] - cell.append(Spacer(0,0.8*cm)) - cell.append(Paragraph(_("Motion No. %s") % self.poll.motion.number, stylesheet['Ballot_title'])) - cell.append(Paragraph(self.poll.motion.title, stylesheet['Ballot_subtitle'])) - cell.append(Paragraph(_("%d. Vote") % self.poll.get_ballot(), stylesheet['Ballot_description'])) - cell.append(Spacer(0,0.5*cm)) - cell.append(Paragraph(circle + unicode(_("Yes")), stylesheet['Ballot_option'])) - cell.append(Paragraph(circle + unicode(_("No")), stylesheet['Ballot_option'])) - cell.append(Paragraph(circle + unicode(_("Abstention")), stylesheet['Ballot_option'])) - data= [] - # get ballot papers config values - ballot_papers_selection = config["motion_pdf_ballot_papers_selection"] - ballot_papers_number = config["motion_pdf_ballot_papers_number"] - - # set number of ballot papers - if ballot_papers_selection == "NUMBER_OF_DELEGATES": - number = User.objects.filter(type__iexact="delegate").count() - elif ballot_papers_selection == "NUMBER_OF_ALL_PARTICIPANTS": - number = int(User.objects.count()) - else: # ballot_papers_selection == "CUSTOM_NUMBER" - number = int(ballot_papers_number) - number = max(1, number) - - # print ballot papers - if number > 0: - for user in xrange(number / 2): - data.append([cell, cell]) - rest = number % 2 - if rest: - data.append([cell, '']) - t=Table(data, 10.5 * cm, 7.42 * cm) - t.setStyle(TableStyle([('GRID', (0, 0), (-1, -1), 0.25, colors.grey), - ('VALIGN', (0, 0), (-1, -1), 'TOP'), - ])) - story.append(t) +motion_list_pdf = MotionPDFView.as_view(print_all_motions=True) +motion_detail_pdf = MotionPDFView.as_view(print_all_motions=False) class Config(FormView): + """The View for the config tab.""" permission_required = 'config.can_manage_config' form_class = ConfigForm template_name = 'motion/config.html' + success_url_name = 'config_motion' def get_initial(self): return { @@ -916,7 +484,8 @@ class Config(FormView): 'motion_pdf_ballot_papers_number': config['motion_pdf_ballot_papers_number'], 'motion_pdf_title': config['motion_pdf_title'], 'motion_pdf_preamble': config['motion_pdf_preamble'], - 'motion_allow_trivial_change': config['motion_allow_trivial_change'], + 'motion_create_new_version': config['motion_create_new_version'], + 'motion_workflow': config['motion_workflow'], } def form_valid(self, form): @@ -926,26 +495,33 @@ class Config(FormView): config['motion_pdf_ballot_papers_number'] = form.cleaned_data['motion_pdf_ballot_papers_number'] config['motion_pdf_title'] = form.cleaned_data['motion_pdf_title'] config['motion_pdf_preamble'] = form.cleaned_data['motion_pdf_preamble'] - config['motion_allow_trivial_change'] = form.cleaned_data['motion_allow_trivial_change'] + config['motion_create_new_version'] = form.cleaned_data['motion_create_new_version'] + config['motion_workflow'] = form.cleaned_data['motion_workflow'] messages.success(self.request, _('Motion settings successfully saved.')) return super(Config, self).form_valid(form) def register_tab(request): - selected = True if request.path.startswith('/motion/') else False + """Return the motion tab.""" + # TODO: Find a bether way to set the selected var. + selected = request.path.startswith('/motion/') return Tab( title=_('Motions'), - url=reverse('motion_overview'), - permission=request.user.has_perm('motion.can_see_motion') or request.user.has_perm('motion.can_support_motion') or request.user.has_perm('motion.can_support_motion') or request.user.has_perm('motion.can_manage_motion'), + app='motion', + url=reverse('motion_list'), + permission=request.user.has_perm('motion.can_see_motion'), selected=selected, ) def get_widgets(request): - return [ - Widget( - name='motions', - display_name=_('Motions'), - template='motion/widget.html', - context={'motions': Motion.objects.all()}, - permission_required='projector.can_manage_projector')] + """Return the motion widgets for the dashboard. + + There is only one widget. It shows all motions. + """ + return [Widget( + name='motions', + display_name=_('Motions'), + template='motion/widget.html', + context={'motions': Motion.objects.all()}, + permission_required='projector.can_manage_projector')] diff --git a/openslides/motion/workflow.py b/openslides/motion/workflow.py new file mode 100644 index 000000000..929485fc4 --- /dev/null +++ b/openslides/motion/workflow.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.utils.workflow + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Defines the States for motions. All States are linked together with there + 'next_state' attributes. Together there are a workflow. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +from django.conf import settings +from django.core import exceptions +from django.utils.importlib import import_module +from django.utils.translation import ugettext_noop + +from openslides.config.models import config + +_workflow = None + + +class State(object): + """Define a state for a motion.""" + def __init__(self, id, name, next_states=[], create_poll=False, support=False, + edit_as_submitter=False, version_permission=True): + """Set attributes for the state. + + The Arguments are: + - 'id' a unique id for the state. + - 'name' a string representing the state. + - 'next_states' a list with all states, that can be choosen from this state. + + All the other arguments are boolean values. If True, the specific action for + motions in this state. + - 'create_poll': polls can be created in this state. + - 'support': persons can support the motion in this state. + - 'edit_as_submitter': the submitter can edit the motion in this state. + - 'version_permission': new versions are not permitted. + """ + self.id = id + self.name = name + self.next_states = next_states + self.create_poll = create_poll + self.support = support + self.edit_as_submitter = edit_as_submitter + self.version_permission = version_permission + + def __unicode__(self): + """Return the name of the state.""" + return self.name + + +class WorkflowError(Exception): + """Exception raised when errors in a state accure.""" + pass + + +def motion_workflow_choices(): + """Return all possible workflows. + + The possible workflows can be set in the settings with the setting + 'MOTION_WORKFLOW'. + """ + for workflow in settings.MOTION_WORKFLOW: + yield workflow[0], workflow[1] + + +def get_state(state='default'): + """Return a state object. + + The argument 'state' has to be a state_id. + + If the argument 'state' is 'default', the default state is returned. + + The default state is the state object choosen in the config tab. + """ + global _workflow + if _workflow is not None: + try: + return _workflow[state] + except KeyError: + raise WorkflowError('Unknown state: %s' % state) + _workflow = {} + for workflow in settings.MOTION_WORKFLOW: + if workflow[0] == config['motion_workflow']: + try: + wf_module, wf_default_state_name = workflow[2].rsplit('.', 1) + except ValueError: + raise exceptions.ImproperlyConfigured( + '%s isn\'t a workflow module' % workflow[2]) + try: + mod = import_module(wf_module) + except ImportError as e: + raise exceptions.ImproperlyConfigured( + 'Error importing workflow %s: "%s"' % (wf_module, e)) + try: + default_state = getattr(mod, wf_default_state_name) + except AttributeError: + raise exceptions.ImproperlyConfigured( + 'Workflow module "%s" does not define a "%s" State' + % (wf_module, wf_default_state_name)) + _workflow['default'] = default_state + break + else: + raise ImproperlyConfigured('Unknown workflow %s' % conf['motion_workflow']) + + populate_workflow(default_state, _workflow) + return get_state(state) + + +def populate_workflow(state, workflow): + """Append all 'next_states' from state to the workflow. + + The argument state has to be a state object. + + The argument workflow has to be a dictonary. + + Calls this function recrusiv with all next_states from the next_states states. + """ + workflow[state.id] = state + for s in state.next_states: + if s.id not in workflow: + populate_workflow(s, workflow) + + +DUMMY_STATE = State('dummy', ugettext_noop('Unknwon state')) +"""A dummy state object. Returned, if the state_id is not known.""" + +default_workflow = State('pub', ugettext_noop('Published'), support=True, + edit_as_submitter=True, version_permission=False) +"""Default Workflow for OpenSlides.""" + +default_workflow.next_states = [ + State('per', ugettext_noop('Permitted'), create_poll=True, edit_as_submitter=True, next_states=[ + State('acc', ugettext_noop('Accepted')), + State('rej', ugettext_noop('Rejected')), + State('wit', ugettext_noop('Withdrawed')), + State('adj', ugettext_noop('Adjourned')), + State('noc', ugettext_noop('Not Concerned')), + State('com', ugettext_noop('Commited a bill')), + State('rev', ugettext_noop('Needs Review'))]), + State('nop', ugettext_noop('Rejected (not authorized)'))] diff --git a/openslides/participant/static/javascript/participant.js b/openslides/participant/static/javascript/participant.js index bf17d5202..6dff8e739 100644 --- a/openslides/participant/static/javascript/participant.js +++ b/openslides/participant/static/javascript/participant.js @@ -6,22 +6,24 @@ */ $(function() { + // change participant status (on/off) $('.status_link').click(function(event) { event.preventDefault(); - link = $(this); - group = $(this).parent(); + var link = $(this); $.ajax({ type: 'GET', - url: link.attr('href'), + url: $(this).attr('href'), dataType: 'json', success: function(data) { if (data.active) { - group.children('.status_link.deactivate').show(); - group.children('.status_link.activate').hide(); + newclass = 'icon-on'; + link.addClass('btn-success'); } else { - group.children('.status_link.deactivate').hide(); - group.children('.status_link.activate').show(); + newclass = 'icon-off'; + link.removeClass('btn-success'); } + link.children('i').removeClass('icon-off icon-on').addClass(newclass); + link.attr('href', data.link); } }); }); diff --git a/openslides/participant/static/styles/participant.css b/openslides/participant/static/styles/participant.css deleted file mode 100644 index 0d656c9c8..000000000 --- a/openslides/participant/static/styles/participant.css +++ /dev/null @@ -1,22 +0,0 @@ -/** - * OpenSlides participants style - * - * :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. - * :license: GNU GPL, see LICENSE for more details. - */ - -a.status_link span { - background-repeat: no-repeat; - background-position: center; - width: 16px; - height: 16px; - display: inline-block; -} - -a.status_link.deactivate span { - background-image: url(../images/icons/on.png); -} - -a.status_link.activate span { - background-image: url(../images/icons/off.png); -} diff --git a/openslides/participant/templates/participant/base_participant.html b/openslides/participant/templates/participant/base_participant.html deleted file mode 100644 index 53f1d3012..000000000 --- a/openslides/participant/templates/participant/base_participant.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block submenu %} - {% url 'user_overview' as url_users %} - {% url 'user_new' as url_usernew %} - {% url 'user_group_overview' as url_usergroups %} - {% url 'user_import' as url_userimport %} -

      {% trans "Participants" %}

      -
      - - {# second submenu #} - {% if shown_user %} -
      -

      {{ shown_user.clean_name }}

      - - {% elif group %} -
      -

      {{ group.name }}

      - - {% endif %} - -{% endblock %} diff --git a/openslides/participant/templates/participant/config.html b/openslides/participant/templates/participant/config.html index 3c1ed6199..50258fe52 100644 --- a/openslides/participant/templates/participant/config.html +++ b/openslides/participant/templates/participant/config.html @@ -5,18 +5,19 @@ {% block title %}{{ block.super }} – {% trans "Participant settings" %}{% endblock %} {% block content %} -

      {% trans "Participant settings" %}

      +

      + {% trans "Configuration" %} + {% trans "Participants" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

      {% csrf_token %} - {{ form.as_p }} -

      - - - - -

      + {% include "form.html" %} +

      + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %} + +

      + * {% trans "required" %}
      {% endblock %} diff --git a/openslides/participant/templates/participant/edit.html b/openslides/participant/templates/participant/edit.html index 6919a4221..d0dfc143a 100644 --- a/openslides/participant/templates/participant/edit.html +++ b/openslides/participant/templates/participant/edit.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} @@ -11,33 +11,30 @@ {% endif %} {% endblock %} - {% block content %} - {% if edit_user %} -

      {% trans "Edit participant" %}

      - {% else %} -

      {% trans "New participant" %}

      - {% endif %} +

      + {% if edit_user %} + {% trans "Edit participant" %} + {% else %} + {% trans "New participant" %} + {% endif %} + + {% trans "Back to overview" %} + +

      {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %} {% if edit_user %} -

      - {% trans 'Reset to First Password' %} +

      + {% trans 'Reset to First Password' %}

      {% endif %}

      - - - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %} +

      * {% trans "required" %}
      diff --git a/openslides/participant/templates/participant/group_detail.html b/openslides/participant/templates/participant/group_detail.html index fb456c31c..ea3f5fab0 100644 --- a/openslides/participant/templates/participant/group_detail.html +++ b/openslides/participant/templates/participant/group_detail.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load tags %} @@ -7,16 +7,22 @@ {% block content %} -

      {{ group }}

      +

      {{ group }} + + {% trans "Back to overview" %} + +

      {{ group.description }}

      -

      {% trans "Members" %}

      +

      {% trans "Members" %}

      +
        {% for member in group.user_set.all %} -

        {{ member }}

        +
      1. {{ member }}
      2. {% empty %}

        {% trans "No members available." %}

        {% endfor %} +
      {% endblock %} diff --git a/openslides/participant/templates/participant/group_edit.html b/openslides/participant/templates/participant/group_edit.html index 7638a360e..8020247d2 100644 --- a/openslides/participant/templates/participant/group_edit.html +++ b/openslides/participant/templates/participant/group_edit.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} @@ -12,25 +12,23 @@ {% endblock %} {% block content %} +

      {% if group %} -

      {% trans "Edit group" %}

      + {% trans "Edit group" %} {% else %} -

      {% trans "New group" %}

      + {% trans "New group" %} {% endif %} + + {% trans "Back to overview" %} + +
      {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

      - - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %}

      * {% trans "required" %} diff --git a/openslides/participant/templates/participant/group_overview.html b/openslides/participant/templates/participant/group_overview.html index cb91709be..f86c9b5ba 100644 --- a/openslides/participant/templates/participant/group_overview.html +++ b/openslides/participant/templates/participant/group_overview.html @@ -1,30 +1,45 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} -{% load staticfiles %} {% load tags %} {% block title %}{{ block.super }} – {% trans "Groups" %}{% endblock %} {% block content %} -

      {% trans "Groups" %}

      - +

      {% trans "Groups" %} + + {% trans "New" %} + {% trans "Back to participants overview" %} + +

      + +
      - + {% for group in groups %} - - - + + - - {% empty %} - - {% endfor %}
      {% trans "Group" %}{% trans "Actions" %}{% trans "Actions" %}
      {{ group.name }} - {% if group.name|lower != 'anonymous' and group.name|lower != 'registered' %} - - {% endif %} +
      + {{ group.name }} + + + {% if perms.projector.can_manage_projector %} + + + + {% endif %} + + + + {% if group.name|lower != 'anonymous' and group.name|lower != 'registered' %} + + + + {% endif %} +
      {% trans "No groups available." %}
      diff --git a/openslides/participant/templates/participant/group_widget.html b/openslides/participant/templates/participant/group_widget.html index 88a2eb91c..5145bccc2 100644 --- a/openslides/participant/templates/participant/group_widget.html +++ b/openslides/participant/templates/participant/group_widget.html @@ -5,17 +5,14 @@ {% for group in groups %} {% if group.name != 'Anonymous' and group.name != 'Registered' %}
    • - -
      +
      + +   + + - - - - - - - - + + {{ group }}
    • diff --git a/openslides/participant/templates/participant/import.html b/openslides/participant/templates/participant/import.html index 2cd720cfe..e374845b7 100644 --- a/openslides/participant/templates/participant/import.html +++ b/openslides/participant/templates/participant/import.html @@ -1,11 +1,17 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% block title %}{{ block.super }} – {% trans "Import participants" %} {% endblock %} {% block content %} -

      {% trans 'Import participants' %}

      +

      + {% trans 'Import participants' %} + + {% trans "Back to overview" %} + +

      +

      {% trans 'Select a CSV file to import participants!' %}

      {% trans 'Required comma separated values' %}: @@ -18,15 +24,13 @@

      {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

      - - - + + {% trans 'Cancel' %}

      * {% trans "required" %} diff --git a/openslides/participant/templates/participant/login.html b/openslides/participant/templates/participant/login.html index cd196cb14..ec7576bae 100644 --- a/openslides/participant/templates/participant/login.html +++ b/openslides/participant/templates/participant/login.html @@ -1,25 +1,17 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load staticfiles %} -{% block mainmenu %} - +{% block loginbutton %} {% endblock %} -{% block submenu %} -{% endblock %} - -{% block content %} -

      {% trans "Login" %}

      +{% block body %} +
      +

      {% if form.errors %} -
      - - close - +
      {% for msg in form.non_field_errors %} {{ msg }} {% if not forloop.last %}
      {% endif %} @@ -29,48 +21,37 @@
      {% endif %} {% if first_time_message %} -
      - - close - +
      {{ first_time_message|safe }}
      {% endif %} + - + {% csrf_token %} - - - - - - - - - -
      {{ form.username.label_tag }}{{ form.username }}
      {{ form.password.label_tag }}{{ form.password }}
      +
      + + +
      +
      + + +
      +

      - {% if os_enable_anonymous_login %} - + + {% trans 'Continue as guest' %} + {% endif %}

      - {% if os_enable_anonymous_login %} - - {% endif %} {% endblock %} diff --git a/openslides/participant/templates/participant/overview.html b/openslides/participant/templates/participant/overview.html index 829402e89..fb28d61a9 100644 --- a/openslides/participant/templates/participant/overview.html +++ b/openslides/participant/templates/participant/overview.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load staticfiles %} @@ -6,104 +6,142 @@ {% block title %}{{ block.super }} – {% trans "Participants" %}{% endblock %} -{% block header %} - {% if perms.agenda.can_manage_agenda %} - +{% block javascript %} + {% if perms.participant.can_manage_participant %} {% endif %} {% endblock %} - - + {% block content %} -

      {% trans "Participants" %}

      +

      {% trans "Participants" %} + +
      + {% if perms.participant.can_manage_participant %} + {% trans "New" %} + {% trans "Groups" %} + {% trans 'Import' %} + {% endif %} + {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} +
      + {% if user.is_authenticated %} + + PDF + + + + {% else %} + {% trans "Login" %} + {% endif %} +
      + {% else %} + {% if perms.participant.can_see_participant %} + PDF + {% endif %} + {% if perms.participant.can_manage_participant %} + PDF + {% endif %} + {% endif %} +
      +
      +

      -

      -

      - {% trans "Filter" %}: - - - - - -
      -

      +
      + {% trans "Filter" %}: +
      + + + + + +
      +
      + {% if users.count == allusers %} {{ users.count }} {% blocktrans count counter=users.count %}participant{% plural %}participants{% endblocktrans %} {% else %} {{ users.count }} {% trans "of" %} {{ allusers }} {% trans "Participants" %} (= {{ percent }} %) {% endif %} - + +
      - - - + + + {% if perms.participant.can_manage_participant %} - - - + + + {% endif %} {% for user in users %} - - - - - - + + + + + + {% if perms.participant.can_manage_participant %} - - + ]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
      ","
      "],thead:[1,"
      {% trans "First Name" %} {% trans "Last Name" %}{% trans "Structure level" %}{% trans "Type" %}{% trans "Committee" %}{% trans "Structure level" %}{% trans "Type" %}{% trans "Committee" %}{% trans "Comment" %}{% trans "Last Login" %}{% trans "Actions" %}{% trans "Comment" %}{% trans "Last Login" %}{% trans "Actions" %}
      {{ user.first_name }}{{ user.last_name }}{{ user.structure_level }}{{ user.get_type_display }}{{ user.committee }}
      {{ user.first_name }}{{ user.last_name }}{{ user.structure_level }}{{ user.get_type_display }}{{ user.committee }}{{ user.comment|first_line }} + {{ user.comment|first_line }} {% if user.last_login > user.date_joined %} {{ user.last_login }} {% endif %} - - + {% if perms.projector.can_manage_projector %} + + + + {% endif %} + + {% if user != request_user %} - - + + {% endif %} {% if user != request_user and not user.is_superuser %} - - + {% endif %} diff --git a/openslides/participant/templates/participant/password_change.html b/openslides/participant/templates/participant/password_change.html index a31b5bb9a..3a845dae5 100644 --- a/openslides/participant/templates/participant/password_change.html +++ b/openslides/participant/templates/participant/password_change.html @@ -4,28 +4,11 @@ {% block title %}{{ block.super }} – {% trans "Password Settings" %}{% endblock %} -{% block submenu %} -

      {% trans "User Settings" %}

      - -{% endblock %} - {% block content %}

      {% trans "Password Settings" %}

      {% csrf_token %} - {{ form.as_p }} - - - - - + {% include "form.html" %} + {% include "formbuttons_save.html" %}
      -

      {% endblock %} diff --git a/openslides/participant/templates/participant/settings.html b/openslides/participant/templates/participant/settings.html index 54bcf94e0..f7dfa77d8 100644 --- a/openslides/participant/templates/participant/settings.html +++ b/openslides/participant/templates/participant/settings.html @@ -2,29 +2,13 @@ {% load i18n %} -{% block title %}{{ block.super }} – {% trans "Personal Settings" %}{% endblock %} - -{% block submenu %} -

      {% trans "User Settings" %}

      - -{% endblock %} +{% block title %}{{ block.super }} – {% trans "Edit profile" %}{% endblock %} {% block content %} -

      {% trans "Personal Settings" %}

      +

      {% trans "Edit profile" %}

      {% csrf_token %} - {{ form_user.as_p }} - - - - - + {% include "form.html" %} + {% include "formbuttons_save.html" %}
      {% endblock %} diff --git a/openslides/participant/templates/participant/user_detail.html b/openslides/participant/templates/participant/user_detail.html index af3b581c3..e31502b29 100644 --- a/openslides/participant/templates/participant/user_detail.html +++ b/openslides/participant/templates/participant/user_detail.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load tags %} @@ -7,11 +7,15 @@ {% block content %} -

      {{ shown_user }}

      +

      {{ shown_user }} + + {% trans "Back to overview" %} + +

      {{ shown_user.email }}

      -

      {% trans "Groups" %}

      +

      {% trans "Groups" %}

      {% if shown_user.groups.all %} {{ shown_user.groups.all|join:", " }} @@ -21,32 +25,32 @@

      {% if shown_user.get_gender_display %} -

      {% trans "Gender" %}

      +

      {% trans "Gender" %}

      {{ shown_user.get_gender_display }}

      {% endif %} {% if shown_user.get_type_display %} -

      {% trans "Type" %}

      +

      {% trans "Type" %}

      {{ shown_user.get_type_display }}

      {% endif %} {% if shown_user.committee %} -

      {% trans "Committee" %}

      +

      {% trans "Committee" %}

      {{ shown_user.committee }}

      {% endif %} {% if shown_user.about_me %} -

      {% trans "About me" %}

      +

      {% trans "About me" %}

      {{ shown_user.about_me }}

      {% endif %} {% if perms.participant.can_manage_participant %} {% if shown_user.comment %} -

      {% trans "Comment" %}

      +

      {% trans "Comment" %}

      {{ shown_user.comment }}

      {% endif %} -

      {% trans "Last Login" %}

      +

      {% trans "Last Login" %}

      {% if shown_user.last_login > shown_user.date_joined %}

      {{ shown_user.last_login }}

      {% else %} diff --git a/openslides/participant/templates/participant/user_widget.html b/openslides/participant/templates/participant/user_widget.html index ab762774e..59df7c69f 100644 --- a/openslides/participant/templates/participant/user_widget.html +++ b/openslides/participant/templates/participant/user_widget.html @@ -4,17 +4,14 @@
        {% for user in users %}
      • - -
        +
        + +   + + - - - - - - - - + + {{ user }}
      • diff --git a/openslides/participant/urls.py b/openslides/participant/urls.py index 569f8b85f..8fa6b9ca9 100644 --- a/openslides/participant/urls.py +++ b/openslides/participant/urls.py @@ -10,7 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import url, patterns +from django.conf.urls import url, patterns from openslides.participant.views import ( UserOverview, UserCreateView, UserDetailView, UserUpdateView, diff --git a/openslides/participant/views.py b/openslides/participant/views.py index bae5f0a69..479f1d00c 100644 --- a/openslides/participant/views.py +++ b/openslides/participant/views.py @@ -163,8 +163,7 @@ class UserCreateView(CreateView): model = User context_object_name = 'edit_user' form_class = UserCreateForm - success_url = 'user_overview' - apply_url = 'user_edit' + success_url_name = 'user_overview' def manipulate_object(self, form): self.object.username = gen_username( @@ -183,8 +182,7 @@ class UserUpdateView(UpdateView): model = User context_object_name = 'edit_user' form_class = UserUpdateForm - success_url = 'user_overview' - apply_url = 'participant_edit' + success_url_name = 'user_overview' class UserDeleteView(DeleteView): @@ -193,7 +191,7 @@ class UserDeleteView(DeleteView): """ permission_required = 'participant.can_manage_participant' model = User - url = 'user_overview' + success_url_name = 'user_overview' def pre_redirect(self, request, *args, **kwargs): if self.get_object() == self.request.user: @@ -208,7 +206,7 @@ class SetUserStatusView(RedirectView, SingleObjectMixin): """ permission_required = 'participant.can_manage_participant' allow_ajax = True - url = 'user_overview' + url_name = 'user_overview' model = User def pre_redirect(self, request, *args, **kwargs): @@ -400,8 +398,7 @@ class GroupCreateView(CreateView): context_object_name = 'group' model = Group form_class = GroupForm - success_url = 'user_group_overview' - apply_url = 'user_group_edit' + success_url_name = 'user_group_overview' def get(self, request, *args, **kwargs): delete_default_permissions() @@ -417,8 +414,7 @@ class GroupUpdateView(UpdateView): model = Group context_object_name = 'group' form_class = GroupForm - success_url = 'user_group_overview' - apply_url = 'user_group_edit' + success_url_name = 'user_group_overview' def get(self, request, *args, **kwargs): delete_default_permissions() @@ -431,7 +427,7 @@ class GroupDeleteView(DeleteView): """ permission_required = 'participant.can_manage_participant' model = Group - url = 'user_group_overview' + success_url_name = 'user_group_overview' def pre_redirect(self, request, *args, **kwargs): if self.get_object().name.lower() in ['anonymous', 'registered']: @@ -447,6 +443,7 @@ class Config(FormView): permission_required = 'config.can_manage_config' form_class = ConfigForm template_name = 'participant/config.html' + success_url_name = 'config_participant' def get_initial(self): return { @@ -471,7 +468,7 @@ def login(request): extra_content = {} try: admin = User.objects.get(pk=1) - if admin.check_password(admin.default_password): + if admin.check_password(admin.default_password): extra_content['first_time_message'] = _( "Installation was successfully! Use %(user)s " "(password: %(password)s) for first login.
        " @@ -507,7 +504,7 @@ def user_settings(request): form_user = UsersettingsForm(instance=request.user, initial={'language': language}) return { - 'form_user': form_user, + 'form': form_user, 'edituser': request.user, } @@ -523,7 +520,7 @@ def user_settings_password(request): if form.is_valid(): form.save() messages.success(request, _('Password successfully changed.')) - return redirect(reverse('user_settings')) + return redirect(reverse('dashboard')) else: messages.error(request, _('Please check the form for errors.')) else: @@ -541,6 +538,7 @@ def register_tab(request): selected = request.path.startswith('/participant/') return Tab( title=_('Participants'), + app='participant', url=reverse('user_overview'), permission=( request.user.has_perm('participant.can_see_participant') or @@ -554,30 +552,30 @@ def get_widgets(request): group_widget and a personal_info_widget. """ return [ - get_personal_info_widget(request), + #get_personal_info_widget(request), get_user_widget(request), get_group_widget(request)] -def get_personal_info_widget(request): - """ - Provides a widget for personal info. It shows your submitted motions - and where you are supporter or candidate. - """ - personal_info_context = { - 'submitted_motions': Motion.objects.filter(submitter=request.user), - 'config_motion_min_supporters': config['motion_min_supporters'], - 'supported_motions': Motion.objects.filter(motionsupporter=request.user), - 'assignments': Assignment.objects.filter( - assignmentcandidate__person=request.user, - assignmentcandidate__blocked=False)} - return Widget( - name='personal_info', - display_name=_('My motions and elections'), - template='participant/personal_info_widget.html', - context=personal_info_context, - permission_required=None, - default_column=1) +## def get_personal_info_widget(request): + ## """ + ## Provides a widget for personal info. It shows your submitted motions + ## and where you are supporter or candidate. + ## """ + ## personal_info_context = { + ## 'submitted_motions': Motion.objects.filter(submitter=request.user), + ## 'config_motion_min_supporters': config['motion_min_supporters'], + ## 'supported_motions': Motion.objects.filter(motionsupporter=request.user), + ## 'assignments': Assignment.objects.filter( + ## assignmentcandidate__person=request.user, + ## assignmentcandidate__blocked=False)} + ## return Widget( + ## name='personal_info', + ## display_name=_('My motions and elections'), + ## template='participant/personal_info_widget.html', + ## context=personal_info_context, + ## permission_required=None, + ## default_column=1) def get_user_widget(request): diff --git a/openslides/poll/views.py b/openslides/poll/views.py index 70c48e7cc..2293e8c54 100644 --- a/openslides/poll/views.py +++ b/openslides/poll/views.py @@ -12,42 +12,20 @@ from django.http import HttpResponseRedirect from django.forms.models import modelform_factory +from django.core.exceptions import ImproperlyConfigured -from openslides.utils.views import TemplateView +from openslides.utils.views import TemplateView, UrlMixin -class PollFormView(TemplateView): - template_name = 'poll/poll.html' - poll_argument = 'poll_id' +class PollFormView(UrlMixin, TemplateView): + poll_class = None - def set_poll(self, poll_id): - poll_id = poll_id - self.poll = self.poll_class.objects.get(pk=poll_id) - - def get_context_data(self, **kwargs): - context = super(PollFormView, self).get_context_data(**kwargs) - self.set_poll(self.kwargs['poll_id']) - context['poll'] = self.poll - if 'forms' in kwargs: - context['forms'] = kwargs['forms'] - context['pollform'] = kwargs['pollform'] - else: - context['forms'] = self.poll.get_vote_forms() - FormClass = self.get_modelform_class() - context['pollform'] = FormClass(instance=self.poll, - prefix='pollform') - return context - - def get_success_url(self): - return self.success_url - - def get_modelform_class(self): - fields = [] - self.poll.append_pollform_fields(fields) - return modelform_factory(self.poll.__class__, fields=fields) + def get(self, request, *args, **kwargs): + self.poll = self.object = self.get_object() + return super(PollFormView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): - self.set_poll(self.kwargs['poll_id']) + self.poll = self.object = self.get_object() option_forms = self.poll.get_vote_forms(data=self.request.POST) FormClass = self.get_modelform_class() @@ -76,3 +54,32 @@ class PollFormView(TemplateView): pollform.save() return HttpResponseRedirect(self.get_success_url()) + + def get_poll_class(self): + if self.poll_class is not None: + return self.poll_class + else: + raise ImproperlyConfigured( + "No poll class defined. Either provide a poll_class or define" + " a get_poll_class method.") + + def get_object(self): + return self.get_poll_class().objects.get(pk=self.kwargs['poll_id']) + + def get_context_data(self, **kwargs): + context = super(PollFormView, self).get_context_data(**kwargs) + context['poll'] = self.poll + if 'forms' in kwargs: + context['forms'] = kwargs['forms'] + context['pollform'] = kwargs['pollform'] + else: + context['forms'] = self.poll.get_vote_forms() + FormClass = self.get_modelform_class() + context['pollform'] = FormClass(instance=self.poll, + prefix='pollform') + return context + + def get_modelform_class(self): + fields = [] + self.poll.append_pollform_fields(fields) + return modelform_factory(self.poll.__class__, fields=fields) diff --git a/openslides/projector/models.py b/openslides/projector/models.py index f403b6395..c03c426cf 100644 --- a/openslides/projector/models.py +++ b/openslides/projector/models.py @@ -38,7 +38,9 @@ class ProjectorSlide(models.Model, SlideMixin): } @models.permalink - def get_absolute_url(self, link='delete'): + def get_absolute_url(self, link='edit'): + if link == 'edit': + return ('customslide_edit', [str(self.id)]) if link == 'delete': return ('customslide_delete', [str(self.id)]) diff --git a/openslides/projector/static/images/icons/clock.png b/openslides/projector/static/images/icons/clock.png deleted file mode 100644 index a7800ef21..000000000 Binary files a/openslides/projector/static/images/icons/clock.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/document-save.png b/openslides/projector/static/images/icons/document-save.png deleted file mode 100644 index 8072aea32..000000000 Binary files a/openslides/projector/static/images/icons/document-save.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/go-down.png b/openslides/projector/static/images/icons/go-down.png deleted file mode 100644 index 6a2bb793c..000000000 Binary files a/openslides/projector/static/images/icons/go-down.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/go-up.png b/openslides/projector/static/images/icons/go-up.png deleted file mode 100644 index dca17c452..000000000 Binary files a/openslides/projector/static/images/icons/go-up.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/pause.png b/openslides/projector/static/images/icons/pause.png deleted file mode 100644 index a9b3113fb..000000000 Binary files a/openslides/projector/static/images/icons/pause.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/play.png b/openslides/projector/static/images/icons/play.png deleted file mode 100644 index 80ff3a1d5..000000000 Binary files a/openslides/projector/static/images/icons/play.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/skip-backward.png b/openslides/projector/static/images/icons/skip-backward.png deleted file mode 100644 index 1de5dbacf..000000000 Binary files a/openslides/projector/static/images/icons/skip-backward.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/spin-down.png b/openslides/projector/static/images/icons/spin-down.png deleted file mode 100644 index e54993882..000000000 Binary files a/openslides/projector/static/images/icons/spin-down.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/spin-up.png b/openslides/projector/static/images/icons/spin-up.png deleted file mode 100644 index 7830c52a7..000000000 Binary files a/openslides/projector/static/images/icons/spin-up.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/view-reset.png b/openslides/projector/static/images/icons/view-reset.png deleted file mode 100644 index 7726c3546..000000000 Binary files a/openslides/projector/static/images/icons/view-reset.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/zoom-in.png b/openslides/projector/static/images/icons/zoom-in.png deleted file mode 100644 index e96beb2f7..000000000 Binary files a/openslides/projector/static/images/icons/zoom-in.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/zoom-out.png b/openslides/projector/static/images/icons/zoom-out.png deleted file mode 100644 index 75a1837c4..000000000 Binary files a/openslides/projector/static/images/icons/zoom-out.png and /dev/null differ diff --git a/openslides/projector/static/img/glyphicons_054_clock.png b/openslides/projector/static/img/glyphicons_054_clock.png new file mode 100644 index 000000000..46a86c1a9 Binary files /dev/null and b/openslides/projector/static/img/glyphicons_054_clock.png differ diff --git a/openslides/projector/static/images/logo-projector.png b/openslides/projector/static/img/logo-projector.png similarity index 100% rename from openslides/projector/static/images/logo-projector.png rename to openslides/projector/static/img/logo-projector.png diff --git a/openslides/projector/static/images/presentation-header-bg.png b/openslides/projector/static/img/presentation-header-bg.png similarity index 100% rename from openslides/projector/static/images/presentation-header-bg.png rename to openslides/projector/static/img/presentation-header-bg.png diff --git a/openslides/projector/static/javascript/dashboard.js b/openslides/projector/static/javascript/dashboard.js index 95b758c0a..454accbff 100644 --- a/openslides/projector/static/javascript/dashboard.js +++ b/openslides/projector/static/javascript/dashboard.js @@ -5,48 +5,30 @@ * :license: GNU GPL, see LICENSE for more details. */ -// function that writes the portlet list order to a cookie +// function that writes the widget list order to a cookie function saveOrder() { $(".column").each(function(index, value){ var colid = value.id; var cookieName = "cookie-" + colid; // Get the order for this column. var order = $('#' + colid).sortable("toArray"); - // For each portlet in the column - for ( var i = 0, n = order.length; i < n; i++ ) { - // Determine if it is 'opened' or 'closed' - var v = $('#' + order[i] ).find('.portlet-content').is(':visible'); - // Modify the array we're saving to indicate what's open and - // what's not. - order[i] = order[i] + ":" + v; - } $.cookie(cookieName, order, { path: "/", expiry: new Date(2012, 1, 1)}); }); } -// function that restores the portlet list order from a cookie +// function that restores the widget list order from a cookie function restoreOrder() { $(".column").each(function(index, value) { var colid = value.id; - var cookieName = "cookie-" + colid + var cookieName = "cookie-" + colid; var cookie = $.cookie(cookieName); if ( cookie == null ) { return; } var IDs = cookie.split(","); for (var i = 0, n = IDs.length; i < n; i++ ) { - var toks = IDs[i].split(":"); - if ( toks.length != 2 ) { - continue; - } - var portletID = toks[0]; - var visible = toks[1] - var portlet = $(".column") - .find('#' + portletID) + var widgetID = IDs[i]; + var widget = $(".column") + .find('#' + widgetID) .appendTo($('#' + colid)); - if (visible === 'false') { - portlet.find(".ui-icon").toggleClass("ui-icon-minus"); - portlet.find(".ui-icon").toggleClass("ui-icon-plus"); - portlet.find(".portlet-content").hide(); - } } }); } @@ -57,75 +39,7 @@ $(function() { stop: function() { saveOrder(); } }); - $(".portlet") - .addClass("ui-widget ui-widget-content") - .addClass("ui-helper-clearfix ui-corner-all") - .find(".portlet-header") - .addClass("ui-widget-header ui-corner-all") - .prepend('') - .end() - .find(".portlet-content"); - - restoreOrder(); - - $(".portlet-header .ui-icon").click(function() { - $(this).toggleClass("ui-icon-minus"); - $(this).toggleClass("ui-icon-plus"); - $(this).parents(".portlet:first").find(".portlet-content").toggle(); - saveOrder(); // This is important - }); - - if ($.browser.msie) { - if ($.browser.version >= 8.0 && $.browser.version < 9.0) - { - /* scaling bug in IE8.. iframe has to be 4 times bigger */ - $( "#iframe" ).css('width', 1024 * 4); - $( "#iframe" ).css('height', 768 * 4); - } - $( "#iframe" ).css('zoom', '0.25'); - } - - // activate an element to show it on projector - $('.activate_link').click(function(event) { - event.preventDefault(); - var link = $(this); - $.ajax({ - type: 'GET', - url: $(this).attr('href'), - dataType: 'json', - success: function(data) { - $('.activate_link').removeClass('active'); - $('li').removeClass('activeline'); - $('div').removeClass('activeline'); - link.addClass('active'); - link.parent().addClass('activeline'); - }, - error: function () { - alert("Ajax Error"); - } - }); - }); - - $('a.overlay').click(function(event) { - event.preventDefault(); - var link = $(this); - $.ajax({ - type: 'GET', - url: $(this).attr('href'), - dataType: 'json', - success: function(data) { - if (data['active']) { - $('#' + data['def_name'] + '_active').show(); - $('#' + data['def_name'] + '_inactive').hide(); - } else { - $('#' + data['def_name'] + '_active').hide(); - $('#' + data['def_name'] + '_inactive').show(); - } - }, - }); - }); - - // control the projector + // control the projector view $('.projector_edit').click(function(event) { event.preventDefault(); var link = $(this); @@ -143,7 +57,6 @@ $(function() { event.preventDefault(); var link = $(this); var requestData = {}; - if (link.attr('id') == "countdown_set") { requestData = { "countdown_time" : $( "#countdown_time" ).val() }; } @@ -165,7 +78,8 @@ $(function() { }); }); - $('.countdown_visible_link').click(function(event) { + // activate/deactivate overlay + $('.overlay_activate_link').click(function(event) { event.preventDefault(); var link = $(this); $.ajax({ @@ -173,13 +87,13 @@ $(function() { url: link.attr('href'), dataType: 'json', success: function(data) { - if (data.countdown_visible == "True") { - newclass = 'open'; + if (data['active']) { + $('#' + data['def_name'] + '_active').show(); + $('#' + data['def_name'] + '_inactive').hide(); } else { - newclass = 'closed'; + $('#' + data['def_name'] + '_active').hide(); + $('#' + data['def_name'] + '_inactive').show(); } - link.removeClass('closed open').addClass(newclass); - link.attr('href', data.link); } }); }); @@ -190,4 +104,21 @@ $(function() { $('#overlay_message_text').val(data['overlay_message']); } }); + +/* comment out this function because '$.browser' has been removed from jquery 1.9, see: + http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/ + TODO: use jquery migrate to have $.browser support for IE8; + + if ($.browser.msie) { + if ($.browser.version >= 8.0 && $.browser.version < 9.0) + { + // scaling bug in IE8.. iframe has to be 4 times bigger + $( "#iframe" ).css('width', 1024 * 4); + $( "#iframe" ).css('height', 768 * 4); + } + $( "#iframe" ).css('zoom', '0.25'); + } +*/ + + restoreOrder(); }); diff --git a/openslides/projector/static/javascript/jquery-ui-1.8.18.custom.min.js b/openslides/projector/static/javascript/jquery-ui-1.8.18.custom.min.js deleted file mode 100755 index b74654cd9..000000000 --- a/openslides/projector/static/javascript/jquery-ui-1.8.18.custom.min.js +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * jQuery UI 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/* - * jQuery UI Sortable 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Sortables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a),this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.curCSS||(a.curCSS=a.css),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.sortable.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.leftthis.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f= 0 ? '&' : '?') + q; options.data = null; // data is null for 'get' @@ -165,14 +165,18 @@ $.fn.ajaxSubmit = function(options) { } options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg - var context = options.context || options; // jQuery 1.4+ supports scope context + var context = options.context || this ; // jQuery 1.4+ supports scope context for (var i=0, max=callbacks.length; i < max; i++) { callbacks[i].apply(context, [data, status, xhr || $form, $form]); } }; // are there files to upload? - var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113) + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled[value!=""]', this); + var hasFileInputs = fileInputs.length > 0; var mp = 'multipart/form-data'; var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); @@ -181,6 +185,8 @@ $.fn.ajaxSubmit = function(options) { log("fileAPI :" + fileAPI); var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + var jqxhr; + // options.iframe allows user to force iframe mode // 06-NOV-09: now defaulting to iframe mode if file input is detected if (options.iframe !== false && (options.iframe || shouldUseFrame)) { @@ -188,20 +194,22 @@ $.fn.ajaxSubmit = function(options) { // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d if (options.closeKeepAlive) { $.get(options.closeKeepAlive, function() { - fileUploadIframe(a); + jqxhr = fileUploadIframe(a); }); } - else { - fileUploadIframe(a); - } + else { + jqxhr = fileUploadIframe(a); + } } else if ((hasFileInputs || multipart) && fileAPI) { - fileUploadXhr(a); + jqxhr = fileUploadXhr(a); } else { - $.ajax(options); + jqxhr = $.ajax(options); } + $form.removeData('jqxhr').data('jqxhr', jqxhr); + // clear element array for (var k=0; k < elements.length; k++) elements[k] = null; @@ -210,6 +218,22 @@ $.fn.ajaxSubmit = function(options) { this.trigger('form-submit-notify', [this, options]); return this; + // utility fn for deep serialization + function deepSerialize(extraData){ + var serialized = $.param(extraData).split('&'); + var len = serialized.length; + var result = []; + var i, part; + for (i=0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g,' '); + part = serialized[i].split('='); + // #278; use array instead of object storage, favoring array serializations + result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); + } + return result; + } + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) function fileUploadXhr(a) { var formdata = new FormData(); @@ -219,9 +243,10 @@ $.fn.ajaxSubmit = function(options) { } if (options.extraData) { - for (var p in options.extraData) - if (options.extraData.hasOwnProperty(p)) - formdata.append(p, options.extraData[p]); + var serializedData = deepSerialize(options.extraData); + for (i=0; i < serializedData.length; i++) + if (serializedData[i]) + formdata.append(serializedData[i][0], serializedData[i][1]); } options.data = null; @@ -230,9 +255,9 @@ $.fn.ajaxSubmit = function(options) { contentType: false, processData: false, cache: false, - type: 'POST' + type: method || 'POST' }); - + if (options.uploadProgress) { // workaround because jqXHR does not expose upload property s.xhr = function() { @@ -253,27 +278,21 @@ $.fn.ajaxSubmit = function(options) { } s.data = null; - var beforeSend = s.beforeSend; - s.beforeSend = function(xhr, o) { - o.data = formdata; - if(beforeSend) - beforeSend.call(o, xhr, options); + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + o.data = formdata; + if(beforeSend) + beforeSend.call(this, xhr, o); }; - $.ajax(s); + return $.ajax(s); } // private function for handling file uploads (hat tip to YAHOO!) function fileUploadIframe(a) { var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; var useProp = !!$.fn.prop; + var deferred = $.Deferred(); - if ($(':input[name=submit],:input[id=submit]', form).length) { - // if there is an input with a name or id of 'submit' then we won't be - // able to invoke the submit fn on the form (at least not x-browser) - alert('Error: Form elements must not have name or id of "submit".'); - return; - } - if (a) { // ensure that every serialized input is still enabled for (i=0; i < elements.length; i++) { @@ -316,6 +335,14 @@ $.fn.ajaxSubmit = function(options) { var e = (status === 'timeout' ? 'timeout' : 'aborted'); log('aborting upload... ' + e); this.aborted = 1; + + try { // #214, #257 + if (io.contentWindow.document.execCommand) { + io.contentWindow.document.execCommand('Stop'); + } + } + catch(ignore) {} + $io.attr('src', s.iframeSrc); // abort op in progress xhr.error = e; if (s.error) @@ -340,10 +367,12 @@ $.fn.ajaxSubmit = function(options) { if (s.global) { $.active--; } - return; + deferred.reject(); + return deferred; } if (xhr.aborted) { - return; + deferred.reject(); + return deferred; } // add submitting element to data if we know it @@ -359,7 +388,7 @@ $.fn.ajaxSubmit = function(options) { } } } - + var CLIENT_TIMEOUT_ABORT = 1; var SERVER_ABORT = 2; @@ -367,7 +396,7 @@ $.fn.ajaxSubmit = function(options) { var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document; return doc; } - + // Rails CSRF hack (thanks to Yvan Barthelemy) var csrf_token = $('meta[name=csrf-token]').attr('content'); var csrf_param = $('meta[name=csrf-param]').attr('content'); @@ -402,7 +431,7 @@ $.fn.ajaxSubmit = function(options) { if (s.timeout) { timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout); } - + // look for server aborts function checkState() { try { @@ -426,9 +455,16 @@ $.fn.ajaxSubmit = function(options) { if (s.extraData) { for (var n in s.extraData) { if (s.extraData.hasOwnProperty(n)) { - extraInputs.push( - $('').attr('value',s.extraData[n]) - .appendTo(form)[0]); + // if using the $.param format that allows for multiple values with the same name + if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) { + extraInputs.push( + $('').val(s.extraData[n].value) + .appendTo(form)[0]); + } else { + extraInputs.push( + $('').val(s.extraData[n]) + .appendTo(form)[0]); + } } } } @@ -442,7 +478,9 @@ $.fn.ajaxSubmit = function(options) { io.addEventListener('load', cb, false); } setTimeout(checkState,15); - form.submit(); + // just in case form has element with name/id of 'submit' + var submitFn = document.createElement('form').submit; + submitFn.apply(form); } finally { // reset attrs and remove "extra" input elements @@ -478,10 +516,12 @@ $.fn.ajaxSubmit = function(options) { } if (e === CLIENT_TIMEOUT_ABORT && xhr) { xhr.abort('timeout'); + deferred.reject(xhr, 'timeout'); return; } else if (e == SERVER_ABORT && xhr) { xhr.abort('server abort'); + deferred.reject(xhr, 'error', 'server abort'); return; } @@ -492,7 +532,7 @@ $.fn.ajaxSubmit = function(options) { } if (io.detachEvent) io.detachEvent('onload', cb); - else + else io.removeEventListener('load', cb, false); var status = 'success', errMsg; @@ -586,6 +626,7 @@ $.fn.ajaxSubmit = function(options) { if (status === 'success') { if (s.success) s.success.call(s.context, data, 'success', xhr); + deferred.resolve(xhr.responseText, 'success', xhr); if (g) $.event.trigger("ajaxSuccess", [xhr, s]); } @@ -594,6 +635,7 @@ $.fn.ajaxSubmit = function(options) { errMsg = xhr.statusText; if (s.error) s.error.call(s.context, xhr, status, errMsg); + deferred.reject(xhr, 'error', errMsg); if (g) $.event.trigger("ajaxError", [xhr, s, errMsg]); } @@ -658,6 +700,8 @@ $.fn.ajaxSubmit = function(options) { } return data; }; + + return deferred; } }; @@ -679,7 +723,7 @@ $.fn.ajaxSubmit = function(options) { $.fn.ajaxForm = function(options) { options = options || {}; options.delegation = options.delegation && $.isFunction($.fn.on); - + // in jQuery 1.3+ we can fix mistakes with the ready state if (!options.delegation && this.length === 0) { var o = { s: this.selector, c: this.context }; @@ -709,7 +753,7 @@ $.fn.ajaxForm = function(options) { .bind('click.form-plugin', options, captureSubmittingElement); }; -// private event handlers +// private event handlers function doAjaxSubmit(e) { /*jshint validthis:true */ var options = e.data; @@ -718,14 +762,14 @@ function doAjaxSubmit(e) { $(this).ajaxSubmit(options); } } - + function captureSubmittingElement(e) { /*jshint validthis:true */ var target = e.target; var $el = $(target); - if (!($el.is(":submit,input:image"))) { + if (!($el.is("[type=submit],[type=image]"))) { // is this a child element of the submit el? (ex: a span within a button) - var t = $el.closest(':submit'); + var t = $el.closest('[type=submit]'); if (t.length === 0) { return; } @@ -798,14 +842,14 @@ $.fn.formToArray = function(semantic, elements) { v = $.fieldValue(el, true); if (v && v.constructor == Array) { - if (elements) + if (elements) elements.push(el); for(j=0, jmax=v.length; j < jmax; j++) { a.push({name: n, value: v[j]}); } } else if (feature.fileapi && el.type == 'file' && !el.disabled) { - if (elements) + if (elements) elements.push(el); var files = el.files; if (files.length) { @@ -819,7 +863,7 @@ $.fn.formToArray = function(semantic, elements) { } } else if (v !== null && typeof v != 'undefined') { - if (elements) + if (elements) elements.push(el); a.push({name: n, value: v, type: el.type, required: el.required}); } @@ -883,19 +927,19 @@ $.fn.fieldSerialize = function(successful) { * * * - * var v = $(':text').fieldValue(); + * var v = $('input[type=text]').fieldValue(); * // if no values are entered into the text inputs * v == ['',''] * // if values entered into the text inputs are 'foo' and 'bar' * v == ['foo','bar'] * - * var v = $(':checkbox').fieldValue(); + * var v = $('input[type=checkbox]').fieldValue(); * // if neither checkbox is checked * v === undefined * // if both checkboxes are checked * v == ['B1', 'B2'] * - * var v = $(':radio').fieldValue(); + * var v = $('input[type=radio]').fieldValue(); * // if neither radio is checked * v === undefined * // if first radio is checked @@ -996,8 +1040,15 @@ $.fn.clearFields = $.fn.clearInputs = function(includeHidden) { else if (tag == 'select') { this.selectedIndex = -1; } + else if (t == "file") { + if (/MSIE/.test(navigator.userAgent)) { + $(this).replaceWith($(this).clone()); + } else { + $(this).val(''); + } + } else if (includeHidden) { - // includeHidden can be the valud true, or it can be a selector string + // includeHidden can be the value true, or it can be a selector string // indicating a special test; for example: // $('#myForm').clearForm('.special:hidden') // the above would clean hidden inputs that have the class of 'special' @@ -1062,7 +1113,7 @@ $.fn.ajaxSubmit.debug = false; // helper fn for console logging function log() { - if (!$.fn.ajaxSubmit.debug) + if (!$.fn.ajaxSubmit.debug) return; var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,''); if (window.console && window.console.log) { diff --git a/openslides/projector/static/styles/dashboard.css b/openslides/projector/static/styles/dashboard.css index 1ff1b62ed..fd5134bdb 100644 --- a/openslides/projector/static/styles/dashboard.css +++ b/openslides/projector/static/styles/dashboard.css @@ -5,32 +5,71 @@ * :license: GNU GPL, see LICENSE for more details. */ -/* Portlet */ +/** Widgets **/ .column { width: 50%; float: left; padding-bottom: 100px; } -.portlet { +.widget { margin: 0 10px 10px 0; } -.portlet-header { - margin: 0.3em; - padding-bottom: 4px; - padding-left: 0.2em; +.widget-header { + height: 30px; + background: #E9E9E9; + background:-moz-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); /* FF3.6+ */ + background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#FAFAFA), color-stop(100%,#E9E9E9)); /* Chrome,Safari4+ */ + background:-webkit-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* Chrome10+,Safari5.1+ */ + background:-o-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* Opera11.10+ */ + background:-ms-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* IE10+ */ + background:linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9'); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9')"; + border: 1px solid #D5D5D5; + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + } -.portlet-header .ui-icon { - float: right; +.widget-header h3 { + padding-left: 7px; + margin: 7px 0; + display: inline-block; + font-size: 14px; + color: #555; + line-height: 18px; } -.portlet-content { - padding: 0.4em; - overflow: hidden; + +.widget-header [class^="icon-"], .widget-header [class*=" icon-"] { + display: inline-block; + margin: -2px 0 0 13px; + color: #555; + vertical-align: middle; } -.portlet-content li{ +.widget-content { + padding: 20px 15px 15px 13px; + background: #FFF; + border: 1px solid #D5D5D5; + border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; +} +.widget-content li { padding: 4px 0; } +.widget-content .overlay_list li { + padding-bottom: 10px; +} +.widget-content ul { + list-style: none inside none; + margin: 0; +} +.widget-content hr { + margin: 5px 0; +} + .ui-sortable-placeholder { - border: 1px dotted black; + border: 2px dashed #555555; visibility: visible !important; height: 50px !important; } @@ -38,11 +77,12 @@ visibility: hidden; } -/*.projector_countdown_spinval {*/ +.overlay_list .form-inline { + margin: 5px 0 0 31px; +} #countdown_time { width: 40px; - height: 16px; } /* iframe */ @@ -53,18 +93,16 @@ -moz-transform: scale(0.25); -webkit-transform: scale(0.25); -o-transform: scale(0.25); - width: 1024px; height: 768px; } - #iframewrapper { width: 256px;/*100%;*/ height: 192px;/*230px;*/ position: relative; overflow: hidden; + border: 1px solid #D5D5D5; } - #iframeoverlay { width: 256px; height: 192px; @@ -74,38 +112,3 @@ display: block; z-index: 1; } - -/* activate link */ -a.activate_link div { - background-image: url(../images/icons/accept-grey.png); - background-repeat: no-repeat; - float: left; - width: 16px; - height: 16px; - padding-right: 12px; - position: relative; - top: 4px; - left: 4px; -} -a.activate_link.active div { - background-image: url(../images/icons/accept.png); -} - -a.overlay div { - background-image: url(../images/icons/accept-grey.png); - background-repeat: no-repeat; - float: left; - width: 16px; - height: 16px; - padding-right: 16px; - position: relative; - top: 4px; - left: 4px; -} - -a.overlay.active div { - background-image: url(../images/icons/accept.png); -} - - - diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png b/openslides/projector/static/styles/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png deleted file mode 100644 index 688c2f3e8..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_glass_25_cb842e_1x400.png b/openslides/projector/static/styles/humanity/images/ui-bg_glass_25_cb842e_1x400.png deleted file mode 100644 index 1936896d8..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_glass_25_cb842e_1x400.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_glass_70_ede4d4_1x400.png b/openslides/projector/static/styles/humanity/images/ui-bg_glass_70_ede4d4_1x400.png deleted file mode 100644 index 779ef0d0e..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_glass_70_ede4d4_1x400.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png deleted file mode 100644 index 8766f0018..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png deleted file mode 100644 index 52d3a3418..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png deleted file mode 100644 index af01f1208..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png deleted file mode 100644 index 894bf7510..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_c47a23_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_c47a23_256x240.png deleted file mode 100644 index 69f2f553d..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_c47a23_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_cb672b_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_cb672b_256x240.png deleted file mode 100644 index b75ecdabd..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_cb672b_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_f08000_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_f08000_256x240.png deleted file mode 100644 index f0a003fad..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_f08000_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_f35f07_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_f35f07_256x240.png deleted file mode 100644 index 1105d2a24..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_f35f07_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_ff7519_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_ff7519_256x240.png deleted file mode 100644 index 544517142..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_ff7519_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_ffffff_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index 42f8f992c..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/jquery-ui-1.8.18.custom.css b/openslides/projector/static/styles/humanity/jquery-ui-1.8.18.custom.css deleted file mode 100644 index 3bc67982d..000000000 --- a/openslides/projector/static/styles/humanity/jquery-ui-1.8.18.custom.css +++ /dev/null @@ -1,286 +0,0 @@ -/* - * jQuery UI CSS Framework 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } -.ui-helper-clearfix:after { clear: both; } -.ui-helper-clearfix { zoom: 1; } -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* - * jQuery UI CSS Framework 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/?tr=ffDefault=Helvetica,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cb842e&bgTextureHeader=02_glass.png&bgImgOpacityHeader=25&borderColorHeader=d49768&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=f4f0ec&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=100&borderColorContent=e0cfc2&fcContent=1e1b1d&iconColorContent=c47a23&bgColorDefault=ede4d4&bgTextureDefault=02_glass.png&bgImgOpacityDefault=70&borderColorDefault=cdc3b7&fcDefault=3f3731&iconColorDefault=f08000&bgColorHover=f5f0e5&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=f5ad66&fcHover=a46313&iconColorHover=f08000&bgColorActive=f4f0ec&bgTextureActive=04_highlight_hard.png&bgImgOpacityActive=100&borderColorActive=e0cfc2&fcActive=b85700&iconColorActive=f35f07&bgColorHighlight=f5f5b5&bgTextureHighlight=04_highlight_hard.png&bgImgOpacityHighlight=75&borderColorHighlight=d9bb73&fcHighlight=060200&iconColorHighlight=cb672b&bgColorError=fee4bd&bgTextureError=04_highlight_hard.png&bgImgOpacityError=65&borderColorError=f8893f&fcError=592003&iconColorError=ff7519&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-size: 1em; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-size: 1em; } -.ui-widget-content { border: 1px solid #e0cfc2; background: #f4f0ec url(images/ui-bg_inset-soft_100_f4f0ec_1x100.png) 50% bottom repeat-x; color: #1e1b1d; } -.ui-widget-header { border: 1px solid #d49768; background: #cb842e url(images/ui-bg_glass_25_cb842e_1x400.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } -.ui-widget-header a { color: #ffffff; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cdc3b7; background: #ede4d4 url(images/ui-bg_glass_70_ede4d4_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #3f3731; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #3f3731; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #f5ad66; background: #f5f0e5 url(images/ui-bg_glass_100_f5f0e5_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #a46313; } -.ui-state-hover a, .ui-state-hover a:hover { color: #a46313; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #e0cfc2; background: #f4f0ec url(images/ui-bg_highlight-hard_100_f4f0ec_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #b85700; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #b85700; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #d9bb73; background: #f5f5b5 url(images/ui-bg_highlight-hard_75_f5f5b5_1x100.png) 50% top repeat-x; color: #060200; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #060200; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #f8893f; background: #fee4bd url(images/ui-bg_highlight-hard_65_fee4bd_1x100.png) 50% top repeat-x; color: #592003; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #592003; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #592003; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_c47a23_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_c47a23_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_f08000_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_f08000_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_f35f07_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_cb672b_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ff7519_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } \ No newline at end of file diff --git a/openslides/projector/static/styles/projector.css b/openslides/projector/static/styles/projector.css index 423c8039d..2f22b4550 100644 --- a/openslides/projector/static/styles/projector.css +++ b/openslides/projector/static/styles/projector.css @@ -18,7 +18,7 @@ body{ /*** HEADER ***/ #header { position:relative; - background:url("../images/presentation-header-bg.png") repeat-x scroll center top #3D3020; + background:url("../img/presentation-header-bg.png") repeat-x scroll center top #3D3020; height:100px; } #logo { @@ -58,7 +58,7 @@ body{ top:110px; right:40px; padding-left:30px; - background: url(../images/icons/clock.png) no-repeat scroll 0px 4px; + background: url(../img/glyphicons_054_clock.png) no-repeat scroll 0px 4px; } #currentTime.ajax_error { diff --git a/openslides/projector/templates/base-projector.html b/openslides/projector/templates/base-projector.html index a7a5ac98b..af2845b92 100644 --- a/openslides/projector/templates/base-projector.html +++ b/openslides/projector/templates/base-projector.html @@ -8,7 +8,7 @@ - + {% block title %} {% get_config 'event_name' %} {% endblock %} {% block header %} @@ -21,7 +21,7 @@
        diff --git a/openslides/projector/templates/projector/base_projector.html b/openslides/projector/templates/projector/base_projector.html deleted file mode 100644 index 93418c2cb..000000000 --- a/openslides/projector/templates/projector/base_projector.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block title %}{{ block.super}} – {% trans 'Dashboard' %} {% endblock %} - -{% block submenu %} - {% url 'dashboard' as url_dashboard %} - {% url 'projector_select_widgets' as url_select_widget %} -

        {% trans "Dashboard" %}

        - -{% endblock %} diff --git a/openslides/projector/templates/projector/control_countdown.html b/openslides/projector/templates/projector/control_countdown.html index 1109596ad..837666093 100644 --- a/openslides/projector/templates/projector/control_countdown.html +++ b/openslides/projector/templates/projector/control_countdown.html @@ -1,19 +1,21 @@ -{% load staticfiles %} {% load i18n %} {% load tags %} - - {% trans "s" context "seconds" %} - - {% url 'countdown_set_default' %} + diff --git a/openslides/projector/templates/projector/control_overlay_message.html b/openslides/projector/templates/projector/control_overlay_message.html index 2d7c631f7..ee10ace99 100644 --- a/openslides/projector/templates/projector/control_overlay_message.html +++ b/openslides/projector/templates/projector/control_overlay_message.html @@ -1,15 +1,14 @@ -{% load staticfiles %} {% load i18n %} {% load tags %} -
        {% csrf_token %} - - - +
        - diff --git a/openslides/projector/templates/projector/custom_slide_widget.html b/openslides/projector/templates/projector/custom_slide_widget.html index a188a42a8..f4c805047 100644 --- a/openslides/projector/templates/projector/custom_slide_widget.html +++ b/openslides/projector/templates/projector/custom_slide_widget.html @@ -1,15 +1,13 @@ -{% load staticfiles %} {% load i18n %} {% load tags %} -
        • - -
          -
          - - + + +   + + {% trans 'Welcome Page' %}
        • @@ -18,28 +16,26 @@ - - +

          + + {% trans 'New' %} - - +

          \ No newline at end of file diff --git a/openslides/projector/templates/projector/dashboard.html b/openslides/projector/templates/projector/dashboard.html index 4debd4139..11d5f3a7b 100644 --- a/openslides/projector/templates/projector/dashboard.html +++ b/openslides/projector/templates/projector/dashboard.html @@ -1,27 +1,35 @@ -{% extends "projector/base_projector.html" %} +{% extends "base.html" %} {% load tags %} {% load i18n %} {% load staticfiles %} {% block header %} - - - +{% endblock %} +{% block javascript %} + + {% endblock %} {% block content %} -

          {% trans 'Dashboard' %}

          +

          {% trans 'Dashboard' %} + + {% trans 'Widgets' %} + +

          {% for name, widget in widgets.items %} {% if widget.default_column == 1 %} -
          -
          {% trans widget.get_title %}
          -
          +
          +
          + +

          {% trans widget.get_title %}

          +
          +
          {{ widget.html }}
          @@ -32,9 +40,11 @@
          {% for name, widget in widgets.items %} {% if widget.default_column == 2 %} -
          -
          {% trans widget.get_title %}
          -
          +
          +
          +

          {% trans widget.get_title %}

          +

          +
          {{ widget.html }}
          diff --git a/openslides/projector/templates/projector/live_view_widget.html b/openslides/projector/templates/projector/live_view_widget.html index 2971e27f0..cd49a453f 100644 --- a/openslides/projector/templates/projector/live_view_widget.html +++ b/openslides/projector/templates/projector/live_view_widget.html @@ -1,36 +1,34 @@ {% load i18n %} {% load tags %} -{% load staticfiles %} - {% if perms.projector.can_manage_projector %} {% endif %} - +
          diff --git a/openslides/projector/templates/projector/new.html b/openslides/projector/templates/projector/new.html index b01027434..f61e5a049 100644 --- a/openslides/projector/templates/projector/new.html +++ b/openslides/projector/templates/projector/new.html @@ -1,4 +1,4 @@ -{% extends "projector/base_projector.html" %} +{% extends "base.html" %} {% load tags %} {% load i18n %} @@ -6,19 +6,16 @@ {% block title %}{{ block.super }} – {% trans "Custom slide" %}{% endblock %} {% block content %} -

          {% trans 'Custom slide' %}

          +

          {% trans 'Custom slide' %} + + {% trans "Back to overview" %} + +

          {% csrf_token %} - {{ form.as_p }} - - - - - + {% include "form.html" %} +

          + {% include "formbuttons_saveapply.html" %} +

          + * {% trans "required" %}
          {% endblock %} diff --git a/openslides/projector/templates/projector/overlay_widget.html b/openslides/projector/templates/projector/overlay_widget.html index 7a98c67de..b0cb79205 100644 --- a/openslides/projector/templates/projector/overlay_widget.html +++ b/openslides/projector/templates/projector/overlay_widget.html @@ -1,22 +1,29 @@ {% load i18n %} {% load tags %} -
            +
              {% for overlay in overlays %}
            • - + - + - {{ overlay }}: {# TODO: Call the html via overlay.html #} {% if overlay.def_name == "Countdown" %} + {% trans "Countdown for speaking time" %}:
              {% include 'projector/control_countdown.html' %} {% endif %} {% if overlay.def_name == "Message" %} + {% trans "Message" %}:
              {% include 'projector/control_overlay_message.html' %} {% endif %}
            • diff --git a/openslides/projector/templates/projector/select_widgets.html b/openslides/projector/templates/projector/select_widgets.html index 04e4a9c05..75d1f6f86 100644 --- a/openslides/projector/templates/projector/select_widgets.html +++ b/openslides/projector/templates/projector/select_widgets.html @@ -1,25 +1,31 @@ -{% extends "projector/base_projector.html" %} +{% extends "base.html" %} {% load i18n %} {% block title %}{{ block.super }} – {% trans 'Select widgets' %}{% endblock %} {% block content %} -

              {% trans 'Select widgets' %}

              +

              {% trans 'Select widgets' %} + + {% trans "Back to overview" %} + +

              {% csrf_token %} -
                +
                  {% for widget_name, widget in widgets.items %}
                • - {{ widget.form.widget }} {{ widget }} +
                • {% empty %}
                • {% trans 'No widgets available' %}
                • {% endfor %}

                -

                diff --git a/openslides/projector/urls.py b/openslides/projector/urls.py index 9c1433ec4..e5a8d49c6 100644 --- a/openslides/projector/urls.py +++ b/openslides/projector/urls.py @@ -10,7 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import patterns, url +from django.conf.urls import patterns, url from openslides.projector.views import (DashboardView, ActivateView, CustomSlideCreateView, CustomSlideUpdateView, CustomSlideDeleteView, diff --git a/openslides/projector/views.py b/openslides/projector/views.py index 997e89cf2..b70cd504d 100644 --- a/openslides/projector/views.py +++ b/openslides/projector/views.py @@ -151,7 +151,7 @@ class ActivateView(RedirectView): Activate a Slide. """ permission_required = 'projector.can_manage_projector' - url = 'dashboard' + url_name = 'dashboard' allow_ajax = True def pre_redirect(self, request, *args, **kwargs): @@ -209,7 +209,7 @@ class ProjectorEdit(RedirectView): Scale or scroll the projector. """ permission_required = 'projector.can_manage_projector' - url = 'dashboard' + url_name = 'dashboard' allow_ajax = True def pre_redirect(self, request, *args, **kwargs): @@ -233,7 +233,7 @@ class CountdownEdit(RedirectView): Start, stop or reset the countdown. """ permission_required = 'projector.can_manage_projector' - url = 'dashboard' + url_name = 'dashboard' allow_ajax = True def pre_redirect(self, request, *args, **kwargs): @@ -284,7 +284,7 @@ class OverlayMessageView(RedirectView): """ Sets or clears the overlay message """ - url = 'dashboard' + url_name = 'dashboard' allow_ajax = True permission_required = 'projector.can_manage_projector' @@ -305,7 +305,7 @@ class ActivateOverlay(RedirectView): """ Activate or deactivate an overlay. """ - url = 'dashboard' + url_name = 'dashboard' allow_ajax = True permission_required = 'projector.can_manage_projector' @@ -341,8 +341,7 @@ class CustomSlideCreateView(CreateView): template_name = 'projector/new.html' model = ProjectorSlide context_object_name = 'customslide' - success_url = 'dashboard' - apply_url = 'customslide_edit' + success_url_name = 'dashboard' class CustomSlideUpdateView(UpdateView): @@ -353,8 +352,7 @@ class CustomSlideUpdateView(UpdateView): template_name = 'projector/new.html' model = ProjectorSlide context_object_name = 'customslide' - success_url = 'dashboard' - apply_url = 'customslide_edit' + success_url_name = 'dashboard' class CustomSlideDeleteView(DeleteView): @@ -363,7 +361,7 @@ class CustomSlideDeleteView(DeleteView): """ permission_required = 'projector.can_manage_projector' model = ProjectorSlide - url = 'dashboard' + success_url_name = 'dashboard' def register_tab(request): @@ -373,6 +371,7 @@ def register_tab(request): selected = request.path.startswith('/projector/') return Tab( title=_('Dashboard'), + app='dashboard', url=reverse('dashboard'), permission=request.user.has_perm('projector.can_see_dashboard'), selected=selected, diff --git a/openslides/static/images/bg-header.gif b/openslides/static/images/bg-header.gif deleted file mode 100644 index c69df6fbd..000000000 Binary files a/openslides/static/images/bg-header.gif and /dev/null differ diff --git a/openslides/static/images/bg-submenu.gif b/openslides/static/images/bg-submenu.gif deleted file mode 100644 index 91880b8b3..000000000 Binary files a/openslides/static/images/bg-submenu.gif and /dev/null differ diff --git a/openslides/static/images/button.gif b/openslides/static/images/button.gif deleted file mode 100644 index 37ee55372..000000000 Binary files a/openslides/static/images/button.gif and /dev/null differ diff --git a/openslides/static/images/icons/accept-grey.png b/openslides/static/images/icons/accept-grey.png deleted file mode 100644 index d6c64cfab..000000000 Binary files a/openslides/static/images/icons/accept-grey.png and /dev/null differ diff --git a/openslides/static/images/icons/accept.png b/openslides/static/images/icons/accept.png deleted file mode 100644 index 225abbf4d..000000000 Binary files a/openslides/static/images/icons/accept.png and /dev/null differ diff --git a/openslides/static/images/icons/add-user.png b/openslides/static/images/icons/add-user.png deleted file mode 100644 index b413be26a..000000000 Binary files a/openslides/static/images/icons/add-user.png and /dev/null differ diff --git a/openslides/static/images/icons/add.png b/openslides/static/images/icons/add.png deleted file mode 100644 index 1e03be9bc..000000000 Binary files a/openslides/static/images/icons/add.png and /dev/null differ diff --git a/openslides/static/images/icons/clear.png b/openslides/static/images/icons/clear.png deleted file mode 100644 index 6c4b83b7a..000000000 Binary files a/openslides/static/images/icons/clear.png and /dev/null differ diff --git a/openslides/static/images/icons/close-grey.png b/openslides/static/images/icons/close-grey.png deleted file mode 100644 index b843656fc..000000000 Binary files a/openslides/static/images/icons/close-grey.png and /dev/null differ diff --git a/openslides/static/images/icons/close.png b/openslides/static/images/icons/close.png deleted file mode 100644 index 1c311e210..000000000 Binary files a/openslides/static/images/icons/close.png and /dev/null differ diff --git a/openslides/static/images/icons/cross.png b/openslides/static/images/icons/cross.png deleted file mode 100644 index 0cdfc1d42..000000000 Binary files a/openslides/static/images/icons/cross.png and /dev/null differ diff --git a/openslides/static/images/icons/delete.png b/openslides/static/images/icons/delete.png deleted file mode 100644 index 87cd0b012..000000000 Binary files a/openslides/static/images/icons/delete.png and /dev/null differ diff --git a/openslides/static/images/icons/dialog-cancel.png b/openslides/static/images/icons/dialog-cancel.png deleted file mode 100644 index 45f8949bf..000000000 Binary files a/openslides/static/images/icons/dialog-cancel.png and /dev/null differ diff --git a/openslides/static/images/icons/dialog-ok-apply.png b/openslides/static/images/icons/dialog-ok-apply.png deleted file mode 100644 index f1d290c64..000000000 Binary files a/openslides/static/images/icons/dialog-ok-apply.png and /dev/null differ diff --git a/openslides/static/images/icons/dialog-ok.png b/openslides/static/images/icons/dialog-ok.png deleted file mode 100644 index c173526fa..000000000 Binary files a/openslides/static/images/icons/dialog-ok.png and /dev/null differ diff --git a/openslides/static/images/icons/done-grey.png b/openslides/static/images/icons/done-grey.png deleted file mode 100644 index 4e5e16f47..000000000 Binary files a/openslides/static/images/icons/done-grey.png and /dev/null differ diff --git a/openslides/static/images/icons/done.png b/openslides/static/images/icons/done.png deleted file mode 100644 index 5ea69d2dd..000000000 Binary files a/openslides/static/images/icons/done.png and /dev/null differ diff --git a/openslides/static/images/icons/edit.png b/openslides/static/images/icons/edit.png deleted file mode 100644 index 84e345d22..000000000 Binary files a/openslides/static/images/icons/edit.png and /dev/null differ diff --git a/openslides/static/images/icons/error.png b/openslides/static/images/icons/error.png deleted file mode 100644 index 0281708ab..000000000 Binary files a/openslides/static/images/icons/error.png and /dev/null differ diff --git a/openslides/static/images/icons/export.png b/openslides/static/images/icons/export.png deleted file mode 100644 index ebcc0fa9a..000000000 Binary files a/openslides/static/images/icons/export.png and /dev/null differ diff --git a/openslides/static/images/icons/guest.png b/openslides/static/images/icons/guest.png deleted file mode 100644 index b50ec42a5..000000000 Binary files a/openslides/static/images/icons/guest.png and /dev/null differ diff --git a/openslides/static/images/icons/import.png b/openslides/static/images/icons/import.png deleted file mode 100644 index 66305f4ad..000000000 Binary files a/openslides/static/images/icons/import.png and /dev/null differ diff --git a/openslides/static/images/icons/information.png b/openslides/static/images/icons/information.png deleted file mode 100644 index cbabb0e54..000000000 Binary files a/openslides/static/images/icons/information.png and /dev/null differ diff --git a/openslides/static/images/icons/number.png b/openslides/static/images/icons/number.png deleted file mode 100644 index 87e23bb31..000000000 Binary files a/openslides/static/images/icons/number.png and /dev/null differ diff --git a/openslides/static/images/icons/off.png b/openslides/static/images/icons/off.png deleted file mode 100644 index fd50901be..000000000 Binary files a/openslides/static/images/icons/off.png and /dev/null differ diff --git a/openslides/static/images/icons/on.png b/openslides/static/images/icons/on.png deleted file mode 100644 index 1221e1310..000000000 Binary files a/openslides/static/images/icons/on.png and /dev/null differ diff --git a/openslides/static/images/icons/pdf.png b/openslides/static/images/icons/pdf.png deleted file mode 100644 index 9498f0ffd..000000000 Binary files a/openslides/static/images/icons/pdf.png and /dev/null differ diff --git a/openslides/static/images/icons/preview.png b/openslides/static/images/icons/preview.png deleted file mode 100644 index 3b674c3bd..000000000 Binary files a/openslides/static/images/icons/preview.png and /dev/null differ diff --git a/openslides/static/images/icons/projector.png b/openslides/static/images/icons/projector.png deleted file mode 100644 index cb2be2258..000000000 Binary files a/openslides/static/images/icons/projector.png and /dev/null differ diff --git a/openslides/static/images/icons/reject-grey.png b/openslides/static/images/icons/reject-grey.png deleted file mode 100644 index b34520453..000000000 Binary files a/openslides/static/images/icons/reject-grey.png and /dev/null differ diff --git a/openslides/static/images/icons/reject.png b/openslides/static/images/icons/reject.png deleted file mode 100644 index 9006b077d..000000000 Binary files a/openslides/static/images/icons/reject.png and /dev/null differ diff --git a/openslides/static/images/icons/remove-user.png b/openslides/static/images/icons/remove-user.png deleted file mode 100644 index 6ac1d6846..000000000 Binary files a/openslides/static/images/icons/remove-user.png and /dev/null differ diff --git a/openslides/static/images/icons/remove.png b/openslides/static/images/icons/remove.png deleted file mode 100644 index 5a4d15b7b..000000000 Binary files a/openslides/static/images/icons/remove.png and /dev/null differ diff --git a/openslides/static/images/icons/revert.png b/openslides/static/images/icons/revert.png deleted file mode 100644 index b224e05e8..000000000 Binary files a/openslides/static/images/icons/revert.png and /dev/null differ diff --git a/openslides/static/images/icons/statistics.png b/openslides/static/images/icons/statistics.png deleted file mode 100644 index 5a05fa48d..000000000 Binary files a/openslides/static/images/icons/statistics.png and /dev/null differ diff --git a/openslides/static/images/icons/undo.png b/openslides/static/images/icons/undo.png deleted file mode 100644 index 83e41dcf3..000000000 Binary files a/openslides/static/images/icons/undo.png and /dev/null differ diff --git a/openslides/static/images/icons/user-information.png b/openslides/static/images/icons/user-information.png deleted file mode 100644 index 346f21e7b..000000000 Binary files a/openslides/static/images/icons/user-information.png and /dev/null differ diff --git a/openslides/static/images/icons/warning.png b/openslides/static/images/icons/warning.png deleted file mode 100644 index 1abe3f3f9..000000000 Binary files a/openslides/static/images/icons/warning.png and /dev/null differ diff --git a/openslides/static/images/circle.png b/openslides/static/img/circle.png similarity index 100% rename from openslides/static/images/circle.png rename to openslides/static/img/circle.png diff --git a/openslides/static/images/draggable.png b/openslides/static/img/draggable.png similarity index 100% rename from openslides/static/images/draggable.png rename to openslides/static/img/draggable.png diff --git a/openslides/static/images/favicon.png b/openslides/static/img/favicon.png similarity index 100% rename from openslides/static/images/favicon.png rename to openslides/static/img/favicon.png diff --git a/openslides/static/img/glyphicons-halflings-white.png b/openslides/static/img/glyphicons-halflings-white.png new file mode 100644 index 000000000..3bf6484a2 Binary files /dev/null and b/openslides/static/img/glyphicons-halflings-white.png differ diff --git a/openslides/static/img/glyphicons-halflings.png b/openslides/static/img/glyphicons-halflings.png new file mode 100644 index 000000000..a99699932 Binary files /dev/null and b/openslides/static/img/glyphicons-halflings.png differ diff --git a/openslides/static/img/glyphicons_006_user_add.png b/openslides/static/img/glyphicons_006_user_add.png new file mode 100644 index 000000000..098d70d3d Binary files /dev/null and b/openslides/static/img/glyphicons_006_user_add.png differ diff --git a/openslides/static/img/glyphicons_041_charts.png b/openslides/static/img/glyphicons_041_charts.png new file mode 100644 index 000000000..556b7cce5 Binary files /dev/null and b/openslides/static/img/glyphicons_041_charts.png differ diff --git a/openslides/static/img/glyphicons_041_charts_white.png b/openslides/static/img/glyphicons_041_charts_white.png new file mode 100644 index 000000000..83cd93b8c Binary files /dev/null and b/openslides/static/img/glyphicons_041_charts_white.png differ diff --git a/openslides/static/img/glyphicons_043_group.png b/openslides/static/img/glyphicons_043_group.png new file mode 100644 index 000000000..d0cf9eeed Binary files /dev/null and b/openslides/static/img/glyphicons_043_group.png differ diff --git a/openslides/static/img/glyphicons_043_group_white.png b/openslides/static/img/glyphicons_043_group_white.png new file mode 100644 index 000000000..94908b008 Binary files /dev/null and b/openslides/static/img/glyphicons_043_group_white.png differ diff --git a/openslides/static/img/glyphicons_044_keys.png b/openslides/static/img/glyphicons_044_keys.png new file mode 100644 index 000000000..600345713 Binary files /dev/null and b/openslides/static/img/glyphicons_044_keys.png differ diff --git a/openslides/static/img/glyphicons_045_calendar.png b/openslides/static/img/glyphicons_045_calendar.png new file mode 100644 index 000000000..937daeed0 Binary files /dev/null and b/openslides/static/img/glyphicons_045_calendar.png differ diff --git a/openslides/static/img/glyphicons_045_calendar_white.png b/openslides/static/img/glyphicons_045_calendar_white.png new file mode 100644 index 000000000..bbc8ff595 Binary files /dev/null and b/openslides/static/img/glyphicons_045_calendar_white.png differ diff --git a/openslides/static/img/glyphicons_152_check.png b/openslides/static/img/glyphicons_152_check.png new file mode 100644 index 000000000..bbb6dcae5 Binary files /dev/null and b/openslides/static/img/glyphicons_152_check.png differ diff --git a/openslides/static/img/glyphicons_152_check_white.png b/openslides/static/img/glyphicons_152_check_white.png new file mode 100644 index 000000000..0c4f5fd1a Binary files /dev/null and b/openslides/static/img/glyphicons_152_check_white.png differ diff --git a/openslides/static/img/glyphicons_153_unchecked.png b/openslides/static/img/glyphicons_153_unchecked.png new file mode 100644 index 000000000..23bced66a Binary files /dev/null and b/openslides/static/img/glyphicons_153_unchecked.png differ diff --git a/openslides/static/img/glyphicons_154_more_windows.png b/openslides/static/img/glyphicons_154_more_windows.png new file mode 100644 index 000000000..5f533aa7b Binary files /dev/null and b/openslides/static/img/glyphicons_154_more_windows.png differ diff --git a/openslides/static/img/glyphicons_154_more_windows_white.png b/openslides/static/img/glyphicons_154_more_windows_white.png new file mode 100644 index 000000000..ed393b222 Binary files /dev/null and b/openslides/static/img/glyphicons_154_more_windows_white.png differ diff --git a/openslides/static/img/glyphicons_256_delete.png b/openslides/static/img/glyphicons_256_delete.png new file mode 100644 index 000000000..81282f990 Binary files /dev/null and b/openslides/static/img/glyphicons_256_delete.png differ diff --git a/openslides/static/img/glyphicons_358_file_import.png b/openslides/static/img/glyphicons_358_file_import.png new file mode 100644 index 000000000..36dd2c322 Binary files /dev/null and b/openslides/static/img/glyphicons_358_file_import.png differ diff --git a/openslides/static/img/logo-login.png b/openslides/static/img/logo-login.png new file mode 100644 index 000000000..edd092950 Binary files /dev/null and b/openslides/static/img/logo-login.png differ diff --git a/openslides/static/images/logo.png b/openslides/static/img/logo-small.png similarity index 100% rename from openslides/static/images/logo.png rename to openslides/static/img/logo-small.png diff --git a/openslides/static/img/logo.png b/openslides/static/img/logo.png new file mode 100644 index 000000000..9b81eb762 Binary files /dev/null and b/openslides/static/img/logo.png differ diff --git a/openslides/static/images/tree-bottom.png b/openslides/static/img/tree-bottom.png similarity index 100% rename from openslides/static/images/tree-bottom.png rename to openslides/static/img/tree-bottom.png diff --git a/openslides/static/images/tree.png b/openslides/static/img/tree.png similarity index 100% rename from openslides/static/images/tree.png rename to openslides/static/img/tree.png diff --git a/openslides/static/images/icons/voting-abstention.png b/openslides/static/img/voting-abstention.png similarity index 100% rename from openslides/static/images/icons/voting-abstention.png rename to openslides/static/img/voting-abstention.png diff --git a/openslides/static/images/icons/voting-invalid.png b/openslides/static/img/voting-invalid.png similarity index 100% rename from openslides/static/images/icons/voting-invalid.png rename to openslides/static/img/voting-invalid.png diff --git a/openslides/static/images/icons/voting-no.png b/openslides/static/img/voting-no.png similarity index 100% rename from openslides/static/images/icons/voting-no.png rename to openslides/static/img/voting-no.png diff --git a/openslides/static/images/icons/voting-total.png b/openslides/static/img/voting-total.png similarity index 100% rename from openslides/static/images/icons/voting-total.png rename to openslides/static/img/voting-total.png diff --git a/openslides/static/images/icons/voting-yes-grey.png b/openslides/static/img/voting-yes-grey.png similarity index 100% rename from openslides/static/images/icons/voting-yes-grey.png rename to openslides/static/img/voting-yes-grey.png diff --git a/openslides/static/images/icons/voting-yes.png b/openslides/static/img/voting-yes.png similarity index 100% rename from openslides/static/images/icons/voting-yes.png rename to openslides/static/img/voting-yes.png diff --git a/openslides/static/javascript/bootstrap.min.js b/openslides/static/javascript/bootstrap.min.js new file mode 100644 index 000000000..6eeb15ce3 --- /dev/null +++ b/openslides/static/javascript/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! +* Bootstrap.js by @fat & @mdo +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function($){"use strict";$(function(){$.support.transition=function(){var transitionEnd=function(){var name,el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(name in transEndEventNames)if(void 0!==el.style[name])return transEndEventNames[name]}();return transitionEnd&&{end:transitionEnd}}()})}(window.jQuery),!function($){"use strict";var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.prototype.close=function(e){function removeElement(){$parent.trigger("closed").remove()}var $parent,$this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.on($.support.transition.end,removeElement):removeElement())};var old=$.fn.alert;$.fn.alert=function(option){return this.each(function(){var $this=$(this),data=$this.data("alert");data||$this.data("alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})},$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.alert.data-api",dismiss,Alert.prototype.close)}(window.jQuery),!function($){"use strict";var Button=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.button.defaults,options)};Button.prototype.setState=function(state){var d="disabled",$el=this.$element,data=$el.data(),val=$el.is("input")?"val":"html";state+="Text",data.resetText||$el.data("resetText",$el[val]()),$el[val](data[state]||this.options[state]),setTimeout(function(){"loadingText"==state?$el.addClass(d).attr(d,d):$el.removeClass(d).removeAttr(d)},0)},Button.prototype.toggle=function(){var $parent=this.$element.closest('[data-toggle="buttons-radio"]');$parent&&$parent.find(".active").removeClass("active"),this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=function(option){return this.each(function(){var $this=$(this),data=$this.data("button"),options="object"==typeof option&&option;data||$this.data("button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})},$.fn.button.defaults={loadingText:"loading..."},$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.button.data-api","[data-toggle^=button]",function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),$btn.button("toggle")})}(window.jQuery),!function($){"use strict";var Carousel=function(element,options){this.$element=$(element),this.options=options,"hover"==this.options.pause&&this.$element.on("mouseenter",$.proxy(this.pause,this)).on("mouseleave",$.proxy(this.cycle,this))};Carousel.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},to:function(pos){var $active=this.$element.find(".item.active"),children=$active.parent().children(),activePos=children.index($active),that=this;if(!(pos>children.length-1||0>pos))return this.sliding?this.$element.one("slid",function(){that.to(pos)}):activePos==pos?this.pause().cycle():this.slide(pos>activePos?"next":"prev",$(children[pos]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition.end&&(this.$element.trigger($.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(type,next){var e,$active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(this.sliding=!0,isCycling&&this.pause(),$next=$next.length?$next:this.$element.find(".item")[fallback](),e=$.Event("slide",{relatedTarget:$next[0]}),!$next.hasClass("active")){if($.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(e),e.isDefaultPrevented())return;$next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),this.$element.one($.support.transition.end,function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger("slid")},0)})}else{if(this.$element.trigger(e),e.isDefaultPrevented())return;$active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return isCycling&&this.cycle(),this}}};var old=$.fn.carousel;$.fn.carousel=function(option){return this.each(function(){var $this=$(this),data=$this.data("carousel"),options=$.extend({},$.fn.carousel.defaults,"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.cycle()})},$.fn.carousel.defaults={interval:5e3,pause:"hover"},$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.carousel.data-api","[data-slide]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")),options=$.extend({},$target.data(),$this.data());$target.carousel(options),e.preventDefault()})}(window.jQuery),!function($){"use strict";var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.collapse.defaults,options),this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.prototype={constructor:Collapse,dimension:function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},show:function(){var dimension,scroll,actives,hasData;if(!this.transitioning){if(dimension=this.dimension(),scroll=$.camelCase(["scroll",dimension].join("-")),actives=this.$parent&&this.$parent.find("> .accordion-group > .in"),actives&&actives.length){if(hasData=actives.data("collapse"),hasData&&hasData.transitioning)return;actives.collapse("hide"),hasData||actives.data("collapse",null)}this.$element[dimension](0),this.transition("addClass",$.Event("show"),"shown"),$.support.transition&&this.$element[dimension](this.$element[0][scroll])}},hide:function(){var dimension;this.transitioning||(dimension=this.dimension(),this.reset(this.$element[dimension]()),this.transition("removeClass",$.Event("hide"),"hidden"),this.$element[dimension](0))},reset:function(size){var dimension=this.dimension();return this.$element.removeClass("collapse")[dimension](size||"auto")[0].offsetWidth,this.$element[null!==size?"addClass":"removeClass"]("collapse"),this},transition:function(method,startEvent,completeEvent){var that=this,complete=function(){"show"==startEvent.type&&that.reset(),that.transitioning=0,that.$element.trigger(completeEvent)};this.$element.trigger(startEvent),startEvent.isDefaultPrevented()||(this.transitioning=1,this.$element[method]("in"),$.support.transition&&this.$element.hasClass("collapse")?this.$element.one($.support.transition.end,complete):complete())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var old=$.fn.collapse;$.fn.collapse=function(option){return this.each(function(){var $this=$(this),data=$this.data("collapse"),options="object"==typeof option&&option;data||$this.data("collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})},$.fn.collapse.defaults={toggle:!0},$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.collapse.data-api","[data-toggle=collapse]",function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),option=$(target).data("collapse")?"toggle":$this.data();$this[$(target).hasClass("in")?"addClass":"removeClass"]("collapsed"),$(target).collapse(option)})}(window.jQuery),!function($){"use strict";function clearMenus(){$(toggle).each(function(){getParent($(this)).removeClass("open")})}function getParent($this){var $parent,selector=$this.attr("data-target");return selector||(selector=$this.attr("href"),selector=selector&&/#/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),$parent.length||($parent=$this.parent()),$parent}var toggle="[data-toggle=dropdown]",Dropdown=function(element){var $el=$(element).on("click.dropdown.data-api",this.toggle);$("html").on("click.dropdown.data-api",function(){$el.parent().removeClass("open")})};Dropdown.prototype={constructor:Dropdown,toggle:function(){var $parent,isActive,$this=$(this);if(!$this.is(".disabled, :disabled"))return $parent=getParent($this),isActive=$parent.hasClass("open"),clearMenus(),isActive||$parent.toggleClass("open"),$this.focus(),!1},keydown:function(e){var $this,$items,$parent,isActive,index;if(/(38|40|27)/.test(e.keyCode)&&($this=$(this),e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled"))){if($parent=getParent($this),isActive=$parent.hasClass("open"),!isActive||isActive&&27==e.keyCode)return $this.click();$items=$("[role=menu] li:not(.divider):visible a",$parent),$items.length&&(index=$items.index($items.filter(":focus")),38==e.keyCode&&index>0&&index--,40==e.keyCode&&$items.length-1>index&&index++,~index||(index=0),$items.eq(index).focus())}}};var old=$.fn.dropdown;$.fn.dropdown=function(option){return this.each(function(){var $this=$(this),data=$this.data("dropdown");data||$this.data("dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})},$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.dropdown.data-api touchstart.dropdown.data-api",clearMenus).on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("touchstart.dropdown.data-api",".dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",toggle+", [role=menu]",Dropdown.prototype.keydown)}(window.jQuery),!function($){"use strict";var Modal=function(element,options){this.options=options,this.$element=$(element).delegate('[data-dismiss="modal"]',"click.dismiss.modal",$.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};Modal.prototype={constructor:Modal,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var that=this,e=$.Event("show");this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(document.body),that.$element.show(),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus(),transition?that.$element.one($.support.transition.end,function(){that.$element.focus().trigger("shown")}):that.$element.focus().trigger("shown")}))},hide:function(e){e&&e.preventDefault(),e=$.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),$(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),$.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var that=this;$(document).on("focusin.modal",function(e){that.$element[0]===e.target||that.$element.has(e.target).length||that.$element.focus()})},escape:function(){var that=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&that.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var that=this,timeout=setTimeout(function(){that.$element.off($.support.transition.end),that.hideModal()},500);this.$element.one($.support.transition.end,function(){clearTimeout(timeout),that.hideModal()})},hideModal:function(){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(callback){var animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;this.$backdrop=$('
      ","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/openslides/static/javascript/jquery.min.js b/openslides/static/javascript/jquery.min.js new file mode 100644 index 000000000..006e95310 --- /dev/null +++ b/openslides/static/javascript/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
      a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
      t
      ",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
      ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
      ",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("