mirror of
https://github.com/peeringdb/peeringdb.git
synced 2024-05-11 05:55:09 +00:00
add --commit option to geosync command to be in line with other peeringdb commands, add tests for running geosync command
68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
import googlemaps
|
|
import reversion
|
|
|
|
from django.core.management.base import BaseCommand
|
|
from django.conf import settings
|
|
|
|
from peeringdb_server import models
|
|
|
|
API_KEY = settings.GOOGLE_GEOLOC_API_KEY
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Sync latitude and longitude on all geocoding enabled entities"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
"reftag", nargs="?", help=
|
|
"can be reftag only such as 'fac' or reftag with id to only sync that specific entity such as 'fac.1'"
|
|
)
|
|
parser.add_argument(
|
|
"--limit", type=int, default=0,
|
|
help="limit how many rows are synced, useful for testing")
|
|
parser.add_argument(
|
|
'--commit', action='store_true',
|
|
help="commit changes, otherwise run in pretend mode")
|
|
|
|
def log(self, msg):
|
|
if not self.commit:
|
|
self.stdout.write(u"[pretend] {}".format(msg))
|
|
else:
|
|
self.stdout.write(msg)
|
|
|
|
def handle(self, *args, **options):
|
|
self.commit = options.get("commit", False)
|
|
reftag = options.get("reftag")
|
|
limit = options.get("limit")
|
|
if reftag.find(".") > -1:
|
|
reftag, _id = reftag.split(".")
|
|
else:
|
|
_id = 0
|
|
self.gmaps = googlemaps.Client(API_KEY, timeout=5)
|
|
self.sync(reftag, _id, limit=limit)
|
|
|
|
@reversion.create_revision()
|
|
def sync(self, reftag, _id, limit=0):
|
|
model = models.REFTAG_MAP.get(reftag)
|
|
if not model:
|
|
raise ValueError(u"Unknown reftag: {}".format(reftag))
|
|
if not hasattr(model, "geocode_status"):
|
|
raise TypeError(
|
|
"Can only geosync models containing GeocodeBaseMixin")
|
|
q = model.handleref.undeleted().filter(geocode_status=False)
|
|
if _id:
|
|
q = q.filter(id=_id)
|
|
count = q.count()
|
|
if limit > 0:
|
|
q = q[:limit]
|
|
i = 0
|
|
for entity in q:
|
|
if entity.geocode_status:
|
|
continue
|
|
i += 1
|
|
self.log(u"Syncing {} [{} {}/{} ID:{}]".format(entity.name, reftag, i,
|
|
count, entity.id))
|
|
|
|
if self.commit:
|
|
entity.geocode(self.gmaps)
|