Merge pull request #2226 from normanjaeckel/MotionOrigin

Added motion origin field.
This commit is contained in:
Emanuel Schütze 2016-07-27 16:14:31 +02:00 committed by GitHub
commit 45321b6139
6 changed files with 54 additions and 10 deletions

View File

@ -12,6 +12,9 @@ Core:
- Used Django Channels instead of Tornado. - Used Django Channels instead of Tornado.
- Added support for big assemblies with lots of users. - Added support for big assemblies with lots of users.
Motions:
- Added origin field.
Other: Other:
- Removed config cache to support multiple threads or processes. - Removed config cache to support multiple threads or processes.
- Fixed bug, that the last change of a config value was not send via autoupdate. - Fixed bug, that the last change of a config value was not send via autoupdate.

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-13 14:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('motions', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='motion',
name='origin',
field=models.CharField(blank=True, max_length=255),
),
]

View File

@ -81,6 +81,12 @@ class Motion(RESTModelMixin, models.Model):
ForeignKey to one category of motions. ForeignKey to one category of motions.
""" """
origin = models.CharField(max_length=255, blank=True)
"""
A string to describe the origin of this motion e. g. that it was
discussed at another assembly/conference.
"""
attachments = models.ManyToManyField(Mediafile, blank=True) attachments = models.ManyToManyField(Mediafile, blank=True)
""" """
Many to many relation to mediafile objects. Many to many relation to mediafile objects.

View File

@ -233,6 +233,7 @@ class MotionSerializer(ModelSerializer):
'active_version', 'active_version',
'parent', 'parent',
'category', 'category',
'origin',
'submitters', 'submitters',
'supporters', 'supporters',
'state', 'state',
@ -255,6 +256,7 @@ class MotionSerializer(ModelSerializer):
motion.reason = validated_data.get('reason', '') motion.reason = validated_data.get('reason', '')
motion.identifier = validated_data.get('identifier') motion.identifier = validated_data.get('identifier')
motion.category = validated_data.get('category') motion.category = validated_data.get('category')
motion.origin = validated_data.get('origin', '')
motion.reset_state(validated_data.get('workflow_id')) motion.reset_state(validated_data.get('workflow_id'))
motion.save() motion.save()
if validated_data.get('submitters'): if validated_data.get('submitters'):
@ -271,8 +273,8 @@ class MotionSerializer(ModelSerializer):
""" """
Customized method to update a motion. Customized method to update a motion.
""" """
# Identifier and category. # Identifier, category and origin.
for key in ('identifier', 'category'): for key in ('identifier', 'category', 'origin'):
if key in validated_data.keys(): if key in validated_data.keys():
setattr(motion, key, validated_data[key]) setattr(motion, key, validated_data[key])

View File

@ -296,6 +296,14 @@ angular.module('OpenSlidesApp.motions.site', ['OpenSlidesApp.motions'])
}, },
hideExpression: '!model.more' hideExpression: '!model.more'
}, },
{
key: 'origin',
type: 'input',
templateOptions: {
label: gettextCatalog.getString('Origin'),
},
hideExpression: '!model.more'
},
{ {
key: 'tags_id', key: 'tags_id',
type: 'select-multiple', type: 'select-multiple',
@ -917,6 +925,10 @@ angular.module('OpenSlidesApp.motions.site', ['OpenSlidesApp.motions'])
if (motion.category && motion.category !== '' && !motion.category_id) { if (motion.category && motion.category !== '' && !motion.category_id) {
motion.category_create = gettext('New category will be created.'); motion.category_create = gettext('New category will be created.');
} }
// origin
if (motion.origin) {
motion.origin = motion.origin.replace(quotionRe, '$1');
}
$scope.motions.push(motion); $scope.motions.push(motion);
}); });
}); });
@ -971,12 +983,11 @@ angular.module('OpenSlidesApp.motions.site', ['OpenSlidesApp.motions'])
var element = document.getElementById('downloadLink'); var element = document.getElementById('downloadLink');
var csvRows = [ var csvRows = [
// column header line // column header line
['identifier', 'title', 'text', 'reason', 'submitter', 'category'], ['identifier', 'title', 'text', 'reason', 'submitter', 'category', 'origin'],
// example entries // example entries
['A1', 'title 1', 'text 1', 'reason 1', 'Submitter A', 'Category A'], ['A1', 'Title 1', 'Text 1', 'Reason 1', 'Submitter A', 'Category A', 'Last Year Conference A'],
['B1', 'title 2', 'text 2', 'reason 2', 'Submitter B', 'Category B'], ['B1', 'Title 2', 'Text 2', 'Reason 2', 'Submitter B', 'Category B', '' ],
['' , 'title 3', 'text 3', '', '', ''] ['' , 'Title 3', 'Text 3', '' , '' , '' , '' ],
]; ];
var csvString = csvRows.join("%0A"); var csvString = csvRows.join("%0A");
element.href = 'data:text/csv;charset=utf-8,' + csvString; element.href = 'data:text/csv;charset=utf-8,' + csvString;

View File

@ -39,8 +39,8 @@
<h4 translate>Please note:</h4> <h4 translate>Please note:</h4>
<ul> <ul>
<li><translate>Required comma or semicolon separated values with these column header names in the first row</translate>:<br> <li><translate>Required comma or semicolon separated values with these column header names in the first row</translate>:<br>
<code>identifier, title, text, reason, submitter, category</code> <code>identifier, title, text, reason, submitter, category, origin</code>
<li translate>Identifier, reason, submitter and category are optional and may be empty. <li translate>Identifier, reason, submitter, category and origin are optional and may be empty.
<li translate>Only double quotes are accepted as text delimiter (no single quotes). <li translate>Only double quotes are accepted as text delimiter (no single quotes).
<li><a id="downloadLink" href="" ng-click="downloadCSVExample()" translate>Download CSV example file</a> <li><a id="downloadLink" href="" ng-click="downloadCSVExample()" translate>Download CSV example file</a>
</ul> </ul>
@ -57,7 +57,8 @@
<th translate>Text <th translate>Text
<th translate>Reason <th translate>Reason
<th translate>Submitter <th translate>Submitter
<th translate>Category</th> <th translate>Category
<th translate>Origin</th>
<tbody ng-repeat="motion in motions"> <tbody ng-repeat="motion in motions">
<tr> <tr>
<td class="minimum" <td class="minimum"
@ -99,6 +100,7 @@
<i class="fa fa-plus-circle"></i> <i class="fa fa-plus-circle"></i>
</span> </span>
{{ motion.category }} {{ motion.category }}
<td>{{ motion.origin | limitTo:30 }}{{ motion.origin.length > 30 ? '...' : '' }}
</table> </table>
<div class="text-danger"> <div class="text-danger">