import datetime from django.core.urlresolvers 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 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 = ( (1, 'regular occurring - common'), (2, 'regular occurring - less common'), (3, 'rare'), (4, 'casual'), (5, 'accidental'), (6, 'Cannot be found'), ) 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) image = models.FileField(upload_to=get_upload_path, null=True, blank=True) def __str__(self): return self.common_name 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, 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) point = models.PointField() location = models.ForeignKey(Location, blank=True) date = models.DateTimeField('Date', default=timezone.now) image = models.FileField(upload_to=get_upload_path, null=True, blank=True) seen_by = models.ManyToManyField(User) class Meta: verbose_name_plural = 'Bird Sighting' @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 __str__(self): return self.bird.common_name def save(self): 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()