create undefined places/events
This commit is contained in:
parent
daaabba071
commit
1f1683c5a5
7 changed files with 120 additions and 43 deletions
|
|
@ -23,6 +23,8 @@ class Place(models.Model):
|
|||
'''
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
defined = models.BooleanField(default=True)
|
||||
|
||||
user = models.ForeignKey(User, null=True, related_name='places')
|
||||
|
||||
name = models.CharField(max_length=1024)
|
||||
|
|
@ -30,20 +32,20 @@ class Place(models.Model):
|
|||
name_sort = models.CharField(max_length=200)
|
||||
name_find = models.TextField(default='', editable=False)
|
||||
|
||||
geoname = models.CharField(max_length=1024, unique=True)
|
||||
geoname_sort = models.CharField(max_length=1024, unique=True)
|
||||
geoname = models.CharField(max_length=1024, unique=True, null=True)
|
||||
geoname_sort = models.CharField(max_length=1024, unique=True, null=True)
|
||||
countryCode = models.CharField(max_length=16, default='')
|
||||
|
||||
wikipediaId = models.CharField(max_length=1000, blank=True)
|
||||
type = models.CharField(max_length=1000, default='')
|
||||
|
||||
south = models.FloatField(default=0)
|
||||
west = models.FloatField(default=0)
|
||||
north = models.FloatField(default=0)
|
||||
east = models.FloatField(default=0)
|
||||
lat = models.FloatField(default=0)
|
||||
lng = models.FloatField(default=0)
|
||||
area = models.FloatField(default=0)
|
||||
south = models.FloatField(default=None, null=True)
|
||||
west = models.FloatField(default=None, null=True)
|
||||
north = models.FloatField(default=None, null=True)
|
||||
east = models.FloatField(default=None, null=True)
|
||||
lat = models.FloatField(default=None, null=True)
|
||||
lng = models.FloatField(default=None, null=True)
|
||||
area = models.FloatField(default=None, null=True)
|
||||
|
||||
matches = models.IntegerField(default=0)
|
||||
items = models.ManyToManyField(Item, blank=True, related_name='places')
|
||||
|
|
@ -57,9 +59,21 @@ class Place(models.Model):
|
|||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
@classmethod
|
||||
def get_or_create(model, name):
|
||||
qs = model.objects.filter(name_find__icontains=u'|%s|'%name)
|
||||
if qs.count() == 0:
|
||||
instance = model(name=name)
|
||||
instance.save()
|
||||
else:
|
||||
instance = qs[0]
|
||||
return instance
|
||||
|
||||
def editable(self, user):
|
||||
if user and not user.is_anonymous() \
|
||||
and (self.user == user or user.get_profile().capability('canEditPlaces')):
|
||||
and (not self.user or \
|
||||
self.user == user or \
|
||||
user.get_profile().capability('canEditPlaces')):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
|
@ -69,9 +83,10 @@ class Place(models.Model):
|
|||
def json(self, keys=None, user=None):
|
||||
j = {
|
||||
'id': self.get_id(),
|
||||
'user': self.user.username,
|
||||
'editable': self.editable(user)
|
||||
}
|
||||
if self.user:
|
||||
j['user'] = self.user.username
|
||||
for key in ('created', 'modified',
|
||||
'name', 'alternativeNames', 'geoname', 'countryCode',
|
||||
'south', 'west', 'north', 'east',
|
||||
|
|
@ -106,18 +121,25 @@ class Place(models.Model):
|
|||
self.matches = numberofmatches
|
||||
self.save()
|
||||
|
||||
def make_undefined(self):
|
||||
self.defined = False
|
||||
self.south = None
|
||||
self.west = None
|
||||
self.north = None
|
||||
self.east = None
|
||||
self.lat = None
|
||||
self.lng = None
|
||||
self.area = None
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.name_sort:
|
||||
self.name_sort = self.name #', '.join(self.name)
|
||||
self.geoname_sort = ', '.join(reversed(self.geoname.split(', ')))
|
||||
if self.geoname:
|
||||
self.geoname_sort = ', '.join(reversed(self.geoname.split(', ')))
|
||||
self.name_find = '|%s|'%'|'.join([self.name]+list(self.alternativeNames))
|
||||
|
||||
#update center
|
||||
#self.lat = ox.location.center(self.south, self.north)
|
||||
#self.lng = ox.location.center(self.east, self.west)
|
||||
|
||||
#update area
|
||||
#self.area= ox.location.area(self.south, self.west, self.north, self.east)
|
||||
self.defined = len(filter(None, [getattr(self, key)
|
||||
for key in ('south', 'west', 'north', 'east')])) > 0
|
||||
|
||||
super(Place, self).save(*args, **kwargs)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ import tasks
|
|||
|
||||
@login_required_json
|
||||
def addPlace(request):
|
||||
#FIXME: require admin
|
||||
'''
|
||||
param data {
|
||||
name: "",
|
||||
|
|
@ -36,20 +35,24 @@ def addPlace(request):
|
|||
type: ""
|
||||
}
|
||||
'''
|
||||
#FIXME: check permissions
|
||||
data = json.loads(request.POST['data'])
|
||||
exists = False
|
||||
existing_names = []
|
||||
existing_geoname = ''
|
||||
names = data.pop('name')
|
||||
for name in [names] + data.get('alternativeNames', []):
|
||||
if models.Place.objects.filter(name_find__icontains=u'|%s|'%name).count() != 0:
|
||||
if models.Place.objects.filter(defined=True,
|
||||
name_find__icontains=u'|%s|'%name).count() != 0:
|
||||
exists = True
|
||||
existing_names.append(name)
|
||||
if 'geoname' in data:
|
||||
if models.Place.objects.filter(geoname=data['geoname']).count() > 0:
|
||||
if models.Place.objects.filter(defined=True,
|
||||
geoname=data['geoname']).count() > 0:
|
||||
exists = True
|
||||
existing_geoname = data['geoname']
|
||||
if not exists:
|
||||
models.Place.objects.filter(defined=False, name__in=names).delete()
|
||||
place = models.Place()
|
||||
place.user = request.user
|
||||
place.name = names
|
||||
|
|
@ -96,14 +99,17 @@ def editPlace(request):
|
|||
alternative_names = filter(lambda n: n.strip(), alternative_names)
|
||||
data['alternativeNames'] = alternative_names
|
||||
for name in names + alternative_names:
|
||||
if models.Place.objects.filter(name_find__icontains=u'|%s|'%name).exclude(id=place.id).count() != 0:
|
||||
if models.Place.objects.filter(defined=True,
|
||||
name_find__icontains=u'|%s|'%name).exclude(id=place.id).count() != 0:
|
||||
conflict = True
|
||||
conflict_names.append(name)
|
||||
if 'geoname' in data:
|
||||
if models.Place.objects.filter(geoname=data['geoname']).exclude(id=place.id).count() != 0:
|
||||
if models.Place.objects.filter(defined=True,
|
||||
geoname=data['geoname']).exclude(id=place.id).count() != 0:
|
||||
conflict = True
|
||||
conflict_geoname = data['geoname']
|
||||
if not conflict:
|
||||
models.Place.objects.filter(defined=False, name__in=names+alternative_names).delete()
|
||||
for key in data:
|
||||
if key != 'id':
|
||||
value = data[key]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue