diff --git a/prs2/referral/admin.py b/prs2/referral/admin.py index 59d3d8d4..ef06a43b 100644 --- a/prs2/referral/admin.py +++ b/prs2/referral/admin.py @@ -22,6 +22,7 @@ class AuditAdmin(VersionAdmin, ModelAdmin): class LookupAdmin(AuditAdmin): list_display = ( 'id', 'name', 'slug', 'public', 'created', 'modified', 'effective_to') + prepopulated_fields = {'slug': ('name',)} raw_id_fields = ('creator', 'modifier') search_fields = ('name', 'slug') diff --git a/prs2/referral/migrations/0007_auto_20171115_1523.py b/prs2/referral/migrations/0007_auto_20171115_1523.py new file mode 100644 index 00000000..9a830280 --- /dev/null +++ b/prs2/referral/migrations/0007_auto_20171115_1523.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.3 on 2017-11-15 07:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('referral', '0006_auto_20170607_1111'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='conditioncategory', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='doptrigger', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='localgovernment', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='notetype', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='organisation', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='organisationtype', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='referraltype', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='region', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='taskstate', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + migrations.AlterField( + model_name='tasktype', + name='slug', + field=models.SlugField(help_text='Must be unique. Automatically generated from name.', unique=True), + ), + ] diff --git a/prs2/referral/models.py b/prs2/referral/models.py index d743b563..5a57ae2e 100644 --- a/prs2/referral/models.py +++ b/prs2/referral/models.py @@ -16,7 +16,6 @@ from django.utils.encoding import python_2_unicode_compatible from django.utils.safestring import mark_safe # Third-party app imports -from autoslug import AutoSlugField from jinja2 import Template from lxml.html import clean, fromstring from model_utils import Choices @@ -39,6 +38,7 @@ (8, 'wa', ('WA')), ) + @python_2_unicode_compatible class ReferralLookup(ActiveModel, Audit): """Abstract model type for lookup-table objects. @@ -46,9 +46,8 @@ class ReferralLookup(ActiveModel, Audit): name = models.CharField(max_length=200) description = models.CharField( max_length=200, null=True, blank=True, validators=[MaxLengthValidator(200)]) - slug = AutoSlugField( - populate_from='name', unique=True, - help_text='Must be unique. Automatically generated from name.') + slug = models.SlugField( + unique=True, help_text='Must be unique. Automatically generated from name.') public = models.BooleanField( default=True, help_text='Is this lookup selection available to all users?') headers = ['Name', 'Description', 'Last modified'] diff --git a/prs2/referral/test_utils.py b/prs2/referral/test_utils.py index 4aac465b..86efdda0 100644 --- a/prs2/referral/test_utils.py +++ b/prs2/referral/test_utils.py @@ -7,7 +7,7 @@ from referral.models import Referral, Task from referral.test_models import PrsTestCase from referral.utils import ( - is_model_or_string, smart_truncate, breadcrumbs_li, slugify, + is_model_or_string, smart_truncate, breadcrumbs_li, update_revision_history, filter_queryset, user_task_history, dewordify_text, overdue_task_email) @@ -102,12 +102,6 @@ def test_html_breadcrumbs(self): crumbs = breadcrumbs_li(l) self.assertTrue(isinstance(crumbs, six.text_type)) - def test_slugify(self): - """Test the customised slugify function - """ - self.assertEqual('test', slugify('Test')) - self.assertEqual('test-value', slugify('Test Value')) - def test_update_revision_history(self): """Test update_revision_history, for coverage :P """ diff --git a/prs2/referral/test_views.py b/prs2/referral/test_views.py index 7435587d..350198a9 100644 --- a/prs2/referral/test_views.py +++ b/prs2/referral/test_views.py @@ -1056,3 +1056,13 @@ def test_post_forbidden(self): self.client.login(username='readonlyuser', password='pass') response = self.client.post(url, {'file': f}) self.assertEquals(response.status_code, 403) + + +class HealthCheckViewTest(PrsViewsTestCase): + def test_healthcheck(self): + """Test the healthcheck view works without auth + """ + self.client.logout() + url = reverse('health_check') + response = self.client.get(url) + self.assertEqual(response.status_code, 200) diff --git a/prs2/referral/urls.py b/prs2/referral/urls.py index a8f7a99c..43739fe9 100644 --- a/prs2/referral/urls.py +++ b/prs2/referral/urls.py @@ -37,6 +37,7 @@ # Other static/functional URLs urlpatterns += [ + url(r'^healthcheck/$', views.HealthCheckView.as_view(), name='health_check'), url(r'^help/$', views.HelpPage.as_view(), name='help_page'), url(r'^search/$', views.GeneralSearch.as_view(), name='prs_general_search'), url(r'^stopped-tasks/$', views.SiteHome.as_view(stopped_tasks=True), name='stopped_tasks_list'), diff --git a/prs2/referral/utils.py b/prs2/referral/utils.py index 4cceaab3..0506cd30 100644 --- a/prs2/referral/utils.py +++ b/prs2/referral/utils.py @@ -271,12 +271,6 @@ def borgcollector_harvest(request, publishes=['prs_locations']): return r -def slugify(value): - """A (slightly) customised slugify function. - """ - return django_slugify(unidecode(value)) - - def overdue_task_email(): """A utility function to send an email to each user with tasks that are overdue. diff --git a/prs2/referral/views.py b/prs2/referral/views.py index 237668cd..6cdbb178 100644 --- a/prs2/referral/views.py +++ b/prs2/referral/views.py @@ -1443,3 +1443,15 @@ def get(self, request, *args, **kwargs): else: messages.warning(request, 'That record is not associated with an InfoBase object ID.') return HttpResponseRedirect(record.get_absolute_url()) + + +class HealthCheckView(TemplateView): + """A basic template view not requiring auth, used for service monitoring. + """ + template_name = 'healthcheck.html' + + def get_context_data(self, **kwargs): + context = super(HealthCheckView, self).get_context_data(**kwargs) + context['page_title'] = 'PRS application status' + context['status'] = 'HEALTHY' + return context diff --git a/prs2/settings.py b/prs2/settings.py index 8b996c2d..b5c4a6c1 100644 --- a/prs2/settings.py +++ b/prs2/settings.py @@ -246,9 +246,3 @@ # django-sql-explorer settings # Requires user is_staff==True and membership in 'PRS power user' group. EXPLORER_PERMISSION_VIEW = lambda u: u.is_staff and u.userprofile.is_power_user() - - -# Custom slugify function for django-autoslug, because I'm sick of -# RuntimeWarning errors about unicode :/ -# Ref: https://django-autoslug.readthedocs.io/en/latest/settings.html -AUTOSLUG_SLUGIFY_FUNCTION = 'referral.utils.slugify' diff --git a/prs2/templates/healthcheck.html b/prs2/templates/healthcheck.html new file mode 100644 index 00000000..c326ace0 --- /dev/null +++ b/prs2/templates/healthcheck.html @@ -0,0 +1,9 @@ + + + + {{ page_title }} + + +

{{ status }}

+ + diff --git a/requirements.txt b/requirements.txt index 260fb092..c1aba95f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ -Django==1.11.3 -django-extensions==1.8.1 +Django==1.11.7 +django-extensions==1.9.7 git+https://github.com/parksandwildlife/dpaw-utils.git@0.3a16#egg=dpaw-utils -django-reversion==2.0.9 +django-reversion==2.0.10 django-debug-toolbar==1.8 django-tastypie==0.14.0 django-taggit==0.22.1 -django-autoslug==1.9.3 +django-autoslug==1.9.3 # Not in use, but needed for legacy migrations. django-crispy-forms==1.6.1 django-sql-explorer==1.0 xlsxwriter==0.9.6 # Required for Excel export in django-sql-explorer