diff --git a/openslides/assignments/serializers.py b/openslides/assignments/serializers.py index a78c9ac1e..9feac5635 100644 --- a/openslides/assignments/serializers.py +++ b/openslides/assignments/serializers.py @@ -12,6 +12,7 @@ from openslides.utils.rest_api import ( ValidationError, ) +from ..utils.validate import validate_html from .models import ( Assignment, AssignmentOption, @@ -209,6 +210,11 @@ class AssignmentFullSerializer(ModelSerializer): 'tags',) validators = (posts_validator,) + def validate(self, data): + if 'description' in data: + data['description'] = validate_html(data['description']) + return data + class AssignmentShortSerializer(AssignmentFullSerializer): """ @@ -231,3 +237,8 @@ class AssignmentShortSerializer(AssignmentFullSerializer): 'agenda_item_id', 'tags',) validators = (posts_validator,) + + def validate(self, data): + if 'description' in data: + data['description'] = validate_html(data['description']) + return data diff --git a/openslides/assignments/static/js/assignments/base.js b/openslides/assignments/static/js/assignments/base.js index d9b4c3bc7..b92c0e100 100644 --- a/openslides/assignments/static/js/assignments/base.js +++ b/openslides/assignments/static/js/assignments/base.js @@ -71,7 +71,7 @@ angular.module('OpenSlidesApp.assignments', []) var skipPercents = config === 'YES_NO' && vote.value === 'Abstain'; if (base && !skipPercents) { - percentNumber = Math.round(vote.weight * 100 / base * 10) / 10; + percentNumber = Math.round(vote.weight * 100 / base * 100) / 100; percentStr = "(" + percentNumber + "%)"; } votes.push({ diff --git a/openslides/assignments/static/js/assignments/site.js b/openslides/assignments/static/js/assignments/site.js index 8a0da0c43..71a870f5e 100644 --- a/openslides/assignments/static/js/assignments/site.js +++ b/openslides/assignments/static/js/assignments/site.js @@ -96,11 +96,13 @@ angular.module('OpenSlidesApp.assignments.site', [ .factory('AssignmentForm', [ 'gettextCatalog', 'operator', + 'Editor', + 'Mediafile', 'Tag', 'Assignment', 'Agenda', 'AgendaTree', - function (gettextCatalog, operator, Tag, Assignment, Agenda, AgendaTree) { + function (gettextCatalog, operator, Editor, Mediafile, Tag, Assignment, Agenda, AgendaTree) { return { // ngDialog for assignment form getDialog: function (assignment) { @@ -117,6 +119,7 @@ angular.module('OpenSlidesApp.assignments.site', [ }, // angular-formly fields for assignment form getFormFields: function (isCreateForm) { + var images = Mediafile.getAllImages(); var formFields = [ { key: 'title', @@ -128,9 +131,12 @@ angular.module('OpenSlidesApp.assignments.site', [ }, { key: 'description', - type: 'textarea', + type: 'editor', templateOptions: { label: gettextCatalog.getString('Description') + }, + data: { + ckeditorOptions: Editor.getOptions(images) } }, { diff --git a/openslides/assignments/static/templates/assignments/assignment-detail.html b/openslides/assignments/static/templates/assignments/assignment-detail.html index ca82c57e6..b441a726e 100644 --- a/openslides/assignments/static/templates/assignments/assignment-detail.html +++ b/openslides/assignments/static/templates/assignments/assignment-detail.html @@ -77,10 +77,10 @@
Candidates - | Votes | +Votes | |
---|---|---|---|
+ | - {{ option.candidate.get_full_name() }} + {{ option.candidate.get_full_name() }} - | + |
- {{ votes[0].label | translate }}: {{ votes[0].value }} ·
- {{ votes[1].label | translate }}: {{ votes[1].value }} ·
- {{ votes[2].label | translate }}: {{ votes[2].value }}
+ {{ votes[0].label | translate }}: {{ votes[0].value }} {{ votes[0].percentStr }}
+ {{ votes[1].label | translate }}: {{ votes[1].value }} {{ votes[1].percentStr }} + {{ votes[2].label | translate }}: {{ votes[2].value }} {{ votes[2].percentStr }} - {{ votes[0].label | translate }}: {{ votes[0].value }} · - {{ votes[1].label | translate }}: {{ votes[1].value }} - + {{ votes[1].label | translate }}: {{ votes[1].value }} {{ votes[1].percentStr }}
{{ vote.value }} {{ vote.percentStr }}
-
-
|