Pawel M
3a372fbcb4
White space removed
2016-12-13 23:40:36 +01:00
Pawel M
f5b68772cf
Downloaded attachment was not decoded and additionally encoded by default django method (its size after download is bigger than originally attached file). This is the reason why it is illegible
2016-12-13 23:31:26 +01:00
Pawel M
9939f62ebd
Attachement should be readed in binary mode ... and attached as payload (regarding docs)
2016-12-13 23:28:16 +01:00
Pawel M
e7c4131ed7
Attachement should be readed in binary mode ... and attached as payload (regarding docs)
2016-12-13 22:43:14 +01:00
Jonathan Barratt
8dbd54ac16
stop corrupting binary attachments when delivering them by email
...
We accomplish this by attching files to out-bound mail diffrently
depending on the versino of Python in effect. In Py2 we can read
the files ourseles and the standard library will still
be able to use the text we pass as if it were bytes. Under Py3,
however, email.message will complain if it doesn't get to decode
the bytes itself, so instead of attaching the contents directly
we just pass the path to the file as a string instead. Unfortunately,
Django 1.8 does not work with this Python 3 approach, due to its
not yet having reverted to the newly improved standard library's
mail-message implementation, and thus requiring us to know more
about the character-encoding/mimetype of the attachment than I've
been able to gather cleanly by this point.
2016-12-13 19:41:13 +07:00
Jonathan Barratt
e82e5fcd5f
urlquote email address when used as get query param
2016-12-11 06:20:03 +07:00
Pawel M
94c39cba69
solves Title changed to . (Null title) on failed attachment upload.
2016-12-11 06:00:05 +07:00
Jonathan Barratt
5acd891c68
refactor all handling of attached files
...
Extract attachment processing from forms, views.staff, and management.command.get_email modules, and consolidate it into a unified lib module function.
Also refactor the affected components, most notably lib.send_templated_email, to make it easier (IMO) to reason about changes to them.
Add unit tests for attachments with UTF-8 filenames, and functional tests for submission of same, as well as ASCII versions, through the public ticket-form.
Remove unused Attachment method "get_upload_to".
2016-12-08 19:47:20 +07:00
Jonathan Barratt
391e35065c
per code review, update safe IP addr/port constants, remove commented-out code, and add comments to unexplained code
2016-12-06 09:55:22 +07:00
Jonathan Barratt
e8d0c5b2c7
implement mocked pop3 and imap tests for get_email
...
also update travis to latest django patch releases
2016-12-02 19:04:52 +07:00
Alex Seeholzer
399b0901f6
newer version of tests
2016-12-02 17:40:46 +07:00
Alex Seeholzer
72a99cc99a
Moved existing test for local mailbox into generation of tests for matrix of email configurations;
2016-12-02 17:40:46 +07:00
Jonathan Barratt
3cfa371199
hotfix for #456 : patch calls to ticket_from_message
...
add logger arg where missing in get_email
2016-11-29 00:46:42 +07:00
Jonathan Barratt
cac3267e82
Merge pull request #454 from reduxionist/prune-legacy-code
...
Prune legacy code
2016-11-21 20:32:35 +07:00
Jonathan Barratt
45a8ce98ac
Merge pull request #455 from gwasser/ticket_list_view
...
Use HTML5 table ordering based on Unix epoch
2016-11-21 20:29:13 +07:00
Garret Wassermann
04f27fdcff
Use HTML5 table ordering based on Unix epoch
2016-11-21 00:12:24 -05:00
Jonathan Barratt
7738bba2ab
remove special-case imports for legacy versions
...
standardise use, or avoidance, of timezone, template from_string, and Context
2016-11-21 10:16:03 +07:00
Will Stott
f34696df8d
Use Django's six module for StringIO imports.
2016-11-17 11:25:46 +00:00
Garret Wassermann
97a24fbe22
Ensure that local files are deleted after processing, and add some information about it to the install.rst documentation
2016-11-12 11:32:04 +07:00
Jonathan Barratt
ebfea8274d
convert reverse-URL lookups to helpdesk namespace
...
in views.staff, this fixes:
-run_report's no-tickets-found redirect to report_index
-del_attachment's redirect to parent ticket view after deletion
2016-11-11 10:31:37 +07:00
Alex Barcelo
b0b68b9541
drop south_migrations folder
2016-11-02 17:22:47 +01:00
Alex Seeholzer
62163eaf0e
patch: implicit closing of open files;
2016-11-01 15:03:51 +01:00
Garret Wassermann
2a7d82413b
Miscellaneous improvements from review of #419
2016-10-31 02:57:08 -04:00
Garret Wassermann
37b9d332de
Fix some more missing namespace references for login and kb_category
2016-10-31 02:19:41 -04:00
Garret Wassermann
c74208325b
Removed test_per_queue_staff_permission assertion, report_index no longer returns unassigned_tickets
2016-10-31 02:06:49 -04:00
Garret Wassermann
26f4987726
Fix a missing helpdesk namespace reference in report_index.html
2016-10-31 01:42:45 -04:00
Garret Wassermann
194641613c
Sync with upstream, merged in AbstractForm with bootstrap class
2016-10-31 01:38:49 -04:00
Alex Barcelo
abd6fdcebe
simplifying if-case branches on CustomFieldMixin
2016-10-30 20:53:18 +01:00
Alex Barcelo
cce12181f0
refactoring single-letter variables into better names
2016-10-30 20:43:05 +01:00
Alex Barcelo
681a1893bd
missed a refactoring
2016-10-30 08:42:05 +01:00
Alex Barcelo
d8d10fae90
DRY in *TicketForm --by adding an Abstrat~ one
2016-10-30 08:39:17 +01:00
Alex Barcelo
bea6fbf75a
fixing a deprecated usage, and adding a minor branch control
2016-10-30 08:38:49 +01:00
Garret Wassermann
adf2b16c2c
Fix namespaces in test
2016-10-29 04:33:27 -04:00
Garret Wassermann
dc25164304
More PEP8 changes (hopefully last)
2016-10-29 04:27:29 -04:00
Garret Wassermann
4cf46156f1
More PEP8 changes
2016-10-29 04:20:16 -04:00
Garret Wassermann
1f1d477a35
Sync again with master 0.2
2016-10-29 04:11:41 -04:00
Garret Wassermann
d791700582
Fix PEP8 errors
2016-10-29 04:08:57 -04:00
Jonathan Barratt
28308d19fb
cleanup build-breaking whitespace merge errors
2016-10-29 14:59:14 +07:00
Garret Wassermann
cad174468b
Sync with namespace and other v0.2 changes
2016-10-29 03:47:15 -04:00
Jonathan Barratt
26c0f2e59f
Merge pull request #441 from alexbarcelo/api-prune
...
Remove all the deprecated API related files and references
2016-10-29 14:12:31 +07:00
Alex Barcelo
53ed0d3a2c
Remove all the deprecated API related files and references
2016-10-29 08:50:13 +02:00
Jonathan Barratt
43c067dd4f
merge changes from updated master
2016-10-29 13:35:03 +07:00
Jonathan Barratt
790f1fc003
Merge pull request #374 from alexbarcelo/urls_app_name
...
Set app_name as 'helpdesk' at the urls.py, and droping url prefixes
2016-10-28 15:59:29 +07:00
Alex Barcelo
6761ad6c10
fixing RST syntax for docstring on akismet.py
2016-10-26 10:22:15 +02:00
Alex Barcelo
f017adea63
fixing those two python files
2016-10-24 10:05:41 +02:00
Alex Barcelo
89a6ae01b8
Fixing style (according to branch 'autocodestyle') + quicktest
2016-10-24 08:04:31 +02:00
Alex Barcelo
179ceb2f82
fixing style on tests
2016-10-23 22:10:32 +02:00
Alex Barcelo
30e3aa55aa
almost auto-fix on misc files
2016-10-23 22:09:17 +02:00
Alex Barcelo
3c35473265
fixing views.py (except deprecated api)
2016-10-23 22:02:02 +02:00
Alex Barcelo
24d88be8d9
Initial general clean-up of stuff
2016-10-21 17:14:12 +02:00
Garret Wassermann
d7875587b7
Revert previous change
2016-10-20 12:05:28 -04:00
Garret Wassermann
884662dd21
Ensure binary data is returns so Django can decode it
2016-10-20 11:46:09 -04:00
Garret Wassermann
dfb7987ebb
Remove emails from queue in test_get_email
2016-10-20 11:17:51 -04:00
Garret Wassermann
197fad99d2
Remove mail templates since we're not testing them here; might be good to include a test for this elsewhere
2016-10-20 02:48:14 -04:00
Garret Wassermann
5e93297787
Fix call_command options for correct format to work with Django 1.7+
2016-10-20 02:29:23 -04:00
Garret Wassermann
6418194b85
Fix command line arg for Django 1.7 and make Python 2 and 3 compatible test
2016-10-20 02:21:43 -04:00
Garret Wassermann
9606201200
Fix mock tests for get_email (hopefully for good this time)
2016-10-20 02:09:05 -04:00
Garret Wassermann
b7ef83f7d2
Check that folder is a dir before checking for mail using get_email; fix unit test for --quiet
2016-10-20 01:39:24 -04:00
Garret Wassermann
e3c9e04feb
Fix python module naming in get_email test
2016-10-20 01:25:16 -04:00
Jonathan Barratt
af893bdcc8
Merge pull request #428 from jflesch/master
...
Fix form translations
2016-10-20 12:16:31 +07:00
Daryl
3b181e87ef
Fix inconsistent indentation
2016-10-20 11:43:22 +07:00
Garret Wassermann
c9c7642724
New unit test for get_email command
2016-10-19 21:37:23 -04:00
Garret Wassermann
f61d180e5d
use django.utils.six instead of plain six
2016-10-19 20:02:12 -04:00
Alex Barcelo
91afbb9755
fixing some additional reverse stuff
2016-10-19 15:30:37 +02:00
Alex Barcelo
afd6ebad74
Merge current 'master' state into urls_app_name
2016-10-19 15:26:04 +02:00
Jerome Flesch
74668f30d5
forms.py : To get the translations for the fields' labels, use ugettext_lazy() instead for ugettext().
...
ugettext() loads the translations at the same time the module is loaded (--> always in english).
ugettext_lazy() loads them when they are needed (--> when the user makes a query --> we known the language the user wants based on the header of their HTTP request)
Signed-off-by: Jerome Flesch <jflesch@gmail.com>
2016-10-18 15:37:57 +02:00
Jerome Flesch
0ad110ec7f
forms.py: cleanup whitespaces
...
Signed-off-by: Jerome Flesch <jflesch@gmail.com>
2016-10-18 15:35:41 +02:00
meomap
96f4fecb71
add setting for fallback locale
2016-10-14 15:04:28 +07:00
Ross Poulton
138904bf8b
Update project URLs per #424
2016-10-12 11:14:10 +11:00
Ross Poulton
1f4ca64ef4
Update translations (part of #424 )
2016-10-12 10:54:24 +11:00
Antoine Nguyen
50955cb8f6
Fixed Meta class definition for TicketCustomFieldValue.
2016-10-07 11:00:25 +02:00
Garret Wassermann
3f620e83a2
Update style of Ticket FollowUp list to be a timeline
2016-09-27 17:29:59 -04:00
Garret Wassermann
929ec49fa8
Apply styling to KB pages. Minor tweak to dashboard.
2016-09-27 14:36:52 -04:00
Garret Wassermann
414f7e7c03
Make Knowledgebase categories nicer; include jQuery UI for DatePicker on new ticket form
2016-09-27 13:16:28 -04:00
Garret Wassermann
186b4ad8e2
Some of CSS changes were not included due to a conflict in the gitignore file. Updated gitignore and added missing CSS directory.
2016-09-27 10:57:21 -04:00
Garret Wassermann
f313b5c374
Added more logging statements, cleaned up a few others
2016-09-16 00:28:13 -04:00
Garret Wassermann
a4ad602f39
Remove unnecessary imports, clean up python3 handling code to use native str()
2016-09-15 22:51:00 -04:00
Garret Wassermann
e5c3c4a435
Used six to add python3 compatibility along side existing python2, and replaced print statements with logging features. Can now poll a local directory for mail too, not just remote POP3/IMAP.
2016-09-14 20:35:18 -04:00
Garret Wassermann
6a86a0106a
Updated report_index() to remove the context= so it matches the syntax of dashboard() function.
2016-09-13 00:31:56 -04:00
Garret Wassermann
bf55ab7f8c
Oops, forgot to change one more URL from dashboard to report_index
2016-09-13 00:13:52 -04:00
Garret Wassermann
fe54d81022
Update unit test for backend changes to dashboard and statistics pages
2016-09-13 00:06:38 -04:00
Garret Wassermann
4203f352d9
Completely resolved jQuery issue with multiple file attachment submission on a single FollowUp due to CSS styling of file input buttons. It's really ridiculous you have to do this, but whatever. It works as expected.
2016-09-12 23:18:01 -04:00
Garret Wassermann
3002cf689c
Fix CSS styling of Status radio buttons on Ticket Comment form
2016-09-12 22:54:51 -04:00
Garret Wassermann
76241b8661
Fix jQuery error with adding multiple attachments to a single FollowUp. It work when adding files one at a time but gets a little funny when adding more than one input field at a time. Also, moved RSS Feeds link to user menu to be more accessible.
2016-09-12 22:37:48 -04:00
Garret Wassermann
00cdbcf43b
Finish CSS template changes for Ticket page and related properties; includes responsive Ticket list table; styled file input buttons but need to find way to update text for beyond the first input box; added a ticket_attachment_del page to confirm removal of attachment and styled it
2016-09-12 02:11:55 -04:00
Garret Wassermann
a9cb54ce7e
Remove older static files, update User Settings
2016-09-11 12:30:48 -04:00
Garret Wassermann
e0875b212b
Updated CSS for Ticket list and Ticket editing pages, added Font Awesome's LICENSE to list
2016-09-10 04:00:22 -04:00
Garret Wassermann
67f81ac252
Continue CSS cleanup for Ticket description, remove unneeded priority and button images and associated functions
2016-09-09 04:03:32 -04:00
Garret Wassermann
d66259efdc
Update dashboard and reports to new style, add more CDN support for new javascript libraries
2016-09-09 02:45:12 -04:00
Garret Wassermann
4c89da89b5
Updated navbar, base, public_base and login page to use new StartBootstrap SB Admin v2 theme
2016-09-07 02:50:16 -04:00
Jan Beran
8341ad217c
Syntax correction for Python 3.4 and 3.5
2016-08-17 22:01:09 +02:00
Garret Wassermann
1c09f4a3c3
Moved Buttons and Priorities images back to main static folder
2016-08-05 00:50:40 -04:00
Garret Wassermann
014af24d2d
Added a HELPDESK_USE_CDN setting, off by default, to select between using public CDNs as before, and an up-to-date static copy
2016-08-05 00:38:17 -04:00
Garret Wassermann
d9480c9cf0
Update static jQuery and other js/css, disable CDN usage
2016-08-04 23:57:35 -04:00
Ross Poulton
f2e497c3c6
Merge pull request #415 from mhannig/fix-broken-keyword-search
...
JSON Serialization broke Keyword-Searches
2016-07-05 08:48:10 +10:00
Matthias Hannig
a37f7145ec
Serializing the query using JSON for SavedSearches unfortunately broke
...
Keyword-Searches.
Now, only the search string is serialized for saving and
the "qset" is moved from "other_filters" to apply_query.
2016-07-04 17:47:53 +02:00
Ross Poulton
03b3a70975
Merge pull request #410 from mrkiwi-nz/fix_savequery
...
Fix savequery
2016-06-30 10:36:41 +10:00
Ross Poulton
da5a4dc40f
Merge pull request #411 from mrkiwi-nz/issue_408_fix
...
fix #408 : Bug in test_per_queue_staff_permission.py
2016-06-30 10:36:20 +10:00
Daryl
44bbcd31e5
Bug in test_per_queue_staff_permission.py
...
Using the django auth backend allows integers to be passed as a password
Using Peter Sagerson's ldap auth backend there is an error thrown because
some code tries to do a len() on the password.
You could argue that the ldap auth backend should str(password), but
you could also argue that passing an int as a password is bad practice
This PR ensures that a string is sent to the auth module.
2016-06-30 12:07:33 +12:00
Daryl
0ac7183875
Add test for saving a query, fix shared checkbox issue
...
My browser sends 'on' when a checkbox is ticked, django ORM only
recognises '1', 'true' or 't' as valid 'True' responses.
This throws an error
ValidationError at /helpdesk/save_query/
[u"'on' value must be either True or False."]
This could be fixed with " value='1'" in the template, but testing that is harder
My fix is to add a check in the view. 2 more lines, but easier to unittest.
Core devs need to make a call as to which solution is best.
D
2016-06-30 11:36:21 +12:00
Matthias Hannig
5f0191957f
fixed python3 compat issue
2016-06-28 18:44:54 +02:00
Matthias Hannig
895a65fdb9
Fixed remote code execution through unpickling untrusted code.
2016-06-28 18:04:39 +02:00
Ross Poulton
d65c32487c
Merge pull request #406 from mrkiwi-nz/master
...
Fix Issue #404 : Refactor converting query string into queue:id
2016-06-26 19:28:48 +10:00
Daryl
afbfd01fab
Fix Issue #404 : Refactor converting query string into queue:id
2016-06-26 12:45:55 +12:00
Ross Poulton
ecd870663d
Merge pull request #405 from mrkiwi-nz/master
...
Ignore queue name when doing lookups for tickets (means URLs don't break when moving ticket between queues)
2016-06-25 21:55:40 +10:00
Daryl
e5a6686c6d
Ticket #403 - This code changes the behaviour of lookups for tickets and
...
ignores the queue name. This means that queue changes on a ticket dont
break the email links which have already been sent out.
The queue name still exists in the link/url, but is not used in the
lookup
2016-06-24 13:46:37 +12:00
Ross Poulton
e4dc3e51eb
Merge pull request #399 from mrkiwi-nz/master
...
Changed render_to_response() to render()
2016-06-22 11:05:21 +10:00
Daryl
8a7fe5fcbf
Changed the way the context is passed to render() - this was required
...
to enable django 1.7 to work (otherwise 1.8, 1.9 pass all tests, but 1.7 fails)
2016-06-21 20:56:43 +12:00
Daryl
558f140bfb
Changed render_to_response() to render() - this should work for django1.9.4 plus django1.10
...
Without this change, django1.10 is missing the 'user' object from the context, which results in
a very hard to track down bug manifesting in ;
"NoReverseMatch: Reverse for 'helpdesk_rss_user' with arguments '('',)' and keyword arguments '{}' not found."
At first glance users may think this is the dots-in-usernames bug, but the username is totally missing.
2016-06-21 17:18:06 +12:00
Gleber Diniz
f8044faf28
Fix import error on python 3
...
"from email.utils import parseaddr, collapse_rfc2231_value" works both for python 2.7 and python 3
2016-06-14 17:10:23 -03:00
mrkiwi-nz
7dd4aa11d7
Update ticket_cc_list.html
2016-06-09 12:41:12 +12:00
mrkiwi-nz
57d341f89f
Update report_output.html
2016-06-09 12:40:48 +12:00
mrkiwi-nz
783aa2481c
Update email_ignore_list.html
2016-06-09 12:40:08 +12:00
mrkiwi-nz
d86b82e689
Update debug.html
2016-06-09 12:39:24 +12:00
Darren Riedlinger
ac8ead52c8
getattr on usersettings.setting dict always returns False. Use settings.get() instead
2016-03-06 12:46:36 -08:00
Ross Poulton
e52ae206c6
Merge pull request #388 from pawelmarkowski/master
...
dashboard error queues are null
2016-03-02 10:38:08 +11:00
Pawel M
2b6c23db9f
(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')\n GROUP BY queue, name\n ORDER BY q.id' at line 9") helpdesk/views/staff.py in dashboard 149 solved. When queues is null do not add to sql q.id in ()
2016-03-01 22:53:33 +01:00
Bruno Tikami
2efe8255c5
UPDATED: print statements to be Python 3.x compatible
2016-03-01 17:01:58 -03:00
imbashamba
191ce3c53c
Nullable "default_owner" field added to Queue model
...
If default_owner is specified, tickets from public form will be assigned to him and he'll be notified by email
2016-02-17 11:40:08 +03:00
powderflask
8bf3449719
Fix: _meta.module_name deprecated in django1.8
2016-01-23 12:25:17 -08:00
Alex Barcelo
a741395ce5
chaging tests to aknowledge helpdesk namespace
2015-12-22 11:20:52 +01:00
Alex Barcelo
3a0f08046e
using helpdesk
app_name and droping helpdesk_
prefix
2015-12-22 10:27:03 +01:00
Ross Poulton
4347d1ec61
Add new locales: th, ca, lv, tr_TR, he_IL, pt_PT
2015-12-22 11:35:59 +11:00
Ross Poulton
ca1690becb
Deprecate custom API (see #198 )
2015-12-22 11:28:00 +11:00
Ross Poulton
0d098f6d29
Merge pull request #369 from alexbarcelo/always_create_permission
...
creation of Permission-per-Queue is done always
2015-12-22 09:41:17 +11:00
Alex Barcelo
7894eea1e1
Making Queue slug unique and improving certain admin-related behaviour
2015-12-18 14:56:53 +01:00
Alex Barcelo
3b547d2cf9
creation of Permission-per-Queue is done always
2015-12-18 14:35:50 +01:00
Alex Barcelo
4545fc925f
fixing migration and allowing valid rollback on typical migrations
2015-12-17 18:44:10 +01:00
Alex Barcelo
0b5af429a5
reverting error due to methods and migrations
2015-12-17 18:11:54 +01:00
Alex Barcelo
01598826bf
protecting through 403 several staff views
2015-12-16 22:27:06 +01:00
Alex Barcelo
1ea70ad1be
adding management command for batch-creation of Queue permission
2015-12-16 22:27:06 +01:00
Alex Barcelo
43e5ff7c0e
added delete mechanism on Queue for auto-clean of permissions
2015-12-16 22:27:06 +01:00
Alex Barcelo
92d8ca3eff
more modular management of permission codenames
2015-12-16 22:27:06 +01:00
Alex Barcelo
64bc1791d4
removing completely QueueMembership model
2015-12-16 22:27:06 +01:00
Alex Barcelo
d760d9ee95
adding basic information to tickets, and masking email, on the admin views
2015-12-16 22:27:06 +01:00
Alex Barcelo
fb66fea86e
change basic features of membership into permissions
2015-12-16 22:27:05 +01:00
Alex Barcelo
230d14b3ca
removing QueueMembership mechanisms from admin.py
2015-12-16 22:27:05 +01:00
Alex Barcelo
c1fd47043a
migration for removing semantics from QueueMembership objects
2015-12-16 22:27:05 +01:00
Alex Barcelo
18c7a2e698
adding required model extra info for permissions
2015-12-16 22:27:05 +01:00
Alex Barcelo
c0939d4b38
adding migration for bugfix 'changed max_length given by string to integer;'
2015-12-16 16:37:22 +01:00
Ross Poulton
11467f6e50
Properly check email context keys in newer Python versions. part of #362
2015-12-16 10:48:27 +11:00
Ross Poulton
6187b0568c
Merge pull request #358 from flinz/django-1.9-fixes
...
Django 1.9 compatibility
2015-12-16 10:24:16 +11:00
Alex Seeholzer
54e541230e
Merge branch 'bug/360_max-length-given-by-string' into django-1.9-fixes
...
* bug/360_max-length-given-by-string:
changed max_length given by string to integer;
2015-12-15 10:21:04 +01:00
Alex Seeholzer
905e52e603
changed max_length given by string to integer;
2015-12-15 10:11:47 +01:00
Alex Seeholzer
2da16c511c
updates to remove Django 1.10 deprecation warnings in Django 1.9:
...
- use of patterns() in urls.py is deprecated
- render() functions accept only dicts - introduced checks to ensure downward compatibility back to Django 1.7
2015-12-10 13:36:24 +01:00
Alex Seeholzer
8d55dcb9a0
python 2 & 3 compatibility: changed __unicode__ to __str__ and added python2 decorators ( https://docs.djangoproject.com/en/1.8/topics/python3/#str-and-unicode-methods )
2015-11-18 15:26:08 +01:00
Alex Seeholzer
8390125c01
fixes of python 3 test fails
2015-11-18 15:07:33 +01:00
Alex Seeholzer
71504aa85d
minor changes for python3
2015-11-18 10:41:02 +01:00
Alex Seeholzer
f7f0882f86
Merge branch 'master-upstream' into django-1.9-fixes
...
* master-upstream:
Fix QueueMembership bug revealed by django.test's DiscoverRunner
2015-11-18 10:16:33 +01:00
Alex Seeholzer
e732b511e1
deprecated tags replaced in django 1.9 (ssi and url template tags are removed from the future template tag library)
2015-11-16 16:09:47 +01:00