From b6cffcf482ed7df0ba4ebb5f946c474debc6d15e Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Fri, 29 Jul 2016 14:33:02 +0200 Subject: [PATCH] Add new version email and info box then new version is available --- README.rst | 10 +++ cas_server/__init__.py | 4 ++ cas_server/default_settings.py | 9 +++ .../management/commands/cas_clean_sessions.py | 1 + .../migrations/0008_newversionwarning.py | 22 +++++++ cas_server/models.py | 61 +++++++++++++++++ cas_server/static/cas_server/alert-version.js | 25 +++++++ cas_server/templates/cas_server/base.html | 12 +++- cas_server/tests/settings.py | 3 + cas_server/tests/test_models.py | 38 +++++++++++ cas_server/tests/test_utils.py | 26 ++++++++ cas_server/tests/test_view.py | 23 +++++++ cas_server/utils.py | 66 +++++++++++++++++++ requirements-dev.txt | 1 + setup.py | 3 +- 15 files changed, 301 insertions(+), 3 deletions(-) create mode 100644 cas_server/migrations/0008_newversionwarning.py create mode 100644 cas_server/static/cas_server/alert-version.js diff --git a/README.rst b/README.rst index 59b9ba1..9cb5573 100644 --- a/README.rst +++ b/README.rst @@ -219,6 +219,16 @@ Federation settings ``_remember_provider``. +New version warnings settings +----------------------------- + +* ``CAS_NEW_VERSION_HTML_WARNING``: A boolean for diplaying a warning on html pages then a new + version of the application is avaible. Once closed by a user, it is not displayed to this user + until the next new version. The default is ``True``. +* ``CAS_NEW_VERSION_EMAIL_WARNING``: A bolean sot sending a email to ``settings.ADMINS`` when a new + version is available. The default is ``True``. + + Tickets validity settings ------------------------- diff --git a/cas_server/__init__.py b/cas_server/__init__.py index 085927b..c138255 100644 --- a/cas_server/__init__.py +++ b/cas_server/__init__.py @@ -9,5 +9,9 @@ # # (c) 2015-2016 Valentin Samir """A django CAS server application""" + +#: version of the application +VERSION = '0.6.1' + #: path the the application configuration class default_app_config = 'cas_server.apps.CasAppConfig' diff --git a/cas_server/default_settings.py b/cas_server/default_settings.py index c7b2b12..69a2fdf 100644 --- a/cas_server/default_settings.py +++ b/cas_server/default_settings.py @@ -140,6 +140,15 @@ CAS_FEDERATE = False #: Time after witch the cookie use for “remember my identity provider” expire (one week). CAS_FEDERATE_REMEMBER_TIMEOUT = 604800 +#: A :class:`bool` for diplaying a warning on html pages then a new version of the application +#: is avaible. Once closed by a user, it is not displayed to this user until the next new version. +CAS_NEW_VERSION_HTML_WARNING = True +#: A :class:`bool` for sending emails to ``settings.ADMINS`` when a new version is available. +CAS_NEW_VERSION_EMAIL_WARNING = True +#: URL to the pypi json of the application. Used to retreive the version number of the last version. +#: You should not change it. +CAS_NEW_VERSION_JSON_URL = "https://pypi.python.org/pypi/django-cas-server/json" + GLOBALS = globals().copy() for name, default_value in GLOBALS.items(): # get the current setting value, falling back to default_value diff --git a/cas_server/management/commands/cas_clean_sessions.py b/cas_server/management/commands/cas_clean_sessions.py index 437bcb5..5de4ebf 100644 --- a/cas_server/management/commands/cas_clean_sessions.py +++ b/cas_server/management/commands/cas_clean_sessions.py @@ -23,3 +23,4 @@ class Command(BaseCommand): def handle(self, *args, **options): models.User.clean_deleted_sessions() + models.NewVersionWarning.send_mails() diff --git a/cas_server/migrations/0008_newversionwarning.py b/cas_server/migrations/0008_newversionwarning.py new file mode 100644 index 0000000..f5e4b19 --- /dev/null +++ b/cas_server/migrations/0008_newversionwarning.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-27 21:59 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cas_server', '0007_auto_20160723_2252'), + ] + + operations = [ + migrations.CreateModel( + name='NewVersionWarning', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('version', models.CharField(max_length=255)), + ], + ), + ] diff --git a/cas_server/models.py b/cas_server/models.py index 6e87d40..0c44f6f 100644 --- a/cas_server/models.py +++ b/cas_server/models.py @@ -18,15 +18,19 @@ from django.contrib import messages from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible +from django.core.exceptions import ValidationError +from django.core.mail import send_mail import re import sys +import smtplib import logging from datetime import timedelta from concurrent.futures import ThreadPoolExecutor from requests_futures.sessions import FuturesSession import cas_server.utils as utils +from . import VERSION #: logger facility logger = logging.getLogger(__name__) @@ -1003,3 +1007,60 @@ class Proxy(models.Model): def __str__(self): return self.url + + +class NewVersionWarning(models.Model): + """ + Bases: :class:`django.db.models.Model` + + The last new version available version sent + """ + version = models.CharField(max_length=255) + + @classmethod + def send_mails(cls): + """ + For each new django-cas-server version, if the current instance is not up to date + send one mail to ``settings.ADMINS``. + """ + if settings.CAS_NEW_VERSION_EMAIL_WARNING and settings.ADMINS: + try: + obj = cls.objects.get() + except cls.DoesNotExist: + obj = NewVersionWarning.objects.create(version=VERSION) + LAST_VERSION = utils.last_version() + if LAST_VERSION is not None and LAST_VERSION != obj.version: + if utils.decode_version(VERSION) < utils.decode_version(LAST_VERSION): + try: + send_mail( + ( + '%sA new version of django-cas-server is available' + ) % settings.EMAIL_SUBJECT_PREFIX, + u''' +A new version of the django-cas-server is available. + +Your version: %s +New version: %s + +Upgrade using: + * pip install -U django-cas-server + * fetching the last release on + https://github.com/nitmir/django-cas-server/ or on + https://pypi.python.org/pypi/django-cas-server + +After upgrade, do not forget to run: + * ./manage.py migrate + * ./manage.py collectstatic +and to reload your wsgi server (apache2, uwsgi, gunicord, etc…) + +--\u0020 +django-cas-server +'''.strip() % (VERSION, LAST_VERSION), + settings.SERVER_EMAIL, + ["%s <%s>" % admin for admin in settings.ADMINS], + fail_silently=False, + ) + obj.version = LAST_VERSION + obj.save() + except smtplib.SMTPException as error: # pragma: no cover (should not happen) + logger.error("Unable to send new version mail: %s" % error) diff --git a/cas_server/static/cas_server/alert-version.js b/cas_server/static/cas_server/alert-version.js new file mode 100644 index 0000000..fb277a1 --- /dev/null +++ b/cas_server/static/cas_server/alert-version.js @@ -0,0 +1,25 @@ +function alert_version(last_version){ + jQuery(function( $ ){ + $('#alert-version').click(function( e ){ + e.preventDefault(); + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + document.cookie = "cas-alert-version=" + last_version + expires + "; path=/"; + }); + + var nameEQ="cas-alert-version=" + var ca = document.cookie.split(';'); + var value; + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') + c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) + value = c.substring(nameEQ.length,c.length); + } + if(value === last_version){ + $('#alert-version').parent().hide(); + } + }); +} diff --git a/cas_server/templates/cas_server/base.html b/cas_server/templates/cas_server/base.html index bd8663a..5abc8bd 100644 --- a/cas_server/templates/cas_server/base.html +++ b/cas_server/templates/cas_server/base.html @@ -31,8 +31,14 @@
- {% block ante_messages %}{% endblock %} {% if auto_submit %}