summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/TESTS/test_imports.py92
-rw-r--r--core/TESTS/tests.py86
-rw-r--r--settings.py3
-rw-r--r--templates/base.html25
-rw-r--r--templates/tasks.html49
5 files changed, 161 insertions, 94 deletions
diff --git a/core/TESTS/test_imports.py b/core/TESTS/test_imports.py
new file mode 100644
index 0000000..b726ae8
--- /dev/null
+++ b/core/TESTS/test_imports.py
@@ -0,0 +1,92 @@
+"""
+We are using unittest for troggle.
+
+Note that the database has not been parsed from the source files when these tests are run,
+so any path that relies on data being in the database will fail.
+
+The simple redirections to files which exist, e.g. in
+/expoweb/
+/expofiles/
+/expofiles/documents/
+etc. will test fine.
+
+But paths like this:
+/survey_scans/
+/caves/
+which rely on database resolution will fail unless a fixture has been set up for
+them.
+
+https://docs.djangoproject.com/en/3.0/topics/testing/tools/
+"""
+import unittest
+import re
+from django.test import TestCase, SimpleTestCase, Client
+
+class SimpleTest(SimpleTestCase):
+ def test_test_setting(self):
+ from django.conf import settings
+ self.assertEqual(settings.EMAIL_BACKEND, 'django.core.mail.backends.locmem.EmailBackend')
+ def test_import_TroggleModel(self):
+ from troggle.core.models import TroggleModel
+ def test_import_Cave(self):
+ from troggle.core.models_caves import Cave
+ def test_import_parsers_surveys(self):
+ from PIL import Image
+ from utils import save_carefully
+ from functools import reduce
+ def test_import_parsers_survex(self):
+ import troggle.settings as settings
+ import troggle.core.models as models
+ import troggle.core.models_caves as models_caves
+ import troggle.core.models_survex as models_survex
+ from troggle.parsers.people import GetPersonExpeditionNameLookup
+ from troggle.core.views.caves import MapLocations
+ def test_import_parsers_QMs(self):
+ from troggle.core.models_caves import QM, Cave, LogbookEntry
+ from utils import save_carefully
+ def test_import_parsers_people(self):
+ from html.parser import HTMLParser
+ from unidecode import unidecode
+ def test_import_parsers_logbooks(self):
+ from django.template.defaultfilters import slugify
+ from django.utils.timezone import get_current_timezone, make_aware
+ from troggle.core.models import DataIssue, Expedition
+ from troggle.core.models_caves import Cave, LogbookEntry, PersonTrip
+ from parsers.people import GetPersonExpeditionNameLookup
+ def test_import_core_views_caves(self):
+ from django.http import HttpResponse, HttpResponseRedirect
+ from django.shortcuts import get_object_or_404, render
+ import troggle.core.views.expo
+ from troggle.core.models import Expedition
+ from troggle.core.models_caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation
+ from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm, EntranceLetterForm
+ from troggle.core.views.login import login_required_if_public
+ from django.contrib.auth.decorators import login_required
+ from django.conf import settings
+ def test_import_parsers_mix(self):
+ from troggle.parsers.logbooks import GetCaveLookup
+ import troggle.settings
+ import troggle.logbooksdump
+ import troggle.parsers.caves
+ import troggle.parsers.people
+ import troggle.parsers.surveys
+ import troggle.parsers.logbooks
+ import troggle.parsers.QMs
+ import troggle.parsers.survex
+ def test_import_imports(self):
+ from django.core import management
+ from django.db import connection, close_old_connections, connections
+ from django.contrib.auth.models import User
+ from django.http import HttpResponse
+ from django.urls import reverse
+
+ def test_import_urls(self):
+ from django.conf import settings
+ from django.conf.urls import url, include
+ from django.views.generic.base import RedirectView
+ from django.views.generic.edit import UpdateView
+ from django.views.generic.list import ListView
+ from django.contrib import admin
+ from django.urls import reverse, resolve
+
+
diff --git a/core/TESTS/tests.py b/core/TESTS/tests.py
index d7eeec3..11f3bc4 100644
--- a/core/TESTS/tests.py
+++ b/core/TESTS/tests.py
@@ -22,73 +22,6 @@ import unittest
import re
from django.test import TestCase, SimpleTestCase, Client
-class SimpleTest(SimpleTestCase):
- def test_test_setting(self):
- from django.conf import settings
- self.assertEqual(settings.EMAIL_BACKEND, 'django.core.mail.backends.locmem.EmailBackend')
- def test_import_TroggleModel(self):
- from troggle.core.models import TroggleModel
- def test_import_Cave(self):
- from troggle.core.models_caves import Cave
- def test_import_parsers_surveys(self):
- from PIL import Image
- from utils import save_carefully
- from functools import reduce
- def test_import_parsers_survex(self):
- import troggle.settings as settings
- import troggle.core.models as models
- import troggle.core.models_caves as models_caves
- import troggle.core.models_survex as models_survex
- from troggle.parsers.people import GetPersonExpeditionNameLookup
- from troggle.core.views.caves import MapLocations
- def test_import_parsers_QMs(self):
- from troggle.core.models_caves import QM, Cave, LogbookEntry
- from utils import save_carefully
- def test_import_parsers_people(self):
- from html.parser import HTMLParser
- from unidecode import unidecode
- def test_import_parsers_logbooks(self):
- from django.template.defaultfilters import slugify
- from django.utils.timezone import get_current_timezone, make_aware
- from troggle.core.models import DataIssue, Expedition
- from troggle.core.models_caves import Cave, LogbookEntry, PersonTrip
- from parsers.people import GetPersonExpeditionNameLookup
- def test_import_core_views_caves(self):
- from django.http import HttpResponse, HttpResponseRedirect
- from django.shortcuts import get_object_or_404, render
- import troggle.core.views.expo
- from troggle.core.models import Expedition
- from troggle.core.models_caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation
- from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm, EntranceLetterForm
- from troggle.core.views.login import login_required_if_public
- from django.contrib.auth.decorators import login_required
- from django.conf import settings
- def test_import_parsers_mix(self):
- from troggle.parsers.logbooks import GetCaveLookup
- import troggle.settings
- import troggle.logbooksdump
- import troggle.parsers.caves
- import troggle.parsers.people
- import troggle.parsers.surveys
- import troggle.parsers.logbooks
- import troggle.parsers.QMs
- import troggle.parsers.survex
- def test_import_imports(self):
- from django.core import management
- from django.db import connection, close_old_connections, connections
- from django.contrib.auth.models import User
- from django.http import HttpResponse
- from django.urls import reverse
-
- def test_import_urls(self):
- from django.conf import settings
- from django.conf.urls import url, include
- from django.views.generic.base import RedirectView
- from django.views.generic.edit import UpdateView
- from django.views.generic.list import ListView
- from django.contrib import admin
- from django.urls import reverse, resolve
-
#class SimplePageTest(unittest.TestCase):
class PageTests(TestCase):
@@ -191,6 +124,25 @@ class PageTests(TestCase):
phmatch = re.search(ph, content)
self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'")
+ def test_expoweb_troggle_default(self):
+ # default page after logon
+ response = self.client.get('/troggle')
+ self.assertEqual(response.status_code, 200)
+ content = response.content.decode()
+ ph = r'expeditions the club has undertaken'
+ phmatch = re.search(ph, content)
+ self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'")
+
+
+ def test_expoweb_troggle_default_slash(self):
+ response = self.client.get('/troggle/')
+ self.assertEqual(response.status_code, 200)
+ content = response.content.decode()
+ ph = r"<h1>Directory not found"
+ phmatch = re.search(ph, content)
+ self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'")
+
+
def test_expoweb_via_areaid(self):
# the dispatcher takes a detour via the cave renering procedure for this
response = self.client.get('/1623/others/t/via201.jpg')
diff --git a/settings.py b/settings.py
index a8bff2e..4deb6da 100644
--- a/settings.py
+++ b/settings.py
@@ -163,6 +163,5 @@ QM_PATTERN="\[\[\s*[Qq][Mm]:([ABC]?)(\d{4})-(\d*)-(\d*)\]\]"
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
from localsettings import *
-
#localsettings needs to take precedence. Call it to override any existing vars.
-print("+ finished importing troggle/settings.py")
+
diff --git a/templates/base.html b/templates/base.html
index 7e2d1d3..2afab1f 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -4,22 +4,23 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="{{ settings.MEDIA_URL }}css/main3.css" title="eyeCandy"/>
<link rel="alternate stylesheet" type="text/css" href="{{ settings.MEDIA_URL }}css/mainplain.css" title="plain"/>
-<link rel="stylesheet" type="text/css" href="{{ settings.MEDIA_URL }}css/dropdownNavStyle.css" />
+<!-- Only used on old troggle menu removed in 2020
+<link rel="stylesheet" type="text/css" href="{{ settings.MEDIA_URL }}css/dropdownNavStyle.css" />-->
<title>{% block title %}Troggle{% endblock %}</title>
<!-- <script src="{{ settings.JSLIB_URL }}jquery/jquery.min.js" type="text/javascript"></script> -->
{% block head %}{% endblock %}
</head>
-<body onLoad="contentHeight();">
+<body>
<div id="header">
<h1>CUCC Expeditions to Austria: 1976 - 2021</h1>
<div id="editLinks"> {% block loginInfo %}
- <a href="{{settings.EXPOWEB_URL}}">Website home</a> |
- {% if user.username %}
- You are logged in as {{ user.username }}
- {% if user.person %}(<a href="{{ user.person.get_absolute_url }}">{{ user.person }}</a>)
- {% endif %}.
+ <a href="/">Home</a> |
+ <a id="cuccLink" href="http://camcaving.uk/">CUCC</a> |
+ <a id="expoWebsiteLink" href="http://expo.survex.com">expo.survex</a> |
+ {% if user.username %}User:{{ user.username }}
+ {% if user.person %}(<a href="{{ user.person.get_absolute_url }}">{{ user.person }}</a>){% endif %}
| <a <a href='/accounts/logout/'>Log out</a> {% else %} <a href='/accounts/login/'>Log in</a> {% endif %}
{% endblock%}
{% block editLink %}
@@ -38,14 +39,14 @@
<a href="{% url "expedition" 2018 %}">Expo2018</a> |
<a href="{% url "expedition" 2019 %}">Expo2019</a> |
<br>
- <a id="cuccLink" href="https://camcaving.uk">cucc server</a> |
- <a id="expoWebsiteLink" href="http://expo.survex.com">expo server</a> |
- <a href="{% url "frontpage" %}">tasks to do </a> |
+ <a href="/handbook/computing/onlinesystems.html">handbook</a> |
+ <a href="/handbook/computing/todo-data.html">tasks to do </a> |
<a id="cavesLink" href="{% url "caveindex" %}">caves</a> |
- <a id="caversLink" href="{% url "personindex" %}">people</a> |
+ <a id="folklink" href="/folk">expoers</a> |
+ <a id="caversLink" href="{% url "personindex" %}">survey lengths</a> |
<a href="{% url "stats" %}">expo statistics</a> |
- <a href="{% url "controlpanel" %}">import/export data</a>
+ <a href="{% url "controlpanel" %}">import/export</a> |
<a href="/admin/">Django admin</a>
</div>
diff --git a/templates/tasks.html b/templates/tasks.html
index f092493..3029ac4 100644
--- a/templates/tasks.html
+++ b/templates/tasks.html
@@ -5,7 +5,8 @@
{% block title %}Cambridge Expeditions to Austria{% endblock %}
{% block related %}
- <h2>Recent Actions - admin user</h5>
+<!--
+ <h2>Recent Actions - expoadmin</h5>
{% load log %}
{% get_admin_log 10 as admin_log for_user 1 %}
{% if not admin_log %}
@@ -29,21 +30,30 @@
{% endfor %}
</ul>
{% endif %}
- {% endblock %}
-
+ -->
+ {% endblock %}
+
{% block content %}
-<h2>This is not fully working currently</h2>
-<h2>The code behind this page is under repair</h2>
+<style>
+ul {list-style: disc}
+</style>
+<h2>You are now logged in</h2>
+<p>Now you can:
+<ul>
+<li>Use 'Edit This Page' to fix errors in the online handbook webpages
+<li>Edit the data on an existing cave description
+<li>Create a new cave description for a new cave, including all cave discovery data
+<li>Edit the data on an existing entrance description
+<li>Create a new cave description for a new cave, including all entrance discovery data
+<li>Edit any archived survex file online
+<li>Upload or type in new survex data for a new trip (see below)
+</ul>
+<p>See the logged-in status indicator in the top-right of the page, in gray in the banner picture.
<!--<h2>Expo member tasks</h2>-->
-<h3>Expo member tasks</h3>
-<h3>Add new data</h3>
+<h3></h3>
-<li><a href="">Upload a photo</a></li>
-<li><a href="">Upload a GPS track</a></li>
-<li><a href="">Upload a Tunnel or Therion drawing</a></li>
-<li><a href="/survexfile/caves-1623/999/999.svx">Upload or type in a Survex file</a></li>
<h3>Unfinished wallets work to do:</h3>
<a href="/expofiles/surveyscans/2016/walletindex.html">2016 wallets</a><br>
@@ -51,18 +61,31 @@
<a href="/expofiles/surveyscans/2018/walletindex.html">2018 wallets</a><br>
<a href="/expofiles/surveyscans/2019/walletindex.html">2019 wallets</a><br>
+<h3>Upload new data</h3>
+<ul>
+
+<li><a style="color:grey"href=""><font style="color:grey">Upload a photo</font></a></li>
+<li><a style="color:grey" href="">Upload a GPS track</a></li>
+<li><a style="color:grey"href="">Upload a Tunnel or Therion drawing</a></li>
+
+<li><a href="/survexfile/caves-1623/999/999.svx">Upload or type in a Survex file</a> - overwrite the area/number data in the browser title bar after the page loads, from 'caves-1623/999/999.svx' to whatever you need for your cave.
+</ul>
+<p>
+<h3>Unfinished surveys</h3>
{% for survey in surveys_unfinished %}
<li>{{survey|link}}</li>
+ {% empty %}
+ [none found in database[surveys_unfinished]]
{% endfor %}
<h3>Caving QM recommendations</h3>
{% for qm in qms_recommended %}
<li>{{qm|link}}</li>
+ {% empty %}
+ [none found in database[qms_recommended]]
{% endfor %}
{% endblock content %}
{% block margins %}
-<img class="leftMargin eyeCandy fadeIn" src="{{ settings.MEDIA_URL }}eieshole.jpg">
-<img class="rightMargin eyeCandy fadeIn" src="{{ settings.MEDIA_URL }}goesser.jpg">
{% endblock margins %}