kopia lustrzana https://github.com/hholzgra/maposmatic/
163 wiersze
6.5 KiB
Python
163 wiersze
6.5 KiB
Python
# coding: utf-8
|
|
|
|
# maposmatic, the web front-end of the MapOSMatic city map generation system
|
|
# Copyright (C) 2009 David Decotigny
|
|
# Copyright (C) 2009 Frédéric Lehobey
|
|
# Copyright (C) 2009 Pierre Mauduit
|
|
# Copyright (C) 2009 David Mentré
|
|
# Copyright (C) 2009 Maxime Petazzoni
|
|
# Copyright (C) 2009 Thomas Petazzoni
|
|
# Copyright (C) 2009 Gaël Utard
|
|
# Copyright (C) 2023 Hartmut Holzgraefe
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import logging
|
|
LOG = logging.getLogger('maposmatic')
|
|
|
|
import datetime
|
|
from ipware import get_client_ip
|
|
|
|
from django.core.paginator import Paginator, InvalidPage, EmptyPage
|
|
from django.http import HttpResponseRedirect, HttpResponseNotAllowed
|
|
from django.shortcuts import render
|
|
from django.utils.translation import gettext, gettext_lazy as _
|
|
from django.utils.safestring import mark_safe
|
|
from django.urls import reverse
|
|
|
|
import www.settings
|
|
from www.maposmatic import helpers, forms, models, views
|
|
|
|
import ocitysmap
|
|
|
|
def _create_upload_file(job, file, keep_until = None):
|
|
first_line = file.readline().decode("utf-8-sig")
|
|
LOG.info("firstline type %s" % type(first_line))
|
|
if first_line.startswith(u'<?xml'):
|
|
file_type = 'gpx'
|
|
else:
|
|
file_type = 'umap'
|
|
file_instance = models.UploadFile(uploaded_file = file,
|
|
file_type = file_type,
|
|
keep_until = keep_until)
|
|
file_instance.save()
|
|
file_instance.job.add(job)
|
|
|
|
def _new_POST(request):
|
|
form = forms.MapRenderingJobForm(request.POST, request.FILES)
|
|
|
|
if not form.is_valid():
|
|
data = {'form': form }
|
|
return render(request, 'generic_error.html', data)
|
|
|
|
# remember some settings as future defaults
|
|
request.session['new_layout'] = form.cleaned_data.get('layout')
|
|
request.session['new_indexer'] = form.cleaned_data.get('indexer')
|
|
request.session['new_stylesheet'] = form.cleaned_data.get('stylesheet')
|
|
request.session['new_overlay'] = form.cleaned_data.get('overlay')
|
|
request.session['new_paper_width_mm'] = form.cleaned_data.get('paper_width_mm')
|
|
request.session['new_paper_height_mm'] = form.cleaned_data.get('paper_height_mm')
|
|
|
|
job = form.save(commit=False)
|
|
job.administrative_osmid = form.cleaned_data.get('administrative_osmid')
|
|
job.stylesheet = form.cleaned_data.get('stylesheet')
|
|
job.overlay = ",".join(form.cleaned_data.get('overlay'))
|
|
job.layout = form.cleaned_data.get('layout')
|
|
if job.layout.startswith('multi'):
|
|
job.queue = 'multipage'
|
|
job.indexer = form.cleaned_data.get('indexer')
|
|
job.paper_width_mm = form.cleaned_data.get('paper_width_mm')
|
|
job.paper_height_mm = form.cleaned_data.get('paper_height_mm')
|
|
job.status = 0 # Submitted
|
|
if www.settings.SUBMITTER_IP_LIFETIME != 0:
|
|
job.submitterip = request.META['REMOTE_ADDR']
|
|
else:
|
|
job.submitterip = None
|
|
|
|
job.submitteremail = form.cleaned_data.get('submitteremail')
|
|
job.map_language = form.cleaned_data.get('map_language')
|
|
job.index_queue_at_submission = (models.MapRenderingJob.objects
|
|
.queue_size(job.queue) + 1)
|
|
job.nonce = helpers.generate_nonce(models.MapRenderingJob.NONCE_SIZE)
|
|
|
|
client_ip, is_routable = get_client_ip(request)
|
|
if www.settings.EXTRA_IP is None or ( client_ip is not None and client_ip == www.settings.EXTRA_IP ):
|
|
job.extra_text = www.settings.EXTRA_FOOTER
|
|
job.logo = "bundled:osm-logo.svg"
|
|
job.extra_logo = www.settings.EXTRA_LOGO
|
|
|
|
job.save()
|
|
|
|
files = request.FILES.getlist('uploadfile')
|
|
if form.cleaned_data.get('delete_files_after_rendering'):
|
|
keep_until = None
|
|
else:
|
|
if www.settings.UPLOAD_FILE_LIFETIME > 0:
|
|
keep_until = datetime.datetime.now() + datetime.timedelta(days=www.settings.UPLOAD_FILE_LIFETIME)
|
|
else:
|
|
keep_until = '2999-12-30' # arbitrary 'max' value
|
|
for file in files:
|
|
_create_upload_file(job, file, keep_until)
|
|
|
|
return HttpResponseRedirect(reverse('map-by-id-and-nonce',
|
|
args=[job.id, job.nonce]))
|
|
|
|
|
|
def _new_GET(request):
|
|
init_vals = request.GET.dict()
|
|
oc = ocitysmap.OCitySMap(www.settings.OCITYSMAP_CFG_PATH)
|
|
|
|
if not 'layout' in init_vals and 'new_layout' in request.session :
|
|
init_vals['layout'] = request.session['new_layout']
|
|
else:
|
|
request.session['new_layout'] = oc.get_all_renderer_names()[0]
|
|
|
|
if not 'indexer' in init_vals and 'new_indexer' in request.session :
|
|
init_vals['indexer'] = request.session['new_indexer']
|
|
else:
|
|
request.session['new_indexer'] = 'Street' # TODO make configurable
|
|
|
|
if not 'stylesheet' in init_vals and 'new_stylesheet' in request.session:
|
|
init_vals['stylesheet'] = request.session['new_stylesheet']
|
|
else:
|
|
request.session['new_stylesheet'] = oc.get_all_style_names()[0]
|
|
|
|
if not 'overlay' in init_vals and 'new_overlay' in request.session:
|
|
init_vals['overlay'] = request.session['new_overlay']
|
|
|
|
if not 'paper_width_mm' in init_vals and 'new_paper_width_mm' in request.session:
|
|
init_vals['paper_width_mm'] = request.session['new_paper_width_mm']
|
|
|
|
if not 'paper_height_mm' in init_vals and 'new_paper_width_mm' in request.session:
|
|
init_vals['paper_height_mm'] = request.session['new_paper_height_mm']
|
|
|
|
form = forms.MapRenderingJobForm(initial=init_vals)
|
|
|
|
papersize_buttons, multisize_buttons = views._papersize_buttons()
|
|
|
|
return render(request, 'maposmatic/new.html',
|
|
{ 'form' : form ,
|
|
'papersize_suggestions': mark_safe(papersize_buttons),
|
|
'multipage_papersize_suggestions': mark_safe(multisize_buttons),
|
|
})
|
|
|
|
def new(request):
|
|
"""The map creation page and form."""
|
|
if request.method == 'POST':
|
|
return _new_POST(request)
|
|
elif request.method == 'GET':
|
|
return _new_GET(request)
|
|
else:
|
|
return HttpResponseNotAllowed(request.method)
|