adding user field "number" (fixes #2214)
This commit is contained in:
parent
e688a345c0
commit
371945e36e
@ -11,6 +11,9 @@ Version 2.1 (unreleased)
|
||||
Agenda:
|
||||
- Added button to remove all speakers from a list of speakers.
|
||||
|
||||
Assignments:
|
||||
- Remove unused assignment config to publish winner election results only.
|
||||
|
||||
Core:
|
||||
- Used Django Channels instead of Tornado.
|
||||
- Added support for big assemblies with lots of users.
|
||||
@ -19,11 +22,9 @@ Motions:
|
||||
- Added origin field.
|
||||
- Added button to number all motions in a category.
|
||||
|
||||
Assignments:
|
||||
- Remove unused assignment config to publish winner election results only.
|
||||
|
||||
Users:
|
||||
- Added field is_committee and new default group Committees.
|
||||
- Added field number.
|
||||
|
||||
Other:
|
||||
- Removed config cache to support multiple threads or processes.
|
||||
|
20
openslides/users/migrations/0003_user_number.py
Normal file
20
openslides/users/migrations/0003_user_number.py
Normal file
@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.7 on 2016-08-01 14:54
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0002_user_is_committee'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='number',
|
||||
field=models.CharField(blank=True, default='', max_length=50),
|
||||
),
|
||||
]
|
@ -124,6 +124,11 @@ class User(RESTModelMixin, PermissionsMixin, AbstractBaseUser):
|
||||
blank=True,
|
||||
default='')
|
||||
|
||||
number = models.CharField(
|
||||
max_length=50,
|
||||
blank=True,
|
||||
default='')
|
||||
|
||||
about_me = models.TextField(
|
||||
blank=True,
|
||||
default='')
|
||||
|
@ -23,8 +23,7 @@ def users_to_pdf(pdf):
|
||||
"""
|
||||
Create a list of all users as PDF.
|
||||
"""
|
||||
data = [['#', _('Title'), _('Last Name'), _('First Name'),
|
||||
_('Structure level'), _('Group')]]
|
||||
data = [['#', _('Name'), _('Structure level'), _('Group')]]
|
||||
if config['users_sort_users_by_first_name']:
|
||||
sort = 'first_name'
|
||||
else:
|
||||
@ -36,11 +35,19 @@ def users_to_pdf(pdf):
|
||||
for group in user.groups.all():
|
||||
if group.pk != 2:
|
||||
groups += "%s<br/>" % escape(_(group.name))
|
||||
if sort == 'last_name':
|
||||
name = "%s" % escape(user.last_name)
|
||||
if user.first_name:
|
||||
name = "%s, %s" % (name, escape(user.first_name))
|
||||
else:
|
||||
name = "%s %s" % (escape(user.first_name), escape(user.last_name))
|
||||
if user.title:
|
||||
name = "%s %s" % (user.title, name)
|
||||
if user.number:
|
||||
name = "%s<br/>%s" % (name, user.number)
|
||||
data.append([
|
||||
counter,
|
||||
Paragraph(user.title, stylesheet['Tablecell']),
|
||||
Paragraph(escape(user.last_name), stylesheet['Tablecell']),
|
||||
Paragraph(escape(user.first_name), stylesheet['Tablecell']),
|
||||
Paragraph(name, stylesheet['Tablecell']),
|
||||
Paragraph(escape(user.structure_level), stylesheet['Tablecell']),
|
||||
Paragraph(groups, stylesheet['Tablecell'])])
|
||||
t = LongTable(data, style=[
|
||||
@ -65,6 +72,7 @@ def users_passwords_to_pdf(pdf):
|
||||
users_pdf_url = config["users_pdf_url"] or "-"
|
||||
users_pdf_welcometitle = config["users_pdf_welcometitle"]
|
||||
users_pdf_welcometext = config["users_pdf_welcometext"]
|
||||
|
||||
if config['users_sort_users_by_first_name']:
|
||||
sort = 'first_name'
|
||||
else:
|
||||
@ -88,6 +96,7 @@ def users_passwords_to_pdf(pdf):
|
||||
|
||||
for user in User.objects.all().order_by(sort):
|
||||
pdf.append(Paragraph(escape(user.get_full_name()), stylesheet['h1']))
|
||||
pdf.append(Paragraph(escape(user.number), stylesheet['h3']))
|
||||
pdf.append(Spacer(0, 1 * cm))
|
||||
data = []
|
||||
# WLAN access data
|
||||
|
@ -18,6 +18,7 @@ USERSHORTSERIALIZER_FIELDS = (
|
||||
'first_name',
|
||||
'last_name',
|
||||
'structure_level',
|
||||
'number',
|
||||
'about_me',
|
||||
'groups',
|
||||
'is_committee',
|
||||
@ -57,6 +58,7 @@ class UserFullSerializer(ModelSerializer):
|
||||
'title',
|
||||
'first_name',
|
||||
'last_name',
|
||||
'number',
|
||||
'structure_level',
|
||||
'about_me',
|
||||
'comment',
|
||||
|
@ -318,6 +318,12 @@ angular.module('OpenSlidesApp.users.site', ['OpenSlidesApp.users'])
|
||||
description: gettextCatalog.getString('Will be shown after the name.')
|
||||
}
|
||||
},
|
||||
{ key: 'number',
|
||||
type: 'input',
|
||||
templateOptions: {
|
||||
label:gettextCatalog.getString('Participant number')
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'groups_id',
|
||||
type: 'select-multiple',
|
||||
@ -750,6 +756,10 @@ angular.module('OpenSlidesApp.users.site', ['OpenSlidesApp.users'])
|
||||
if (user.structure_level) {
|
||||
user.structure_level = user.structure_level.replace(quotionRe, '$1');
|
||||
}
|
||||
// number
|
||||
if (user.number) {
|
||||
user.number = user.number.replace(quotionRe, '$1');
|
||||
}
|
||||
// groups
|
||||
if (user.groups) {
|
||||
var csvGroups = user.groups.replace(quotionRe, '$1').split(",");
|
||||
@ -822,12 +832,12 @@ angular.module('OpenSlidesApp.users.site', ['OpenSlidesApp.users'])
|
||||
var element = document.getElementById('downloadLink');
|
||||
var csvRows = [
|
||||
// column header line
|
||||
['title', 'first_name', 'last_name', 'structure_level', 'groups', 'comment', 'is_active', 'is_committee'],
|
||||
['title', 'first_name', 'last_name', 'structure_level', 'number', 'groups', 'comment', 'is_active', 'is_committee'],
|
||||
// example entries
|
||||
['Dr.', 'Max', 'Mustermann', 'Berlin', '"3,4"', 'xyz', '1', ''],
|
||||
['', 'John', 'Doe', 'Washington', '3', 'abc', '1', ''],
|
||||
['', 'Fred', 'Bloggs', 'London', '', '', '', ''],
|
||||
['', '', 'Executive Board', '', '5', '', '', '1'],
|
||||
['Dr.', 'Max', 'Mustermann', 'Berlin','1234567890', '"3,4"', 'xyz', '1', ''],
|
||||
['', 'John', 'Doe', 'Washington','75/99/8-2', '3', 'abc', '1', ''],
|
||||
['', 'Fred', 'Bloggs', 'London', '', '', '', '', ''],
|
||||
['', '', 'Executive Board', '', '', '5', '', '', '1'],
|
||||
|
||||
];
|
||||
var csvString = csvRows.join("%0A");
|
||||
|
@ -34,6 +34,8 @@
|
||||
<div ng-repeat="group in user.groups_id">
|
||||
{{ (groups | filter: {id: group})[0].name | translate }}
|
||||
</div>
|
||||
<label translate>Participant number</label>
|
||||
{{ user.number }}
|
||||
<label translate>About me</label>
|
||||
<div ng-bind-html="user.about_me"></div>
|
||||
</fieldset>
|
||||
|
@ -68,7 +68,7 @@
|
||||
<h4 translate>Please note:</h4>
|
||||
<ul>
|
||||
<li><translate>Required comma or semicolon separated values with these column header names in the first row</translate>:<br>
|
||||
<code>title, first_name, last_name, structure_level, groups, comment, is_active, is_committee</code>
|
||||
<code>title, first_name, last_name, structure_level, number, groups, comment, is_active, is_committee</code>
|
||||
<li><translate>Default groups</translate>:
|
||||
<translate>Delegates</translate> <code>3</code>,
|
||||
<translate>Staff</translate> <code>4</code>
|
||||
@ -90,6 +90,7 @@
|
||||
<th translate>First name
|
||||
<th translate>Last name
|
||||
<th translate>Structure level
|
||||
<th translate>Participant number
|
||||
<th translate>Groups
|
||||
<th translate>Comment
|
||||
<th translate>Is active
|
||||
@ -123,6 +124,8 @@
|
||||
{{ user.last_name }}
|
||||
<td>
|
||||
{{ user.structure_level }}
|
||||
<td>
|
||||
{{ user.number }}
|
||||
<td>
|
||||
<div ng-repeat="groupname in user.groupnames">
|
||||
{{ groupname | translate }}
|
||||
|
@ -196,6 +196,7 @@
|
||||
<div ng-if="user.comment">
|
||||
<small><i class="fa fa-info-circle"></i> {{ user.comment }}</small>
|
||||
</div>
|
||||
<div ng-if="user.number"> {{ user.number }} </div>
|
||||
<div os-perms="users.can_manage" class="hoverActions" ng-class="{'hiddenDiv': !user.hover}">
|
||||
<a href="" ng-click="openDialog(user)" translate>Edit</a> |
|
||||
<a href="" class="text-danger"
|
||||
|
Loading…
Reference in New Issue
Block a user