diff options
author | Philip Sargent <philip.sargent@klebos.com> | 2021-05-05 00:35:10 +0100 |
---|---|---|
committer | Philip Sargent <philip.sargent@klebos.com> | 2021-05-05 00:35:10 +0100 |
commit | d374779c473a65fca4740d83942bae24c10f683d (patch) | |
tree | 76805079a17b1570a87c996665b9748c3c9fd1f8 /core/views/uploads.py | |
parent | 44b6770b6a562bb8a7d453ddfd1b0b547013a958 (diff) | |
download | troggle-d374779c473a65fca4740d83942bae24c10f683d.tar.gz troggle-d374779c473a65fca4740d83942bae24c10f683d.tar.bz2 troggle-d374779c473a65fca4740d83942bae24c10f683d.zip |
dwg upload and django admin extra search
Diffstat (limited to 'core/views/uploads.py')
-rw-r--r-- | core/views/uploads.py | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/core/views/uploads.py b/core/views/uploads.py new file mode 100644 index 0000000..6273ec4 --- /dev/null +++ b/core/views/uploads.py @@ -0,0 +1,188 @@ +import re, os +import subprocess +from pathlib import Path + +from django import forms + +from django.conf import settings +from django.urls import reverse +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 troggle.parsers.imports import import_caves, import_people, import_surveyscans +from troggle.parsers.imports import import_logbooks, import_QMs, import_drawingsfiles, import_survex +# 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 .auth import login_required_if_public + +'''File upload 'views' +''' + +todo = ''' +-Move upload forms to proper file locations +''' + +class FilesForm(forms.Form): # not a model-form, just a form-form + uploadfiles = forms.FileField() + +@login_required_if_public +def scanupload(request, wallet=None): + '''Upload scanned image files into a wallet on /expofiles + This does NOT use a Django model linked to a Django form. Just a simple Django form. + ''' + 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] + if int(year) < 1977: + year = "1977" + if int(year) > 2050: + year = "2050" + 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}' + + context = {'year': year, 'prev': prev, 'next': next, 'prevy': prevy, 'nexty': nexty} + + wallet = wallet.replace(':','#') + dirpath = Path(settings.SURVEY_SCANS, year, wallet) + + form = FilesForm() + + if request.method == 'POST': + form = FilesForm(request.POST,request.FILES) + if form.is_valid(): + f = request.FILES["uploadfiles"] + multiple = request.FILES.getlist('uploadfiles') + fs = FileSystemStorage(os.path.join(settings.SURVEY_SCANS, year, wallet)) + + 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)') + else: + files = sorted(files) + + if dirs: + dirs = sorted(dirs) + + return render(request, 'scanuploadform.html', + {'form': form, 'wallet': wallet, **context, 'files': files, 'dirs': dirs, 'filesaved': filesaved, 'actual_saved': actual_saved}) + +@login_required_if_public +def dwgupload(request, folder=None): + '''Upload DRAWING files (tunnel or therion) into the upload folder in :drawings: + This does NOT use a Django model linked to a Django form. Just a simple Django form. + + We use get_or_create instead of simply creating a new object in case someone uploads the same file + several times in one session, and expects them to be overwritten in the database. Although + the actual file will be duplicated in the filesystem with different random name ammendation. + ''' + def dwgvalid(name): + if name in [ '.gitignore', '.hgignore', ]: + return False + if Path(name).suffix.lower() in ['.xml', '.th', '.th2', '', '.svg', '.jpg', '.pdf', 'jpeg']: + return True + return False + + filesaved = False + actual_saved = [] + refused = [] + doesnotexist = '' + #print(f'! - FORM dwgupload - start "{folder}"') + if folder is None: + folder = "" # improve this later + dirpath = Path(settings.DRAWINGS_DATA) + urlfile = '/dwgdataraw' + urldir = '/dwgupload' + else: + dirpath = Path(settings.DRAWINGS_DATA, folder) + urlfile = Path('/dwgdataraw/') / folder + urldir = Path('/dwgupload/') / folder + + form = FilesForm() + + if request.method == 'POST': + form = FilesForm(request.POST,request.FILES) + if form.is_valid(): + f = request.FILES["uploadfiles"] + multiple = request.FILES.getlist('uploadfiles') + fs = FileSystemStorage(os.path.join(settings.DRAWINGS_DATA, folder)) + + actual_saved = [] + refused = [] + git = settings.GIT + if multiple: + for f in multiple: + if dwgvalid(f.name): + saved_filename = fs.save(f.name, content=f) + actual_saved.append(saved_filename) + subprocess.call([git, "add", saved_filename], cwd=dirpath) + # dwgfile = DrawingFile(dwgpath=f.name, dwgname=Path(f.name).stem, filesize=f.size) + dwgfile, created = DrawingFile.objects.get_or_create(dwgpath=saved_filename, dwgname=Path(f.name).stem, filesize=f.size) + # if not created: + # print(f'FAILED to create {saved_filename} in {dirpath}') + # else: + # print(f'{dwgfile}') + dwgfile.save() + else: + refused.append(f.name) + # print(f'! - FORM dwgupload multiple {actual_saved}') + filesaved = True + subprocess.call([git, "commit", "-m", 'dwgupload'], cwd=dirpath) + files = [] + dirs = [] + #print(f'! - FORM dwgupload - start {folder} \n"{dirpath}" \n"{dirpath.parent}" \n"{dirpath.exists()}"') + try: + for f in dirpath.iterdir(): + if f.is_dir(): + if f.name not in ['.git' ]: + dirs.append(f.name) + continue + if f.is_file(): + if dwgvalid(f.name): + files.append(f.name) + continue + except FileNotFoundError: + doesnotexist = True + if files: + files = sorted(files) + + if dirs: + dirs = sorted(dirs) + + return render(request, 'dwguploadform.html', + {'form': form, 'doesnotexist': doesnotexist, 'urlfile': urlfile, 'urldir': urldir,'folder': folder, 'files': files, 'dirs': dirs, 'filesaved': filesaved, 'actual_saved': actual_saved, 'refused': refused}) |