mirror of
https://expo.survex.com/repositories/troggle/.git
synced 2024-11-21 23:01:52 +00:00
file upload integration test working
This commit is contained in:
parent
fde30685a8
commit
8f1d6e2cc2
@ -25,6 +25,7 @@ todo = '''ADD TESTS when we are redirecting /expofiles/ to a remote file-deliver
|
||||
|
||||
import unittest
|
||||
import re
|
||||
from http import HTTPStatus
|
||||
from django.test import TestCase, SimpleTestCase, Client
|
||||
|
||||
|
||||
@ -170,8 +171,6 @@ class PageTests(TestCase):
|
||||
ph = r'All Survey scans folders '
|
||||
content = response.content.decode()
|
||||
phmatch = re.search(ph, content)
|
||||
# with open('ss-op.html', 'w') as f:
|
||||
# f.write(content)
|
||||
self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'")
|
||||
|
||||
|
||||
|
@ -7,6 +7,8 @@ Modified for Expo April 2021.
|
||||
|
||||
import unittest
|
||||
import re
|
||||
from http import HTTPStatus
|
||||
|
||||
from django.test import TestCase, SimpleTestCase, TransactionTestCase, Client
|
||||
|
||||
|
||||
@ -61,6 +63,41 @@ class FixturePageTests(TestCase):
|
||||
t = re.search(r'Troggle administration', content)
|
||||
self.assertIsNone(t, 'Logged in as \'' + u.username + '\' (not staff) but still managed to get the Admin page' )
|
||||
|
||||
class PostTests(TestCase):
|
||||
'''
|
||||
'''
|
||||
fixtures = ['auth_users']
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
pass
|
||||
|
||||
def setUp(self):
|
||||
from django.contrib.auth.models import User
|
||||
self.user = User.objects.get(username='expotest')
|
||||
self.client = Client()
|
||||
|
||||
def test_scan_upload(self):
|
||||
'''Test file upload. Need to login first.
|
||||
'''
|
||||
c = self.client
|
||||
from django.contrib.auth.models import User
|
||||
u = User.objects.get(username='expotest')
|
||||
|
||||
self.assertTrue(u.is_active, 'User \'' + u.username + '\' is INACTIVE')
|
||||
logged_in = c.login(username=u.username, password='secretword')
|
||||
|
||||
with open('README.txt','r') as testf:
|
||||
response = self.client.post('/scanupload/2021:02', data={'title': '2021#00', 'name': 'README.txt', 'scanfiles': testf })
|
||||
content = response.content.decode()
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
with open('test_up.html', 'w') as f:
|
||||
f.write(content)
|
||||
t = re.search(r'README.txt', content)
|
||||
self.assertIsNone(t, 'Logged in as \'' + u.username + '\' (not staff) but failed to upload file' )
|
||||
|
||||
|
||||
|
||||
class ComplexLoginTests(TestCase):
|
||||
'''These test the login and capabilities of logged-in users, they do not use fixtures'''
|
||||
|
@ -8,7 +8,7 @@ from django.contrib.admin.widgets import AdminDateWidget
|
||||
|
||||
#from tinymce.widgets import TinyMCE
|
||||
|
||||
from troggle.core.models.troggle import Person, PersonExpedition, Expedition, SimpleFileModel
|
||||
from troggle.core.models.troggle import Person, PersonExpedition, Expedition
|
||||
from troggle.core.models.caves import Cave, LogbookEntry, QM, Entrance, CaveAndEntrance
|
||||
|
||||
'''These are all the Forms used by troggle
|
||||
@ -107,55 +107,5 @@ class EntranceLetterForm(ModelForm):
|
||||
model = CaveAndEntrance
|
||||
exclude = ('cave', 'entrance')
|
||||
|
||||
def get_name(pe):
|
||||
if pe.nickname:
|
||||
return pe.nickname
|
||||
else:
|
||||
return pe.person.first_name
|
||||
|
||||
class UploadFileForm(forms.Form):
|
||||
"""Only called by views.others.newFile() which seems to be only about logbook files.
|
||||
"""
|
||||
title = forms.CharField(max_length=50)
|
||||
file = forms.FileField()
|
||||
#html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
|
||||
html = forms.CharField(widget=forms.Textarea(attrs={"cols":80, "rows":20}))
|
||||
lon_utm = forms.FloatField(required=False)
|
||||
lat_utm = forms.FloatField(required=False)
|
||||
slug = forms.CharField(max_length=50)
|
||||
date = forms.DateField(required=False)
|
||||
survey_point = forms.CharField()
|
||||
|
||||
# Because this has EXECUTABLE statements in its signature (the fields) they get
|
||||
# executed when this module is LOADED. Which barfs horribly.
|
||||
# so all put in an __init__ method instead pending deletion or rewriting
|
||||
def __init__(self):
|
||||
#This next line is the one that causes django.setup() to BARF LOUDLY
|
||||
caves = [cave.slug for cave in Cave.objects.all()]
|
||||
#caves.sort() # sort needs rewriting for python3
|
||||
caves = ["-----"] + caves
|
||||
cave = forms.ChoiceField([(c, c) for c in caves], required=False)
|
||||
|
||||
entrance = forms.ChoiceField([("-----", "Please select a cave"), ], required=False)
|
||||
|
||||
expeditions = [e.year for e in Expedition.objects.all()]
|
||||
expeditions.sort()
|
||||
expeditions = ["-----"] + expeditions
|
||||
expedition = forms.ChoiceField([(e, e) for e in expeditions], required=False)
|
||||
|
||||
qm = forms.ChoiceField([("-----", "Please select a cave"), ], required=False)
|
||||
logbookentry = forms.ChoiceField([("-----", "Please select an expedition"), ], required=False)
|
||||
person = forms.ChoiceField([("-----", "Please select an expedition"), ], required=False)
|
||||
|
||||
|
||||
|
||||
class SimpleUploadFileForm(forms.ModelForm):
|
||||
"""New in April 2021
|
||||
"""
|
||||
class Meta:
|
||||
model = SimpleFileModel
|
||||
fields = ('title', 'simplefile',)
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -229,12 +229,3 @@ class PersonExpedition(TroggleModel):
|
||||
def day_max(self):
|
||||
res = self.persontrip_set.all().aggregate(day_max=models.Max("expeditionday__date"))
|
||||
return res["day_max"]
|
||||
|
||||
class SimpleFileModel(models.Model):
|
||||
simplefile = models.FileField(upload_to='fileuploads/') # in MEDIA_FILES
|
||||
title = models.CharField(max_length = 80)
|
||||
class Meta:
|
||||
ordering = ['title']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.title}"
|
||||
|
@ -2,6 +2,7 @@ import re, os
|
||||
from pathlib import Path
|
||||
|
||||
from django import forms
|
||||
|
||||
from django.conf import settings
|
||||
from django.urls import reverse
|
||||
from django.db.models import Q
|
||||
@ -16,7 +17,6 @@ from troggle.parsers.imports import import_logbooks, import_QMs, import_drawings
|
||||
from troggle.core.models.troggle import Expedition, Person, PersonExpedition
|
||||
from troggle.core.models.caves import LogbookEntry, QM, Cave, PersonTrip
|
||||
from .login import login_required_if_public
|
||||
from troggle.core.forms import UploadFileForm, SimpleUploadFileForm
|
||||
|
||||
'''Utility functions and code to serve the control panel and individual user's
|
||||
progress and task list (deprecated as we do not have individual user login).
|
||||
@ -203,6 +203,11 @@ def ajax_test(request):
|
||||
content_type="application/json")
|
||||
|
||||
|
||||
|
||||
class MyForm(forms.Form): # not a model-form
|
||||
title = forms.CharField(max_length=20)
|
||||
scanfiles = forms.FileField() # in MEDIA_FILES
|
||||
|
||||
@login_required_if_public
|
||||
def scanupload(request, wallet=None):
|
||||
'''Upload one scanned image file into a wallet on /expofiles
|
||||
@ -228,13 +233,15 @@ def scanupload(request, wallet=None):
|
||||
wallet = wallet.replace(':','#')
|
||||
dirpath = Path(settings.SURVEY_SCANS, year, wallet)
|
||||
|
||||
form = MyForm()
|
||||
|
||||
if request.method == 'POST':
|
||||
form = SimpleUploadFileForm(request.POST,request.FILES)
|
||||
form = MyForm(request.POST,request.FILES)
|
||||
if form.is_valid():
|
||||
#form.save() # comment out so nothing saved in MEDIA_ROOT/fileuploads
|
||||
f = request.FILES["simplefile"]
|
||||
f = request.FILES["scanfiles"]
|
||||
w = request.POST["title"]
|
||||
multiple = request.FILES.getlist('simplefile')
|
||||
multiple = request.FILES.getlist('scanfiles')
|
||||
fs = FileSystemStorage(os.path.join(settings.SURVEY_SCANS, year, w))
|
||||
|
||||
actual_saved = []
|
||||
@ -260,7 +267,70 @@ def scanupload(request, wallet=None):
|
||||
files.append('(no image files in wallet)')
|
||||
|
||||
|
||||
form = SimpleUploadFileForm()
|
||||
return render(request, 'scanuploadform.html',
|
||||
{'form': form, 'wallet': wallet, 'year': year, 'prev': prev, 'next': next, 'prevy': prevy, 'nexty': nexty, 'files': files, 'dirs': dirs, 'filesaved': filesaved, 'actual_saved': actual_saved})
|
||||
|
||||
|
||||
# @login_required_if_public
|
||||
# def verysimplescanupload(request, wallet=None):
|
||||
# '''Upload one scanned image file into a wallet on /expofiles
|
||||
# '''
|
||||
# print(f'VERY SIMPLE')
|
||||
# filesaved = False
|
||||
# actual_saved = []
|
||||
# print(f'! - FORM scanupload - start {wallet}')
|
||||
# if wallet is None:
|
||||
# wallet = "2021#01" # improve this later
|
||||
# if not re.match('(19|20)\d\d:\d\d', wallet):
|
||||
# wallet = "2021:01" # improve this later
|
||||
|
||||
# year = wallet[:4]
|
||||
# nexty = f'{int(year)+1}'
|
||||
# prevy = f'{int(year)-1}'
|
||||
# wnumber = wallet[5:]
|
||||
# next = f'{int(wnumber)+1:02d}'
|
||||
# prev = f'{int(wnumber)-1:02d}'
|
||||
|
||||
# if int(wnumber) == 0:
|
||||
# prev = f'{int(wnumber):02d}'
|
||||
|
||||
# wallet = wallet.replace(':','#')
|
||||
# dirpath = Path(settings.SURVEY_SCANS, year, wallet)
|
||||
|
||||
# form = MyForm()
|
||||
|
||||
# if request.method == 'POST':
|
||||
# form = MyForm(request.POST,request.FILES)
|
||||
# if form.is_valid():
|
||||
# #form.save() # comment out so nothing saved in MEDIA_ROOT/fileuploads
|
||||
# f = request.FILES["simplefile"]
|
||||
# w = request.POST["title"]
|
||||
# multiple = request.FILES.getlist('simplefile')
|
||||
# fs = FileSystemStorage(os.path.join(settings.SURVEY_SCANS, year, w))
|
||||
|
||||
# actual_saved = []
|
||||
# if multiple:
|
||||
# for f in multiple:
|
||||
# actual_saved.append( fs.save(f.name, content=f) )
|
||||
# #print(f'! - FORM scanupload multiple {actual_saved}')
|
||||
# filesaved = True
|
||||
|
||||
# files = []
|
||||
# dirs = []
|
||||
# #print(f'! - FORM scanupload - start {wallet} {dirpath}')
|
||||
# try:
|
||||
# for f in dirpath.iterdir():
|
||||
# if f.is_dir():
|
||||
# dirs.append(f.name)
|
||||
# if f.is_file():
|
||||
# if f.name != 'contents.json' and f.name != 'walletindex.html':
|
||||
# files.append(f.name)
|
||||
# except FileNotFoundError:
|
||||
# files.append('(no wallet yet - would be created)')
|
||||
# if len(files) ==0 :
|
||||
# files.append('(no image files in wallet)')
|
||||
|
||||
|
||||
# return render(request, 'scanuploadform.html',
|
||||
# {'form': form, 'wallet': wallet, 'year': year, 'prev': prev, 'next': next, 'prevy': prevy, 'nexty': nexty, 'files': files, 'dirs': dirs, 'filesaved': filesaved, 'actual_saved': actual_saved})
|
||||
|
||||
|
@ -1,18 +0,0 @@
|
||||
<h2>Fileupload</h2>
|
||||
|
||||
<ul>
|
||||
{% for fileuploaded in filesuploaded %}
|
||||
<li>UPLOADEDFILE: {{fileuploaded}}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<p>MESSAGE: {{message}}
|
||||
</p>
|
||||
|
||||
{% if not filesuploaded %}
|
||||
<form action="" method="POST">
|
||||
<p>file to upload</p>
|
||||
<p><input type="file" name="file1"/></p>
|
||||
<p><input type="submit" name="submit" value="Submit" /></p>
|
||||
</form>
|
||||
{% endif %}
|
@ -16,25 +16,12 @@
|
||||
</p>
|
||||
|
||||
|
||||
<div style = "max-width:40%;">
|
||||
|
||||
{% if filesaved %}
|
||||
<p style="margin-left:20%;">
|
||||
<b>File(s) saved as
|
||||
{% for f in actual_saved %}
|
||||
<em>'{{f}}'</em>
|
||||
{% endfor %}
|
||||
<br><br>Upload more?</b>
|
||||
</p>
|
||||
<br>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div style = "max-width:40%;">
|
||||
<form method ='post' enctype ="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
<br>
|
||||
<input type = "file" multiple="multiple" style = "margin-left:20%;"
|
||||
placeholder = "Simplefile" name = "simplefile" id="files">
|
||||
placeholder = "Scanfiles" name = "scanfiles" id="scanfiles">
|
||||
<br> <br>
|
||||
<input type = "text" size = "8" style = "margin-left:20%;"
|
||||
placeholder = "Wallet id e.g. 2021#23" name = "title" value='{{wallet}}'id="wallet"><label for="wallet"> Wallet id</label>
|
||||
@ -46,7 +33,17 @@
|
||||
</button>
|
||||
</center>
|
||||
</form>
|
||||
</div>
|
||||
{% if filesaved %}
|
||||
<p style="margin-left:20%;">
|
||||
<b>File(s) saved as
|
||||
{% for f in actual_saved %}
|
||||
<em>'{{f}}'</em>
|
||||
{% endfor %}
|
||||
<br><br>Upload more?</b>
|
||||
</p>
|
||||
<br>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<p style="margin-left:20%;">
|
||||
{% for f in files %}
|
||||
|
2
urls.py
2
urls.py
@ -10,7 +10,7 @@ from django.urls import reverse, resolve
|
||||
|
||||
from troggle.core.views import caves, statistics, survex
|
||||
from troggle.core.views.surveys import scansingle, singlewallet, allwallets, dwgdata, dwgfilesingle, dwgfileupload
|
||||
from troggle.core.views.other import troggle404, frontpage, todos, controlpanel, frontpage, scanupload
|
||||
from troggle.core.views.other import troggle404, frontpage, todos, controlpanel, frontpage, scanupload
|
||||
from troggle.core.views.other import exportlogbook
|
||||
from troggle.core.views.caves import ent, cavepage
|
||||
from troggle.core.views.logbooks import get_logbook_entries, logbookentry, logbookSearch
|
||||
|
Loading…
Reference in New Issue
Block a user