summaryrefslogtreecommitdiff
path: root/app/unused_apps/birds/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/unused_apps/birds/models.py')
-rw-r--r--app/unused_apps/birds/models.py295
1 files changed, 295 insertions, 0 deletions
diff --git a/app/unused_apps/birds/models.py b/app/unused_apps/birds/models.py
new file mode 100644
index 0000000..5a14786
--- /dev/null
+++ b/app/unused_apps/birds/models.py
@@ -0,0 +1,295 @@
+import datetime
+from django.urls import reverse
+from django.template.defaultfilters import slugify
+from django.contrib.gis.db import models
+from django.contrib.auth.models import User
+from django.utils import timezone
+from locations.models import Location
+from django import forms
+from django.conf import settings
+
+from photos.models import LuxImage
+
+
+def get_upload_path(self, filename):
+ return "images/bird-images/%s/%s" % (datetime.datetime.today().strftime("%Y"), filename)
+
+
+# from http://aba.org/checklist/codes.html
+ABA_CODES = (
+ (0, 'unknown'),
+ (1, 'regular occurring - common'),
+ (2, 'regular occurring - less common'),
+ (3, 'rare'),
+ (4, 'casual'),
+ (5, 'accidental'),
+ (6, 'Cannot be found'),
+)
+
+KIND_LIST = (
+ (1, 'Bird'),
+ (2, 'Mammal'),
+ (3, 'Reptile'),
+ (4, 'Amphibian'),
+ (5, 'Plant'),
+)
+
+
+class APClass(models.Model):
+ common_name = models.CharField(max_length=200)
+ scientific_name = models.CharField(max_length=200)
+ kind = models.IntegerField(choices=KIND_LIST, default=1)
+
+ class Meta:
+ verbose_name_plural = 'Animal/Plant Class'
+ ordering = ["kind", "common_name"]
+
+ def __str__(self):
+ return self.common_name
+
+class AP(models.Model):
+ common_name = models.CharField(max_length=200)
+ slug = models.SlugField()
+ scientific_name = models.CharField(max_length=200)
+ code = models.IntegerField(choices=ABA_CODES, default=0)
+ apclass = models.ForeignKey(APClass, on_delete=models.CASCADE)
+ image = models.FileField(upload_to=get_upload_path, null=True, blank=True, help_text="width of high res is 1360px")
+ image_credit = models.CharField(max_length=200, blank=True, null=True)
+
+ def __str__(self):
+ return self.common_name
+
+ def get_image_url(self):
+ return "%s%s" % (settings.IMAGES_URL, self.image.url.split("media")[1][8:])
+
+ def get_absolute_url(self):
+ return reverse("sightings:detail", kwargs={"slug": self.slug})
+
+ def kind(self):
+ return self.apclass.kind
+
+ class Meta:
+ verbose_name_plural = 'Animal/Plant'
+ verbose_name = 'Animal/Plant'
+ ordering = ["common_name", ]
+
+ def save(self, *args, **kwargs):
+ self.slug = slugify(self.common_name[:50])
+ super(AP, self).save(*args, **kwargs)
+
+
+class Sighting(models.Model):
+ ap = models.ForeignKey(AP, on_delete=models.CASCADE)
+ point = models.PointField(blank=True)
+ location = models.ForeignKey(Location, on_delete=models.CASCADE, blank=True, related_name="location_old")
+ date = models.DateTimeField('Date', default=timezone.now)
+ seen_by = models.ManyToManyField(User, related_name="seenby_old")
+ images = models.ManyToManyField(LuxImage, blank=True, related_name="images_old")
+ #audio = models.ManyToManyField(BirdAudio, blank=True)
+
+ class Meta:
+ ordering = ["-date", ]
+
+ @property
+ def state(self):
+ return self.location.state
+
+ @property
+ def country(self):
+ return self.location.state.country
+
+ @property
+ def region(self):
+ return self.location.state.country.lux_region
+
+ @property
+ def longitude(self):
+ '''Get the site's longitude.'''
+ return self.point.x
+
+ @property
+ def latitude(self):
+ '''Get the site's latitude.'''
+ return self.point.y
+
+ def get_small_image(self):
+ for img in self.images.all():
+ for size in img.sizes.all():
+ if size.width > 360 and size.width < 700:
+ return img.get_image_by_size(size)
+
+ def get_absolute_url(self):
+ return reverse("birds:detail", kwargs={"slug": self.bird.slug})
+
+ def __str__(self):
+ return self.ap.common_name
+
+ def save(self):
+ if not self.point:
+ self.point = Sighting.objects.latest().point
+ try:
+ self.location = Location.objects.filter(
+ geometry__contains=self.point
+ ).get()
+ except Location.DoesNotExist:
+ raise forms.ValidationError("There is no location associated with that point, add it: %sadmin/locations/location/add/" % (settings.BASE_URL))
+ super(Sighting, self).save()
+
+"""
+Migration from Birds to abstract:
+birdclass = BirdClass.objects.all()
+for b in birdclass:
+ APClass.objects.create(
+ common_name = b.common_name,
+ scientific_name = b.scientific_name,
+ kind = 1
+ )
+
+birds = Bird.objects.all()
+for b in birds:
+ ap = APClass.objects.get(scientific_name=b.bird_class.scientific_name)
+ print(ap)
+ AP.objects.create(
+ common_name = b.common_name,
+ scientific_name = b.scientific_name,
+ code = b.code,
+ apclass = ap,
+ image = b.image,
+ image_credit = b.image_credit,
+ )
+ print(t)
+
+birdsighting = BirdSighting.objects.all()
+for bird in birdsighting:
+ ap = AP.objects.get(scientific_name=bird.bird.scientific_name)
+ s = Sighting.objects.create(
+ ap = ap,
+ point = bird.point,
+ location = bird.location,
+ date = bird.date,
+ )
+ for t in bird.images.all():
+ s.images.add(t)
+ for t in bird.seen_by.all():
+ s.seen_by.add(t)
+"""
+
+
+class BirdClass(models.Model):
+ common_name = models.CharField(max_length=200)
+ scientific_name = models.CharField(max_length=200)
+
+ class Meta:
+ verbose_name_plural = 'Bird Class'
+ ordering = ["common_name", ]
+
+ def __str__(self):
+ return self.common_name
+
+
+class Bird(models.Model):
+ common_name = models.CharField(max_length=200)
+ slug = models.SlugField()
+ scientific_name = models.CharField(max_length=200)
+ code = models.IntegerField(choices=ABA_CODES, default=0)
+ bird_class = models.ForeignKey(BirdClass, on_delete=models.CASCADE)
+ image = models.FileField(upload_to=get_upload_path, null=True, blank=True, help_text="width of high res is 1360px")
+ image_credit = models.CharField(max_length=200, blank=True, null=True)
+
+ def __str__(self):
+ return self.common_name
+
+ # function to resize large image to 680px wide and use as normal image
+ # the question is, should this happen here, or with some universale image
+ # model that can be attached to other models, loaded in entries and
+ # displayed in galleries. I suppose the answer is yes then isn't it?
+ # the problem is that I still can't see exactly what that looks like...
+
+ def get_image_url(self):
+ return "%s%s" % (settings.IMAGES_URL, self.image.url.split("media")[1][8:])
+
+ def get_absolute_url(self):
+ return reverse("birds:detail", kwargs={"slug": self.slug})
+
+ class Meta:
+ ordering = ["common_name", ]
+
+ def save(self):
+ self.slug = slugify(self.common_name[:50])
+ super(Bird, self).save()
+
+
+class BirdAudio(models.Model):
+ bird = models.ForeignKey(Bird, on_delete=models.CASCADE, related_name='recordings')
+ audio = models.FileField(upload_to='audio/birds/')
+ recorder = models.CharField(max_length=200, null=True, blank=True)
+ pub_date = models.DateTimeField()
+ location = models.CharField(max_length=200, null=True, blank=True)
+ link = models.CharField(max_length=450, null=True, blank=True)
+ copyright = models.CharField(max_length=250, null=True, blank=True)
+
+ class Meta:
+ verbose_name_plural = 'Bird Audio'
+ ordering = ["bird", ]
+
+ def __str__(self):
+ return self.bird.common_name
+
+
+class BirdSighting(models.Model):
+ bird = models.ForeignKey(Bird, on_delete=models.CASCADE)
+ point = models.PointField(blank=True)
+ location = models.ForeignKey(Location, on_delete=models.CASCADE, blank=True)
+ date = models.DateTimeField('Date', default=timezone.now)
+ seen_by = models.ManyToManyField(User)
+ images = models.ManyToManyField(LuxImage, blank=True)
+ audio = models.ManyToManyField(BirdAudio, blank=True)
+
+ class Meta:
+ verbose_name_plural = 'Bird Sighting'
+ get_latest_by = 'date'
+
+ @property
+ def state(self):
+ return self.location.state
+
+ @property
+ def country(self):
+ return self.location.state.country
+
+ @property
+ def region(self):
+ return self.location.state.country.lux_region
+
+ @property
+ def longitude(self):
+ '''Get the site's longitude.'''
+ return self.point.x
+
+ @property
+ def latitude(self):
+ '''Get the site's latitude.'''
+ return self.point.y
+
+ def get_small_image(self):
+ for img in self.images.all():
+ for size in img.sizes.all():
+ if size.width > 360 and size.width < 700:
+ return img.get_image_by_size(size)
+
+ def get_absolute_url(self):
+ return reverse("birds:detail", kwargs={"slug": self.bird.slug})
+
+ def __str__(self):
+ return self.bird.common_name
+
+ def save(self):
+ if not self.point:
+ self.point = BirdSighting.objects.latest().point
+ try:
+ self.location = Location.objects.filter(
+ geometry__contains=self.point
+ ).get()
+ except Location.DoesNotExist:
+ raise forms.ValidationError("There is no location associated with that point, add it: %sadmin/locations/location/add/" % (settings.BASE_URL))
+ super(BirdSighting, self).save()