import datetime from django.contrib.gis.db import models from django.conf import settings from django.contrib.sitemaps import Sitemap from django.contrib.syndication.views import Feed from PIL import Image import markdown from taggit.managers import TaggableManager from locations.models import Location from blog.models import Entry from photos.models import PhotoGallery def get_upload_path(self, filename): return "images/guide-images/%s/%s" % (datetime.datetime.today().strftime("%Y"), filename) def get_tn_path(self, filename): return "images/guide-thumbnail/%s/%s" % (datetime.datetime.today().strftime("%Y"), filename) def image_url_replace(str): str = str.replace('[[base_url]]', settings.IMAGES_URL) return str def markdown_processor(md): return markdown.markdown(md, ['footnotes'], safe_mode=False) class Guide(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(unique_for_date='pub_date') entry = models.ForeignKey(Entry, null=True, blank=True) body_html = models.TextField(blank=True) body_markdown = models.TextField() dek = models.TextField(null=True, blank=True) pub_date = models.DateTimeField('Date published') location = models.ForeignKey(Location, null=True, blank=True) PUB_STATUS = ( (0, 'Draft'), (1, 'Published'), ) status = models.IntegerField(choices=PUB_STATUS, default=0) photo_gallery = models.ForeignKey(PhotoGallery, blank=True, null=True, verbose_name='photo set') meta_description = models.CharField(max_length=256, null=True, blank=True) TEMPLATES = ( (0, 'single'), (1, 'double'), (2, 'single-dark'), (3, 'double-dark'), ) template_name = models.IntegerField(choices=TEMPLATES, default=0) tags = TaggableManager(blank=True) image = models.FileField(upload_to=get_upload_path, null=True, blank=True) thumbnail = models.FileField(upload_to=get_tn_path, null=True, blank=True) @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 class Meta: ordering = ('-pub_date',) get_latest_by = 'pub_date' verbose_name_plural = 'entries' def __unicode__(self): return self.title def get_absolute_url(self): if self.location: return "/travel-guide/location/%s/%s/" % (self.location.slug, self.slug) else: return "/travel-guide/%s/" % (self.slug) def get_thumbnail_url(self): image_dir, img = self.thumbnail.url.split('guide-thumbnail/')[1].split('/') return '%sguide-thumbnail/%s/%s' % (settings.IMAGES_URL, image_dir, img) def get_image_url(self): image_dir, img = self.image.url.split('guide-images/')[1].split('/') return '%sguide-images/%s/%s' % (settings.IMAGES_URL, image_dir, img) def save(self): #get image dimensions if self.image: img = Image.open(self.image) self.image_width, self.image_height = img.size #same for thumb img = Image.open(self.thumbnail) self.thumb_width, self.thumb_height = img.size md = image_url_replace(self.body_markdown) #run markdown self.body_html = markdown_processor(md) self.dek = markdown.markdown(self.dek, safe_mode=False) super(Guide, self).save() class GuideSitemap(Sitemap): changefreq = "never" priority = 1.0 def items(self): return Entry.objects.filter(status=1) def lastmod(self, obj): return obj.pub_date class GuideFull(Feed): title = "Luxagraf: Topographical Writings" link = "/writing/" description = "Latest postings to luxagraf.net" description_template = 'feeds/blog_description.html' def items(self): return Entry.objects.filter(status__exact=1).order_by('-pub_date')[:10] #from django.dispatch import dispatcher #from django.db.models import signals #signals.post_save.connect(update_recent, sender=Entry)