maposmatic/www/maposmatic/helpers.py

140 wiersze
5.4 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) 2017 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 datetime
import psycopg2
import random
import string
from www.maposmatic.models import MapRenderingJob
import www.settings
def rendering_already_exists_by_osmid(osmid):
"""Returns the ID of a rendering matching the given OpenStreetMap city ID
from the last 24 hours, or None if no rendering can be found matching this
criteria."""
# First try to find rendered items
rendered_items = (MapRenderingJob.objects
.filter(submission_time__gte=(datetime.datetime.now()
- datetime.timedelta(1)))
.filter(administrative_osmid=osmid)
.filter(status=2)
.filter(resultmsg="ok")
.order_by("-submission_time")[:1])
if len(rendered_items) and rendered_items[0].has_output_files():
return rendered_items[0].id
# Then try to find items being rendered or waiting for rendering
rendered_items = (MapRenderingJob.objects
.filter(submission_time__gte=(datetime.datetime.now()
- datetime.timedelta(1)))
.filter(administrative_osmid=osmid)
.filter(status__in=[0,1])
.order_by("-submission_time")[:1])
if len(rendered_items):
return rendered_items[0].id
# No rendering found
return None
def rendering_already_exists_by_bbox(lat_upper_left, lon_upper_left,
lat_bottom_right, lon_bottom_right):
"""Returns the ID of a rendering matching the given bounding box from the
last 24 hours, or None if no rendering can be found matching this
criteria."""
# First try to find rendered items
rendered_items = (MapRenderingJob.objects
.filter(submission_time__gte=(datetime.datetime.now()
- datetime.timedelta(1)))
.filter(lat_upper_left=lat_upper_left)
.filter(lon_upper_left=lon_upper_left)
.filter(lat_bottom_right=lat_bottom_right)
.filter(lon_bottom_right=lon_bottom_right)
.filter(status=2)
.filter(resultmsg="ok")
.order_by("-submission_time")[:1])
if len(rendered_items) and rendered_items[0].has_output_files():
return rendered_items[0].id
# Then try to find items being rendered or waiting for rendering
rendered_items = (MapRenderingJob.objects
.filter(submission_time__gte=(datetime.datetime.now()
- datetime.timedelta(1)))
.filter(lat_upper_left=lat_upper_left)
.filter(lon_upper_left=lon_upper_left)
.filter(lat_bottom_right=lat_bottom_right)
.filter(lon_bottom_right=lon_bottom_right)
.filter(status__in=[0,1])
.order_by("-submission_time")[:1])
if len(rendered_items):
return rendered_items[0].id
# No rendering found
return None
def rendering_already_exists(job):
# Handle very old jobs when we didn't store an OSM ID for maps rendered by
# administrative boundary.
if not job.administrative_osmid and not job.lat_upper_left:
return None
if job.administrative_osmid:
return rendering_already_exists_by_osmid(job.administrative_osmid)
return rendering_already_exists_by_bbox(job.lat_upper_left,
job.lon_upper_left,
job.lat_bottom_right,
job.lon_bottom_right)
def get_pages_list(page, paginator):
"""Returns a list of number.
It contains the id of the pages to display for a page given."""
# Navigation pages
nav = {}
page_list = []
last = False
for i in [1, 2,
page.number-1, page.number, page.number+1,
paginator.num_pages-1, paginator.num_pages]:
nav[i] = True
for i in range(1, paginator.num_pages+1):
if i in nav:
if last and i - last > 1:
page_list.append('...')
page_list.append(i)
last = i
return page_list
def generate_nonce(length):
return ''.join(random.choice(string.ascii_letters) for i in range(length))