From 13eb0ccb30f8480739ec8412d486d50b4712818e Mon Sep 17 00:00:00 2001 From: Emanuel Schuetze Date: Tue, 14 Jan 2014 21:44:48 +0100 Subject: [PATCH 1/3] Fixed #1190: Wrong sorting of motion identifier - Added natural sorting JS plugin for motion DataTables (column identifier). - Added the new requirements python package 'natsort' for natural sorting of motions in PDF. --- README.rst | 5 ++ extras/win32-portable/create_portable.txt | 2 +- extras/win32-portable/licenses/natsort | 19 +++++++ extras/win32-portable/prepare_portable.py | 3 ++ openslides/motion/pdf.py | 5 +- .../motion/templates/motion/motion_list.html | 8 +++ .../static/javascript/dataTables.bootstrap.js | 1 + openslides/static/javascript/naturalSort.js | 50 +++++++++++++++++++ requirements_production.txt | 1 + 9 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 extras/win32-portable/licenses/natsort create mode 100644 openslides/static/javascript/naturalSort.js diff --git a/README.rst b/README.rst index 66da95e06..919830cfc 100644 --- a/README.rst +++ b/README.rst @@ -256,6 +256,8 @@ OpenSlides uses the following projects or parts of them: * `Django haystack `_, License: BSD +* `natsort `_, License: MIT + * `pdf.js `_, License: Apache License v2.0 * `Pillow `_, License: Standard @@ -292,6 +294,9 @@ OpenSlides uses the following projects or parts of them: - `jQuery DataTables Plugin `_, License: BSD/GPLv2 + - `DataTables Natural Sort Plugin `_, + License: MIT + - `jQuery Cookie Plugin `_, License: MIT/GPL diff --git a/extras/win32-portable/create_portable.txt b/extras/win32-portable/create_portable.txt index 959ac27eb..8dfd7e93b 100644 --- a/extras/win32-portable/create_portable.txt +++ b/extras/win32-portable/create_portable.txt @@ -7,7 +7,7 @@ How to create a new portable Windows distribution of OpenSlides: 2. Install all required python packages (see requirements_production.txt): - easy_install -Z django django-mptt beautifulsoup4 bleach pillow reportlab sockjs_tornado tornado django-haystack whoosh + easy_install -Z django django-mptt beautifulsoup4 bleach natsort pillow reportlab sockjs_tornado tornado django-haystack whoosh 3. Install pywin32 from binary installer: diff --git a/extras/win32-portable/licenses/natsort b/extras/win32-portable/licenses/natsort new file mode 100644 index 000000000..993858af2 --- /dev/null +++ b/extras/win32-portable/licenses/natsort @@ -0,0 +1,19 @@ +Copyright (c) 2012 Seth M. Morton + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extras/win32-portable/prepare_portable.py b/extras/win32-portable/prepare_portable.py index 65364fea2..921a91de6 100755 --- a/extras/win32-portable/prepare_portable.py +++ b/extras/win32-portable/prepare_portable.py @@ -93,6 +93,9 @@ SITE_PACKAGES = { "django-haystack": { "copy": ["haystack"], }, + "natsort": { + "copy": ["natsort"], + }, "whoosh": { "copy": ["whoosh"], }, diff --git a/openslides/motion/pdf.py b/openslides/motion/pdf.py index 3eb09b93d..a9166b98c 100644 --- a/openslides/motion/pdf.py +++ b/openslides/motion/pdf.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- +from operator import attrgetter import os import random from bs4 import BeautifulSoup from django.conf import settings from django.utils.translation import ugettext as _ +from natsort import natsorted from reportlab.lib import colors from reportlab.lib.units import cm from reportlab.platypus import PageBreak, Paragraph, Spacer, Table, TableStyle @@ -25,6 +27,7 @@ def motions_to_pdf(pdf): Create a PDF with all motions. """ motions = Motion.objects.all() + motions = natsorted(motions, key=attrgetter('identifier')) all_motion_cover(pdf, motions) for motion in motions: pdf.append(PageBreak()) @@ -254,7 +257,7 @@ def all_motion_cover(pdf, motions): identifier = "" if motion.identifier: identifier = "%s " % motion.identifier - pdf.append(Paragraph("%s%s" % (identifier, motion.title), stylesheet['Heading3'])) + pdf.append(Paragraph("%s   %s" % (identifier, motion.title), stylesheet['Heading3'])) def motion_poll_to_pdf(pdf, poll): diff --git a/openslides/motion/templates/motion/motion_list.html b/openslides/motion/templates/motion/motion_list.html index b7772a695..865f5d771 100644 --- a/openslides/motion/templates/motion/motion_list.html +++ b/openslides/motion/templates/motion/motion_list.html @@ -12,7 +12,15 @@ {% block javascript %} + + {% endblock %} {% block content %} diff --git a/openslides/static/javascript/dataTables.bootstrap.js b/openslides/static/javascript/dataTables.bootstrap.js index 6e160ad3a..9fd6ad615 100644 --- a/openslides/static/javascript/dataTables.bootstrap.js +++ b/openslides/static/javascript/dataTables.bootstrap.js @@ -11,6 +11,7 @@ /* Table initialisation */ $(document).ready(function() { $('#dataTable').dataTable( { + "bRetrieve": true, "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, gettext("All")]], "aoColumnDefs": [ { "bSortable": false, "aTargets": [ -1 ] } diff --git a/openslides/static/javascript/naturalSort.js b/openslides/static/javascript/naturalSort.js new file mode 100644 index 000000000..c831beba7 --- /dev/null +++ b/openslides/static/javascript/naturalSort.js @@ -0,0 +1,50 @@ +/* + * Natural Sort algorithm for Javascript - Version 0.6 - Released under MIT license + * Author: Jim Palmer (based on chunking idea from Dave Koelle) + * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo + */ + +function naturalSort (a, b) { + var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, + sre = /(^[ ]*|[ ]*$)/g, + dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, + hre = /^0x[0-9a-f]+$/i, + ore = /^0/, + // convert all to strings and trim() + x = a.toString().replace(sre, '') || '', + y = b.toString().replace(sre, '') || '', + // chunk/tokenize + xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), + yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), + // numeric, hex or date detection + xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)), + yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null; + // first try and sort Hex codes or Dates + if (yD) + if ( xD < yD ) return -1; + else if ( xD > yD ) return 1; + // natural sorting through split numeric strings and default strings + for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { + // find floats not starting with '0', string or 0 if not defined (Clint Priest) + oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; + oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; + // handle numeric vs string comparison - number < string - (Kyle Adams) + if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? 1 : -1; + // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' + else if (typeof oFxNcL !== typeof oFyNcL) { + oFxNcL += ''; + oFyNcL += ''; + } + if (oFxNcL < oFyNcL) return -1; + if (oFxNcL > oFyNcL) return 1; + } + return 0; +} + +// use naturalSort as dataTable extension +jQuery.fn.dataTableExt.oSort['natural-asc'] = function(a,b) { + return naturalSort(a,b); +}; +jQuery.fn.dataTableExt.oSort['natural-desc'] = function(a,b) { + return naturalSort(a,b) * -1; +}; diff --git a/requirements_production.txt b/requirements_production.txt index 061138f38..f593b43f2 100644 --- a/requirements_production.txt +++ b/requirements_production.txt @@ -4,6 +4,7 @@ beautifulsoup4>=4.3,<4.4 bleach>=1.2,<1.3 django-haystack>=2.1,<2.2 django-mptt>=0.6,<0.7 +natsort>=3.0,<3.1 pillow>=2.2,<2.3 reportlab>=2.7,<2.8 sockjs-tornado>=1.0,<1.1 From cfa35241e1750a8975cc0883eee6b7d9fee03088 Mon Sep 17 00:00:00 2001 From: Emanuel Schuetze Date: Mon, 27 Jan 2014 21:15:53 +0100 Subject: [PATCH 2/3] Fixed #1138: Wrong file for projectors logo --- openslides/core/signals.py | 2 +- .../projector/static/img/logo-projector.png | Bin 3476 -> 7273 bytes openslides/projector/templates/projector.html | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openslides/core/signals.py b/openslides/core/signals.py index d77f43986..c9ed65379 100644 --- a/openslides/core/signals.py +++ b/openslides/core/signals.py @@ -64,7 +64,7 @@ def setup_general_config_page(sender, **kwargs): default_value=True, form_field=forms.BooleanField( label=ugettext_lazy('Show logo on projector'), - help_text=ugettext_lazy('You can find and replace the logo under "openslides/static/img/projector/static/img/logo-projector.png".'), + help_text=ugettext_lazy('You can find and replace the logo under "openslides/projector/static/img/logo-projector.png".'), required=False)) projector_enable_title = ConfigVariable( diff --git a/openslides/projector/static/img/logo-projector.png b/openslides/projector/static/img/logo-projector.png index 461e9de7c6b6beda8f73374202cd9746c34aff2c..9b81eb76239edf7965896dc41c14527f4f1ee98d 100644 GIT binary patch literal 7273 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 delta 3449 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 ZyCji5>JZ=W4&J697(HX%8njc?{{YORp?LrR diff --git a/openslides/projector/templates/projector.html b/openslides/projector/templates/projector.html index dbb7a5d15..b43b3292e 100644 --- a/openslides/projector/templates/projector.html +++ b/openslides/projector/templates/projector.html @@ -45,7 +45,7 @@