summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/TESTS/test_imports.py96
-rw-r--r--core/TESTS/tests-cuyc-ignored.py39
-rw-r--r--core/TESTS/tests.py5
-rw-r--r--core/TESTS/tests_caves.py9
-rw-r--r--core/TESTS/tests_logins.py9
-rw-r--r--core/admin.py14
-rw-r--r--core/context.py1
-rw-r--r--core/forms.py10
-rw-r--r--core/management/commands/dummycmd.py4
-rw-r--r--core/middleware.py5
-rw-r--r--core/models/caves.py33
-rw-r--r--core/models/survex.py15
-rw-r--r--core/models/troggle.py22
-rw-r--r--core/utils.py23
-rw-r--r--core/views/auth.py5
-rw-r--r--core/views/caves.py26
-rw-r--r--core/views/drawings.py9
-rw-r--r--core/views/editor_helpers.py20
-rw-r--r--core/views/expo.py22
-rw-r--r--core/views/logbooks.py14
-rw-r--r--core/views/other.py31
-rw-r--r--core/views/prospect.py11
-rw-r--r--core/views/scans.py18
-rw-r--r--core/views/statistics.py18
-rw-r--r--core/views/survex.py22
-rw-r--r--core/views/uploads.py46
26 files changed, 289 insertions, 238 deletions
diff --git a/core/TESTS/test_imports.py b/core/TESTS/test_imports.py
index 943b5d9..40d0a5f 100644
--- a/core/TESTS/test_imports.py
+++ b/core/TESTS/test_imports.py
@@ -18,11 +18,12 @@ them.
https://docs.djangoproject.com/en/3.0/topics/testing/tools/
"""
-import unittest
import re
import subprocess
+import unittest
+
+from django.test import Client, SimpleTestCase, TestCase
-from django.test import TestCase, SimpleTestCase, Client
class SimpleTest(SimpleTestCase):
def test_test_setting(self):
@@ -35,78 +36,93 @@ class SimpleTest(SimpleTestCase):
from troggle.core.models.caves import Cave
def test_import_parsers_surveys(self):
#from PIL import Image
- from troggle.core.utils import save_carefully
from functools import reduce
+
+ from troggle.core.utils import save_carefully
def test_import_parsers_survex(self):
- import troggle.settings as settings
- import troggle.core.models.troggle as models
- import troggle.core.models.survex as models_survex
import troggle.core.models.caves as models_caves
- from troggle.parsers.people import GetPersonExpeditionNameLookup
+ import troggle.core.models.survex as models_survex
+ import troggle.core.models.troggle as models
+ import troggle.settings as settings
+ from troggle.core.views import (caves, drawings, other, scans,
+ statistics, survex, uploads)
+ from troggle.core.views.caves import cavepage, ent
from troggle.core.views.other import frontpage
- from troggle.core.views.caves import ent, cavepage
- from troggle.core.views import scans, drawings, other, caves, statistics, survex, uploads
+ from troggle.parsers.people import GetPersonExpeditionNameLookup
def test_import_views_uploads(self):
from troggle.core.views.uploads import dwgupload, scanupload
def test_import_parsers_QMs(self):
from troggle.core.models.caves import QM, Cave, LogbookEntry
def test_import_parsers_people(self):
from html import unescape
+
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.troggle import DataIssue, Expedition
- from troggle.core.models.caves import Cave, LogbookEntry, PersonTrip
+
from parsers.people import GetPersonExpeditionNameLookup
+ from troggle.core.models.caves import Cave, LogbookEntry, PersonTrip
+ from troggle.core.models.troggle import DataIssue, Expedition
def test_import_core_views_caves(self):
+ from django.conf import settings
+ from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
- import troggle.core.views.expo
+
+ import troggle.core.views.expo
+ from troggle.core.forms import (CaveAndEntranceFormSet, CaveForm,
+ EntranceForm, EntranceLetterForm)
+ from troggle.core.models.caves import (QM, Area, Cave, CaveAndEntrance,
+ CaveSlug, Entrance,
+ EntranceSlug, SurvexStation)
from troggle.core.models.troggle import Expedition
- from troggle.core.models.caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation
- from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, EntranceForm, EntranceLetterForm
from troggle.core.views.auth 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.parsers.caves
- import troggle.parsers.people
import troggle.parsers.drawings
- import troggle.parsers.scans
import troggle.parsers.logbooks
+ import troggle.parsers.people
import troggle.parsers.QMs
- import troggle.parsers.survex
+ import troggle.parsers.scans
+ import troggle.parsers.survex
+ import troggle.settings
+ from troggle.parsers.logbooks import GetCaveLookup
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.core import management
+ from django.db import close_old_connections, connection, connections
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.contrib import admin
- from django.contrib import auth
- from django.urls import reverse, resolve
- from django.views.generic.base import RedirectView
+ from django.conf.urls import include, url
+ from django.contrib import admin, auth
+ from django.urls import resolve, reverse
+ from django.views.generic.base import RedirectView
from django.views.generic.edit import UpdateView
from django.views.generic.list import ListView
- from troggle.core.views import other, caves, statistics, survex
+
+ from troggle.core.views import caves, other, statistics, survex
from troggle.core.views.auth import expologin, expologout
- from troggle.core.views.caves import ent, cavepage
- from troggle.core.views.expo import expofiles_redirect, expofilessingle, expopage, editexpopage, mediapage, map, mapfile
- from troggle.core.views.logbooks import expedition, personexpedition, Expeditions_tsvListView, Expeditions_jsonListView
- from troggle.core.views.logbooks import get_logbook_entries, logbookentry
- from troggle.core.views.logbooks import notablepersons, person, get_people
+ from troggle.core.views.caves import cavepage, ent
+ from troggle.core.views.expo import (editexpopage, expofiles_redirect,
+ expofilessingle, expopage, map,
+ mapfile, mediapage)
+ from troggle.core.views.logbooks import (Expeditions_jsonListView,
+ Expeditions_tsvListView,
+ expedition,
+ get_logbook_entries,
+ get_people, logbookentry,
+ notablepersons, person,
+ personexpedition)
from troggle.core.views.other import controlpanel
- from troggle.core.views.prospect import prospecting
- from troggle.core.views.prospect import prospecting_image
- from troggle.core.views.statistics import pathsreport, stats, dataissues
- from troggle.core.views.survex import survexcaveslist, survexcavesingle, svx
+ from troggle.core.views.prospect import prospecting, prospecting_image
+ from troggle.core.views.statistics import (dataissues, pathsreport,
+ stats)
+ from troggle.core.views.survex import (survexcavesingle,
+ survexcaveslist, svx)
class SubprocessTest(TestCase):
@@ -123,8 +139,8 @@ class SubprocessTest(TestCase):
def test_utf8(self):
'''Expects that utf8 is the default encoding when opening files
'''
- import sys
import locale
+ import sys
self.assertTrue( sys.getdefaultencoding() == "utf-8", f'{sys.getdefaultencoding()} - UTF8 error in getdefaultencoding')
self.assertTrue( sys.getfilesystemencoding() == "utf-8", f'{sys.getfilesystemencoding()} - UTF8 error in getfilesystemencoding')
self.assertTrue( locale.getdefaultlocale()[1] == "UTF-8", f'{locale.getdefaultlocale()} - UTF8 error in locale.getdefaultlocale')
@@ -148,6 +164,7 @@ class SubprocessTest(TestCase):
''' Expects clean git repos with no added files and no merge failures
'''
from pathlib import Path
+
import troggle.settings as settings
TROGGLE_PATH = Path(settings.REPOS_ROOT_PATH) / "troggle"
for cwd in [settings.SURVEX_DATA, settings.EXPOWEB, settings.DRAWINGS_DATA, TROGGLE_PATH]:
@@ -179,6 +196,7 @@ class SubprocessTest(TestCase):
''' Expects no failures of survex files
'''
from pathlib import Path
+
import troggle.settings as settings
cwd = settings.SURVEX_DATA
for survey in ["1623.svx", "1626.svx"]:
diff --git a/core/TESTS/tests-cuyc-ignored.py b/core/TESTS/tests-cuyc-ignored.py
index 3e98f94..ac4e5b3 100644
--- a/core/TESTS/tests-cuyc-ignored.py
+++ b/core/TESTS/tests-cuyc-ignored.py
@@ -18,28 +18,30 @@ $ python manage.py test cuy.club --parallel
Runs the tests in this file only
"""
-import unittest
import re
-from django.test import TestCase, SimpleTestCase, TransactionTestCase, Client
+import unittest
+
+from django.test import Client, SimpleTestCase, TestCase, TransactionTestCase
+
class ImportTest(TestCase):
def test_import_imports(self):
- # Need to go through all modules and copy all imports here
+ ed to go through all modules and copy all imports here
+ from io import StringIO
+
+ from cuy.club.models import (Article, Event, Member, Webpage,
+ WebpageCategory)
+ from cuy.website.views.generic import PUBLIC_LOGIN
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core import management
from django.db import connection, connections
- from django.http import HttpResponse
+ from django.db.utils import IntegrityError
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.template.defaultfilters import slugify
from django.utils.timezone import get_current_timezone, make_aware
- from io import StringIO
- from cuy.club.models import Member, Article, Event, WebpageCategory, Webpage
- from cuy.website.views.generic import PUBLIC_LOGIN
- from cuy.club.models import Member
- from django.db.utils import IntegrityError
class SimpleTest(SimpleTestCase):
@@ -110,9 +112,9 @@ class DataTests(TestCase ):
self.assertIsNotNone(None, "Failed to enforce 'UNIQUE constraint' on saving two Member objects with same user_id")
def test_article_invalid_date(self):
- from cuy.club.models import Member, Article
- from django.db.utils import IntegrityError
+ from cuy.club.models import Article, Member
from django.core.exceptions import ValidationError
+ from django.db.utils import IntegrityError
a = Article()
m = self.member
@@ -126,9 +128,9 @@ class DataTests(TestCase ):
self.assertIsNotNone(t, "Exception is not the expected 'invalid format'")
def test_article_and_author_not_null(self):
- from cuy.club.models import Member, Article
- from django.db.utils import IntegrityError
+ from cuy.club.models import Article, Member
from django.core.exceptions import ValidationError
+ from django.db.utils import IntegrityError
a2 = Article()
a2.publish ="2021-02-17 17:25"
@@ -143,9 +145,9 @@ class DataTests(TestCase ):
self.assertIsNotNone(None, "Exception is not the expected 'NOT NULL constraint failed' IntegrityError")
def test_article_and_author_ok(self):
- from cuy.club.models import Member, Article
- from django.db.utils import IntegrityError
+ from cuy.club.models import Article, Member
from django.core.exceptions import ValidationError
+ from django.db.utils import IntegrityError
m = self.member
a3 = Article()
@@ -201,8 +203,8 @@ class FixturePageTests(TestCase):
def test_fix_admin_login_fail(self):
c = self.client
- from django.contrib.auth.models import User
from cuy.club.models import Member
+ from django.contrib.auth.models import User
m = Member.objects.get(pk=9002)
u = User.objects.get(username='bingo')
@@ -223,7 +225,7 @@ class ComplexLoginTests(TestCase):
'''These test the login and capabilities of logged-in users'''
def setUp(self):
'''setUp runs once for each test in this class'''
- from cuy.club.models import Member, MEMBER_TYPES, AFFILIATION
+ from cuy.club.models import AFFILIATION, MEMBER_TYPES, Member
from django.contrib.auth.models import User
m = Member()
m.pk=8000
@@ -344,6 +346,7 @@ class ComplexLoginTests(TestCase):
def test_committee_login(self):
from django.contrib.auth.models import User
+
# User must be associated with a Member for whom is_committee() is True
c = self.client # inherited from TestCase
u = self.user
@@ -407,7 +410,7 @@ class DynamicPageTests(TestCase):
def test_full_yachts(self):
'''Creating a WebpageCategory and an index webpage creates a valid url
'''
- from cuy.club.models import WebpageCategory, Webpage
+ from cuy.club.models import Webpage, WebpageCategory
wc = WebpageCategory()
wc.pk = 8000
wc.id = 8000
diff --git a/core/TESTS/tests.py b/core/TESTS/tests.py
index e74a11b..cc10c14 100644
--- a/core/TESTS/tests.py
+++ b/core/TESTS/tests.py
@@ -25,10 +25,11 @@ todo = '''ADD TESTS when we are redirecting /expofiles/ to a remote file-deliver
- Add test for running cavern to produce a .3d file
'''
-import unittest
import re
+import unittest
from http import HTTPStatus
-from django.test import TestCase, SimpleTestCase, Client
+
+from django.test import Client, SimpleTestCase, TestCase
#class SimplePageTest(unittest.TestCase):
diff --git a/core/TESTS/tests_caves.py b/core/TESTS/tests_caves.py
index dd8f1df..732ebe8 100644
--- a/core/TESTS/tests_caves.py
+++ b/core/TESTS/tests_caves.py
@@ -2,11 +2,14 @@
Modified for Expo April 2021.
"""
-import unittest
import re
-from django.test import TestCase, SimpleTestCase, Client
+import unittest
+
+from django.test import Client, SimpleTestCase, TestCase
+
+from troggle.core.models.caves import Area, Cave
from troggle.core.models.troggle import Expedition, Person, PersonExpedition
-from troggle.core.models.caves import Cave, Area
+
class FixtureTests(TestCase):
'''These just hit the database.
diff --git a/core/TESTS/tests_logins.py b/core/TESTS/tests_logins.py
index 364f16a..02eceb6 100644
--- a/core/TESTS/tests_logins.py
+++ b/core/TESTS/tests_logins.py
@@ -5,17 +5,18 @@ Philip Sargent (Feb.2021)
Modified for Expo April 2021.
"""
-import unittest
-import re
import pathlib
+import re
import subprocess
+import unittest
from http import HTTPStatus
-from django.test import TestCase, SimpleTestCase, TransactionTestCase, Client
+from django.test import Client, SimpleTestCase, TestCase, TransactionTestCase
+
+import troggle.settings as settings
from troggle.core.models.survex import Wallet
from troggle.core.models.troggle import Expedition
-import troggle.settings as settings
class DataTests(TestCase ):
'''These check that the NULL and NON-UNIQUE constraints are working in the database '''
diff --git a/core/admin.py b/core/admin.py
index 7bc78e5..c266a97 100644
--- a/core/admin.py
+++ b/core/admin.py
@@ -1,14 +1,18 @@
import django.forms as forms
from django.contrib import admin
+from django.core import serializers
from django.forms import ModelForm
from django.http import HttpResponse
-from django.core import serializers
+from troggle.core.models.caves import (QM, Area, Cave, CaveAndEntrance,
+ Entrance, LogbookEntry, PersonTrip)
+from troggle.core.models.survex import (DrawingFile, SingleScan, SurvexBlock,
+ SurvexDirectory, SurvexFile,
+ SurvexPersonRole, SurvexStation,
+ Wallet)
+from troggle.core.models.troggle import (DataIssue, Expedition, Person,
+ PersonExpedition)
from troggle.core.views.other import exportlogbook
-from troggle.core.models.troggle import Person, PersonExpedition, Expedition, DataIssue
-from troggle.core.models.caves import Cave, Area, Entrance, CaveAndEntrance, LogbookEntry, PersonTrip, QM
-from troggle.core.models.survex import SurvexBlock, SurvexFile, SurvexPersonRole, SurvexStation, SurvexDirectory
-from troggle.core.models.survex import Wallet, SingleScan, DrawingFile
'''This code significantly adds to the capabilities of the Django Management control panel for Troggle data.
In particular, it enables JSON export of any data with 'export_as_json'
diff --git a/core/context.py b/core/context.py
index 9ac1f60..a8ebd0b 100644
--- a/core/context.py
+++ b/core/context.py
@@ -1,4 +1,5 @@
from django.conf import settings
+
from troggle.core.models.troggle import Expedition
'''This is the only troggle-specific 'context processor' that troggle uses
diff --git a/core/forms.py b/core/forms.py
index 2dd9549..4b1399d 100644
--- a/core/forms.py
+++ b/core/forms.py
@@ -2,16 +2,18 @@ import string
from datetime import date
import django.forms as forms
+from django.contrib.admin.widgets import AdminDateWidget
from django.forms import ModelForm
from django.forms.models import modelformset_factory
-from django.contrib.admin.widgets import AdminDateWidget
+
+from troggle.core.models.caves import (QM, Cave, CaveAndEntrance, Entrance,
+ LogbookEntry)
+from troggle.core.models.troggle import Expedition, Person, PersonExpedition
+from troggle.core.views.editor_helpers import HTMLarea
#from tinymce.widgets import TinyMCE
-from troggle.core.models.troggle import Person, PersonExpedition, Expedition
-from troggle.core.models.caves import Cave, LogbookEntry, QM, Entrance, CaveAndEntrance
-from troggle.core.views.editor_helpers import HTMLarea
'''These are all the class-based Forms used by troggle.
There are other, simpler, upload forms in view/uploads.py
diff --git a/core/management/commands/dummycmd.py b/core/management/commands/dummycmd.py
index 3628cf8..6e13011 100644
--- a/core/management/commands/dummycmd.py
+++ b/core/management/commands/dummycmd.py
@@ -1,10 +1,10 @@
import os
from optparse import make_option
-from django.db import connection
+from django.contrib.auth.models import User
from django.core import management
from django.core.management.base import BaseCommand, CommandError
-from django.contrib.auth.models import User
+from django.db import connection
import settings
diff --git a/core/middleware.py b/core/middleware.py
index 06c159a..c535291 100644
--- a/core/middleware.py
+++ b/core/middleware.py
@@ -1,6 +1,7 @@
-from django.conf import settings
from django import http
-from django.urls import reverse, resolve,Resolver404
+from django.conf import settings
+from django.urls import Resolver404, resolve, reverse
+
"""Non-standard django middleware is loaded from this file.
"""
diff --git a/core/models/caves.py b/core/models/caves.py
index 084bcdd..70a13ae 100644
--- a/core/models/caves.py
+++ b/core/models/caves.py
@@ -1,33 +1,30 @@
-import string
-import os
import datetime
-import re
import json
-import subprocess
import operator
-from datetime import datetime, timezone
-
+import os
+import re
+import string
+import subprocess
from collections import defaultdict
+from datetime import datetime, timezone
from pathlib import Path
-
from urllib.parse import urljoin
-import settings
-
-from django.db import models
-from django.core.files.storage import FileSystemStorage
+from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
-from django.db.models import Min, Max
-from django.conf import settings
-from django.urls import reverse
-from django.template import Context, loader
+from django.core.files.storage import FileSystemStorage
+from django.db import models
+from django.db.models import Max, Min
from django.shortcuts import render
+from django.template import Context, loader
+from django.urls import reverse
-from troggle.core.models.troggle import TroggleModel, Person, Expedition, DataIssue
+import settings
from troggle.core.models.survex import SurvexStation
-from troggle.core.utils import writetrogglefile
-from troggle.core.utils import TROG
+from troggle.core.models.troggle import (DataIssue, Expedition, Person,
+ TroggleModel)
+from troggle.core.utils import TROG, writetrogglefile
# Use the TROG global object to cache the cave lookup list. No good for multi-user..
Gcavelookup = TROG['caves']['gcavelookup']
diff --git a/core/models/survex.py b/core/models/survex.py
index c2a68bf..5ee3f17 100644
--- a/core/models/survex.py
+++ b/core/models/survex.py
@@ -1,14 +1,14 @@
-import os
-import re
+import datetime
import json
import operator
-import datetime
-from urllib.parse import urljoin
-from pathlib import Path
+import os
+import re
from functools import reduce
+from pathlib import Path
+from urllib.parse import urljoin
-from django.db import models
from django.conf import settings
+from django.db import models
from django.urls import reverse
# from troggle.core.models.troggle import DataIssue # circular import. Hmm
@@ -215,7 +215,8 @@ class Wallet(models.Model):
waldata["date"] = thisdate.isoformat()
except:
message = f"! {str(self.walletname)} Date formatting failure {thisdate}. Failed to load from {jsonfile} JSON file"
- from troggle.core.models.troggle import DataIssue
+ from troggle.core.models.troggle import \
+ DataIssue
DataIssue.objects.update_or_create(parser='scans', message=message, url=wurl)
except:
message = f"! {str(self.walletname)} Date format not ISO {datestr}. Failed to load from {jsonfile} JSON file"
diff --git a/core/models/troggle.py b/core/models/troggle.py
index ca3df80..999e826 100644
--- a/core/models/troggle.py
+++ b/core/models/troggle.py
@@ -1,27 +1,25 @@
-import string
-import os
import datetime
+import os
import re
import resource
+import string
+from decimal import Decimal, getcontext
from subprocess import call
-
from urllib.parse import urljoin
-from decimal import Decimal, getcontext
-getcontext().prec=2 #use 2 significant figures for decimal calculations
-import settings
+getcontext().prec=2 #use 2 significant figures for decimal calculations
-from django.db import models
+from django.conf import settings
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
-from django.conf import settings
-
-from django.urls import reverse
-from django.template import Context, loader
from django.core.files.storage import FileSystemStorage
+from django.db import models
+from django.template import Context, loader
+from django.urls import reverse
-import troggle.core.models.survex
+import settings
+import troggle.core.models.survex
from troggle.core.utils import get_process_memory
"""This file declares TroggleModel which inherits from django.db.models.Model
diff --git a/core/utils.py b/core/utils.py
index 8b85cde..5b1599b 100644
--- a/core/utils.py
+++ b/core/utils.py
@@ -1,27 +1,26 @@
-import string
-import os
import datetime
+import logging
+import os
+import random
import re
import resource
-import random
-import logging
+import string
import subprocess
+from decimal import Decimal, getcontext
from pathlib import Path
-
from urllib.parse import urljoin
-from decimal import Decimal, getcontext
-getcontext().prec=2 #use 2 significant figures for decimal calculations
-import settings
+getcontext().prec=2 #use 2 significant figures for decimal calculations
-from django.db import models
+from django.conf import settings
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
-from django.conf import settings
-
-from django.urls import reverse
+from django.db import models
from django.template import Context, loader
+from django.urls import reverse
+
+import settings
'''This file declares TROG a globally visible object for caches.
diff --git a/core/views/auth.py b/core/views/auth.py
index a4dc9d9..86583e7 100644
--- a/core/views/auth.py
+++ b/core/views/auth.py
@@ -1,10 +1,11 @@
from builtins import str
from django.conf import settings
-from django.shortcuts import render, redirect
-from django.contrib.auth import authenticate, login, logout
+from django.contrib.auth import authenticate
from django.contrib.auth import forms as auth_forms
+from django.contrib.auth import login, logout
from django.contrib.auth.decorators import login_required
+from django.shortcuts import redirect, render
from django.utils.http import is_safe_url
"""This enforces the login requirement for non-public pages using
diff --git a/core/views/caves.py b/core/views/caves.py
index 2bb2794..0b291f3 100644
--- a/core/views/caves.py
+++ b/core/views/caves.py
@@ -1,25 +1,29 @@
import os
-import string
import re
-import settings
-import urllib.parse
+import string
import subprocess
+import urllib.parse
from pathlib import Path
from django import forms
from django.conf import settings
-from django.urls import reverse
-from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound
+from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
+from django.http import (HttpResponse, HttpResponseNotFound,
+ HttpResponseRedirect)
from django.shortcuts import get_object_or_404, render
-from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
-from django.urls import NoReverseMatch
+from django.urls import NoReverseMatch, reverse
+import settings
import troggle.settings as settings
+from troggle.core.forms import (CaveAndEntranceFormSet, CaveForm, EntranceForm,
+ EntranceLetterForm)
+from troggle.core.models.caves import (QM, Area, Cave, CaveAndEntrance,
+ CaveSlug, Entrance, EntranceSlug,
+ GetCaveLookup, SurvexStation)
+from troggle.core.models.troggle import DataIssue, Expedition
+from troggle.core.utils import write_and_commit, writetrogglefile
from troggle.core.views import expo
-from troggle.core.models.troggle import Expedition, DataIssue
-from troggle.core.models.caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation, GetCaveLookup
-from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, EntranceForm, EntranceLetterForm
-from troggle.core.utils import writetrogglefile, write_and_commit
+
from .auth import login_required_if_public
'''Manages the complex procedures to assemble a cave description out of the compnoents
diff --git a/core/views/drawings.py b/core/views/drawings.py
index a24664d..d2e635f 100644
--- a/core/views/drawings.py
+++ b/core/views/drawings.py
@@ -1,14 +1,17 @@
-import os, stat
+import os
import re
+import stat
from pathlib import Path
-from urllib.parse import urljoin, unquote as urlunquote
+from urllib.parse import unquote as urlunquote
+from urllib.parse import urljoin
from django.conf import settings
-from django.shortcuts import render
from django.http import HttpResponse
+from django.shortcuts import render
from troggle.core.models.survex import DrawingFile
from troggle.core.views.expo import getmimetype
+
#import parsers.surveys
'''Some of these views serve files as binary blobs, and simply set the mime type based on the file extension,
diff --git a/core/views/editor_helpers.py b/core/views/editor_helpers.py
index d7fd05f..01829cf 100644
--- a/core/views/editor_helpers.py
+++ b/core/views/editor_helpers.py
@@ -1,19 +1,21 @@
-from django.shortcuts import render, redirect
-from django.http import HttpResponse, HttpResponseRedirect, Http404, JsonResponse
+import io
+import re
+from pathlib import Path
-from django.urls import reverse, resolve
+import django.forms as forms
+from django.http import (Http404, HttpResponse, HttpResponseRedirect,
+ JsonResponse)
+from django.shortcuts import redirect, render
from django.template import Context, loader
-import re, io
+from django.urls import resolve, reverse
+from django.views.decorators.csrf import ensure_csrf_cookie
from PIL import Image
-from pathlib import Path
-import django.forms as forms
+
import troggle.settings as settings
+from troggle.core.utils import WriteAndCommitError, write_and_commit
-from django.views.decorators.csrf import ensure_csrf_cookie
from .auth import login_required_if_public
-from troggle.core.utils import write_and_commit, WriteAndCommitError
-
MAX_IMAGE_WIDTH = 1000
MAX_IMAGE_HEIGHT = 800
diff --git a/core/views/expo.py b/core/views/expo.py
index c443c38..2a0a22a 100644
--- a/core/views/expo.py
+++ b/core/views/expo.py
@@ -1,28 +1,26 @@
import os
import re
-
-from sys import getfilesystemencoding as sys_getfilesystemencoding
-
from pathlib import Path
-from urllib.parse import urljoin, unquote as urlunquote
+from sys import getfilesystemencoding as sys_getfilesystemencoding
+from urllib.parse import unquote as urlunquote
+from urllib.parse import urljoin
from urllib.request import urlopen
-from django.shortcuts import render, redirect
-from django.http import HttpResponse, HttpResponseRedirect, Http404
-from django.urls import reverse, resolve
+import django.forms as forms
+from django.contrib import admin
+from django.http import Http404, HttpResponse, HttpResponseRedirect
+from django.shortcuts import redirect, render
from django.template import Context, loader
+from django.urls import resolve, reverse
from django.views.decorators.csrf import ensure_csrf_cookie
-from django.contrib import admin
-
-import django.forms as forms
import troggle.core.views.caves
import troggle.settings as settings
-from .auth import login_required_if_public
from troggle.core.models.caves import Cave
-from troggle.core.utils import write_and_commit, WriteAndCommitError
+from troggle.core.utils import WriteAndCommitError, write_and_commit
from troggle.core.views.editor_helpers import HTMLarea
+from .auth import login_required_if_public
'''Formerly a separate package called 'flatpages' written by Martin Green 2011.
This was NOT django.contrib.flatpages which stores HTML in the database, so the name was changed to expopages.
diff --git a/core/views/logbooks.py b/core/views/logbooks.py
index 40d664c..21cc849 100644
--- a/core/views/logbooks.py
+++ b/core/views/logbooks.py
@@ -1,27 +1,27 @@
import datetime
-import time
import os.path
import re
+import time
import django.db.models
-from django.db.models import Min, Max
-from django.urls import reverse
+from django.db.models import Max, Min
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.template import Context, loader
from django.template.defaultfilters import slugify
+from django.urls import reverse
from django.utils import timezone
from django.views.generic.list import ListView
-from troggle.core.models.troggle import Expedition, Person, PersonExpedition
-from troggle.core.utils import TROG
+import troggle.settings as settings
from troggle.core.models.caves import LogbookEntry, PersonTrip
from troggle.core.models.survex import SurvexBlock, Wallet
-from .auth import login_required_if_public
+from troggle.core.models.troggle import Expedition, Person, PersonExpedition
+from troggle.core.utils import TROG
from troggle.parsers.logbooks import LoadLogbookForExpedition
from troggle.parsers.people import GetPersonExpeditionNameLookup
-import troggle.settings as settings
+from .auth import login_required_if_public
'''These views are for logbook items when they appear in an 'expedition' page
and for persons: their individual pages and their perseonexpedition pages.
diff --git a/core/views/other.py b/core/views/other.py
index 0f3a414..0e02180 100644
--- a/core/views/other.py
+++ b/core/views/other.py
@@ -1,23 +1,26 @@
-import re, os
+import os
+import re
import subprocess
from pathlib import Path
from django import forms
-
from django.conf import settings
-from django.urls import reverse
+from django.core.files.storage import FileSystemStorage, default_storage
from django.db.models import Q
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.template import Context, loader
-from django.core.files.storage import FileSystemStorage, default_storage
+from django.urls import reverse
-from troggle.parsers.imports import import_caves, import_people, import_surveyscans
-from troggle.parsers.imports import import_logbooks, import_QMs, import_drawingsfiles, import_survex
+from troggle.core.models.caves import QM, Cave, LogbookEntry, PersonTrip
+from troggle.core.models.survex import DrawingFile
# from databaseReset import reinit_db # don't do this. databaseRest runs code *at import time*
from troggle.core.models.troggle import Expedition, Person, PersonExpedition
-from troggle.core.models.caves import LogbookEntry, QM, Cave, PersonTrip
-from troggle.core.models.survex import DrawingFile
+from troggle.parsers.imports import (import_caves, import_drawingsfiles,
+ import_logbooks, import_people,
+ import_QMs, import_survex,
+ import_surveyscans)
+
from .auth import login_required_if_public
'''Utility functions and code to serve the control panel and individual user's
@@ -37,18 +40,18 @@ def todos(request, module):
'''produces todo text from module
We could automate this to find all those strings automatically
'''
+ from troggle.core.forms import todo as forms
+ from troggle.core.middleware import todo as middleware
+ from troggle.core.models.caves import todo as modelcaves
from troggle.core.TESTS.tests import todo as tests
- from troggle.core.views.logbooks import todo as viewlogbooks
- from troggle.core.views.survex import todo as viewsurvex
from troggle.core.views.caves import todo as viewcaves
from troggle.core.views.drawings import todo as viewdrawings
+ from troggle.core.views.logbooks import todo as viewlogbooks
+ from troggle.core.views.survex import todo as viewsurvex
from troggle.parsers.caves import todo as parserscaves
- from troggle.parsers.logbooks import todo as parserslogbooks
from troggle.parsers.drawings import todo as parsersdrawings
+ from troggle.parsers.logbooks import todo as parserslogbooks
from troggle.parsers.survex import todo as parserssurvex
- from troggle.core.models.caves import todo as modelcaves
- from troggle.core.middleware import todo as middleware
- from troggle.core.forms import todo as forms
tododict = {'views/other': todo,
'tests': tests,
'views/logbooks': viewlogbooks,
diff --git a/core/views/prospect.py b/core/views/prospect.py
index 4b30f5d..4021f5e 100644
--- a/core/views/prospect.py
+++ b/core/views/prospect.py
@@ -1,18 +1,21 @@
import os
-import string
import re
+import string
import urllib.parse
-# from pathlib import Path
from django.http import HttpResponse
from django.shortcuts import render
-# from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
import troggle.settings as settings
-from troggle.core.models.caves import Entrance, Area, SurvexStation, Cave
+from troggle.core.models.caves import Area, Cave, Entrance, SurvexStation
from troggle.core.views.caves import caveKey
from troggle.parsers.survex import MapLocations
+# from pathlib import Path
+
+# from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
+
+
''' Generates the prospecting guide document.
Also produces the overlay of points on top of a prospecting_image map - to be deleted.
diff --git a/core/views/scans.py b/core/views/scans.py
index a7ce27a..e2af7f8 100644
--- a/core/views/scans.py
+++ b/core/views/scans.py
@@ -1,20 +1,22 @@
-import os, stat
-import re
import datetime
+import os
+import re
+import stat
from pathlib import Path
-from urllib.parse import urljoin, unquote as urlunquote
+from urllib.parse import unquote as urlunquote
+from urllib.parse import urljoin
from urllib.request import urlopen
from django.conf import settings
-from django.shortcuts import render
-from django.http import HttpResponse
from django.db import transaction
+from django.http import HttpResponse
+from django.shortcuts import render
-from troggle.core.models.survex import Wallet, SingleScan, SurvexBlock
-from troggle.core.models.troggle import Person, Expedition
-from troggle.core.models.troggle import DataIssue
from troggle.core.models.caves import GetCaveLookup
+from troggle.core.models.survex import SingleScan, SurvexBlock, Wallet
+from troggle.core.models.troggle import DataIssue, Expedition, Person
from troggle.core.views.expo import getmimetype
+
#from troggle.parsers.people import GetPersonExpeditionNameLookup
#import parsers.surveys
diff --git a/core/views/statistics.py b/core/views/statistics.py
index 34fe66c..d804bb5 100644
--- a/core/views/statistics.py
+++ b/core/views/statistics.py
@@ -1,23 +1,27 @@
import datetime
+import operator
import os.path
import re
-import operator
from collections import OrderedDict
import django.db.models
-from django.db.models import Min, Max
+from django.db.models import Max, Min
from django.shortcuts import render
from django.template import Context, loader
from django.template.defaultfilters import slugify
from django.utils import timezone
-#from django.views.generic.list import ListView
-from troggle.core.models.troggle import Expedition, Person, PersonExpedition, DataIssue
-from troggle.core.models.caves import Cave, LogbookEntry, Entrance
+import troggle.settings as settings
+from troggle.core.models.caves import Cave, Entrance, LogbookEntry
from troggle.core.models.survex import SurvexBlock, SurvexStation
-from troggle.parsers.people import GetPersonExpeditionNameLookup, foreign_friends
+from troggle.core.models.troggle import (DataIssue, Expedition, Person,
+ PersonExpedition)
+from troggle.parsers.people import (GetPersonExpeditionNameLookup,
+ foreign_friends)
+
+#from django.views.generic.list import ListView
+
-import troggle.settings as settings
'''Very simple report pages summarizing data about the whole set of expeditions and of
the status of data inconsistencies
diff --git a/core/views/survex.py b/core/views/survex.py
index 8b9b508..0a4c7f1 100644
--- a/core/views/survex.py
+++ b/core/views/survex.py
@@ -1,25 +1,25 @@
-import re
-import os
import datetime
import difflib
-from pathlib import Path
+import os
+import re
import socket
+from pathlib import Path
from django import forms
-from django.http import HttpResponseRedirect, HttpResponse, Http404
+from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
+from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.template.context_processors import csrf
from django.views.decorators.csrf import ensure_csrf_cookie
-from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
-
-import troggle.settings as settings
import parsers.survex
-from troggle.core.models.troggle import Expedition, Person, PersonExpedition
-from troggle.core.models.survex import SurvexBlock, SurvexPersonRole, SurvexFile, SurvexDirectory
-from troggle.core.models.caves import Cave, PersonTrip, LogbookEntry
+import troggle.settings as settings
+from troggle.core.models.caves import Cave, LogbookEntry, PersonTrip
+from troggle.core.models.survex import (SurvexBlock, SurvexDirectory,
+ SurvexFile, SurvexPersonRole)
+from troggle.core.models.troggle import Expedition, Person, PersonExpedition
+from troggle.core.utils import WriteAndCommitError, only_commit
from troggle.parsers.people import GetPersonExpeditionNameLookup
-from troggle.core.utils import only_commit, WriteAndCommitError
'''Everything that views survexfiles
but also displays data on a cave or caves when there is ambiguity
diff --git a/core/views/uploads.py b/core/views/uploads.py
index 648e340..5f40b30 100644
--- a/core/views/uploads.py
+++ b/core/views/uploads.py
@@ -1,41 +1,43 @@
-import re, os, socket
-import subprocess
+import datetime
import json
-import settings
-import urllib
import operator
-import datetime
-
-from pathlib import Path
+import os
+import re
+import socket
+import subprocess
+import urllib
from functools import reduce
+from pathlib import Path
from urllib.parse import unquote
from django import forms
-
from django.conf import settings
-from django.urls import reverse
+from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
+from django.core.files.storage import FileSystemStorage, default_storage
from django.db.models import Q
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.template import Context, loader
-from django.core.files.storage import FileSystemStorage, default_storage
-from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
-
+from django.urls import reverse
-#from troggle import settings
-from troggle.parsers.imports import import_caves, import_people, import_surveyscans
-from troggle.parsers.imports import import_logbooks, import_QMs, import_drawingsfiles, import_survex
-from troggle.parsers.scans import contentsjson
+import settings
+from troggle.core.models.caves import QM, Cave, LogbookEntry, PersonTrip
+from troggle.core.models.survex import (DrawingFile, SurvexBlock, SurvexFile,
+ SurvexPersonRole, Wallet)
# from databaseReset import reinit_db # don't do this. databaseRest runs code *at import time*
-from troggle.core.models.troggle import DataIssue
-from troggle.core.models.troggle import Expedition, Person, PersonExpedition
-from troggle.core.models.caves import LogbookEntry, QM, Cave, PersonTrip
-from troggle.core.models.survex import DrawingFile, Wallet, SurvexBlock, SurvexFile, SurvexPersonRole
-from troggle.core.views.scans import oldwallet, caveifywallet
+from troggle.core.models.troggle import (DataIssue, Expedition, Person,
+ PersonExpedition)
from troggle.core.views.caves import getCave
-
+from troggle.core.views.scans import caveifywallet, oldwallet
+#from troggle import settings
+from troggle.parsers.imports import (import_caves, import_drawingsfiles,
+ import_logbooks, import_people,
+ import_QMs, import_survex,
+ import_surveyscans)
+from troggle.parsers.scans import contentsjson
from .auth import login_required_if_public
+
#from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt
'''File upload 'views'