diff --git a/mutalyzer/announce.py b/mutalyzer/announce.py new file mode 100644 index 0000000000000000000000000000000000000000..5fb484dca78a67e3320ec41be637fbc104279163 --- /dev/null +++ b/mutalyzer/announce.py @@ -0,0 +1,40 @@ +""" +Simplistic interface to setting a user announcement. + +We store up to one announcement at a time, containing a text body and an +optional 'read more' URL. Since getting the announcement should be really +fast, it can be done on every website pageview without problems. +""" + + +from mutalyzer.redisclient import client + + +def set_announcement(body, url=None): + """ + Set announcement. + """ + announcement = {'body': body} + if url: + announcement['url'] = url + + client.hmset('announcement', announcement) + + +def unset_announcement(): + """ + Unset announcement. + """ + client.delete('announcement') + + +def get_announcement(): + """ + Get announcement. + """ + announcement = client.hgetall('announcement') + if not announcement: + return + + return {'body': announcement['body'], + 'url': announcement.get('url')} diff --git a/mutalyzer/entrypoints/admin.py b/mutalyzer/entrypoints/admin.py index 0a1a5043860f063a97b438290b716cb731994156..a8217bef82d9e229437969853ca660d806a47ebc 100644 --- a/mutalyzer/entrypoints/admin.py +++ b/mutalyzer/entrypoints/admin.py @@ -9,6 +9,7 @@ import json from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound +from .. import announce from ..db import session from ..db.models import Assembly, Chromosome from .. import mapping @@ -113,6 +114,20 @@ def sync_cache(wsdl_url, url_template, history=7): cache_sync.sync_with_remote(wsdl_url, url_template, history) +def set_announcement(body, url=None): + """ + Set announcement to show to the user. + """ + announce.set_announcement(body, url=url) + + +def unset_announcement(): + """ + Unset announcement to show to the user. + """ + announce.unset_announcement() + + def main(): """ Command-line interface to Mutalyzer administrative tools. @@ -194,6 +209,23 @@ def main(): default=7, help='number of days to go back in the remote cache ' '(default: 7)') + p = subparsers.add_parser( + 'set-announcement', help='set user announcement', + description=set_announcement.__doc__.split('\n\n')[0], + epilog='The announcement is shown on every page of the website.') + p.set_defaults(func=set_announcement) + p.add_argument( + 'body', metavar='ANNOUNCEMENT', + help='announcement text to show to the user') + p.add_argument( + '--url', metavar='URL', dest='url', + help='URL to more information on the announcement') + + p = subparsers.add_parser( + 'unset-announcement', help='unset user announcement', + description=unset_announcement.__doc__.split('\n\n')[0]) + p.set_defaults(func=unset_announcement) + args = parser.parse_args() try: diff --git a/mutalyzer/website/templates/base.html b/mutalyzer/website/templates/base.html index 826b26041e520593654407d6cbc6003cb2b5020b..07bc54200917a16b98a458c6a8d7fdb086317f18 100644 --- a/mutalyzer/website/templates/base.html +++ b/mutalyzer/website/templates/base.html @@ -277,6 +277,9 @@ <td width="0"></td> <td width="0"> + {% if announcement %} + <p><b>Announcement:</b> {{ announcement.body }}{% if announcement.url %} <a href="{{ announcement.url }}">read more</a>{% endif %}</p> + {% endif %} <center> <h2>Mutalyzer {{ mutalyzer_version }}<br> diff --git a/mutalyzer/website/views.py b/mutalyzer/website/views.py index 0574995d92052ed95cd1fc280e1c36be82878384..98f79ed986b6308f57b3813f0d2783a224bdb6d9 100644 --- a/mutalyzer/website/views.py +++ b/mutalyzer/website/views.py @@ -19,8 +19,8 @@ from spyne.server.http import HttpBase from sqlalchemy.orm.exc import NoResultFound import mutalyzer -from mutalyzer import (describe, File, Retriever, Scheduler, stats, util, - variantchecker) +from mutalyzer import (announce, describe, File, Retriever, Scheduler, stats, + util, variantchecker) from mutalyzer.config import settings from mutalyzer.db import session from mutalyzer.db.models import BATCH_JOB_TYPES @@ -46,7 +46,8 @@ def add_globals(): 'json_root_url' : settings.JSON_ROOT_URL, 'piwik' : settings.PIWIK, 'piwik_base_url' : settings.PIWIK_BASE_URL, - 'piwik_site_id' : settings.PIWIK_SITE_ID} + 'piwik_site_id' : settings.PIWIK_SITE_ID, + 'announcement' : announce.get_announcement()} @website.route('/')