import datetime from django.contrib.gis.db import models from django.template.defaultfilters import slugify from django import forms from django.db.models.signals import post_save from django.dispatch import receiver from django.conf import settings from locations.models import Location from twython import Twython # http://freewisdom.org/projects/python-markdown/ import markdown def twitter_truncate(txt): try: return txt.split("|")[0] except: return txt class Note(models.Model): slug = models.SlugField(unique_for_date='date_created', blank=True) date_created = models.DateTimeField('Date', blank=True) date_last_updated = models.DateTimeField('Date', blank=True) point = models.PointField() location = models.ForeignKey(Location, null=True, blank=True) body_html = models.TextField(blank=True) body_markdown = models.CharField('Note', max_length=450) twitter_id = models.CharField('twitter_id', max_length=450) twitter_send = models.BooleanField("send to twitter?", default=False) twitter_sent = models.BooleanField(default=False, blank=True) def __str__(self): return self.slug def get_absolute_url(self): return '/notes/%s/%s' % (self.date_created.strftime("%Y/%b").lower(), self.slug) @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 save(self): self.body_html = markdown.markdown(self.body_markdown, extensions=['extra'], safe_mode=False) self.date_last_updated = datetime.datetime.now() if not self.date_created: self.date_created = datetime.datetime.now() if not self.slug: self.slug = slugify(self.body_markdown)[:20] 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(Note, self).save() @receiver(post_save, sender=Note) def post_save_events(sender, instance, **kwargs): if instance.twitter_send and not instance.twitter_sent: t = Twython(settings.TWITTER_API_KEY, settings.TWITTER_API_SECRET, settings.TWITTER_ACCESS_TOKEN, settings.TWITTER_ACCESS_SECRET) geo = t.reverse_geocode(lat=instance.latitude, lon=instance.longitude, accuracy=1500, granularity="city") geo_id = geo['result']['places'][0]['id'] status = t.update_status(status=instance.body_markdown, place_id=geo_id) instance.twitter_id = status['id'] instance.twitter_sent = True instance.save() def write_note(sender, instance, **kwargs): if created: pass