diff options
Diffstat (limited to 'app/gtd/models.py')
-rw-r--r-- | app/gtd/models.py | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/app/gtd/models.py b/app/gtd/models.py new file mode 100644 index 0000000..e021b42 --- /dev/null +++ b/app/gtd/models.py @@ -0,0 +1,232 @@ +import datetime +import os + +from django.utils import timezone +from django.contrib.gis.db import models +from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +from django.urls import reverse +from django.apps import apps +from django.conf import settings +from django.contrib.sitemaps import Sitemap + +from utils.util import render_images, render_products, parse_video, markdown_to_html, extract_main_image + + +def get_upload_path(self, filename): + return "images/post-images/%s/%s" % (datetime.datetime.today().strftime("%Y"), filename) + + +class GTDOutcome(models.Model): + title = models.CharField(max_length=300) + body_markdown = models.TextField() + body_html = models.TextField(blank=True) + date_goal = models.DateField() + date_ended = models.DateField() + + def __str__(self): + return self.title + + class Meta: + ordering = ('-date_goal',) + + def get_absolute_url(self): + return reverse('gtd:outcome', kwargs={"slug": self.slug}) + + def save(self, *args, **kwargs): + created = self.pk is None + if not created: + md = render_images(self.body_markdown) + self.body_html = markdown_to_html(md) + super(Outcome, self).save(*args, **kwargs) + + +class ProjectType(models.IntegerChoices): + WIRED = 0, ('Wired') + LBH = 1, ('LBH') + PERSONAL = 2, ('Personal') + + +class GTDProject(models.Model): + title = models.CharField(max_length=200) + short_title = models.CharField(max_length=200, blank=True, null=True) + body_markdown = models.TextField(null=True, blank=True) + body_html = models.TextField(blank=True) + date_goal = models.DateField(blank=True, null=True) + date_ended = models.DateField(blank=True, null=True) + project_type = models.IntegerField(choices=ProjectType.choices, default=ProjectType.WIRED) + outcome = models.ForeignKey(GTDOutcome, on_delete=models.SET_NULL, null=True, blank=True) + + class Meta: + ordering = ('-date_goal',) + get_latest_by = 'date_goal' + + def __str__(self): + return self.title + + def get_absolute_url(self): + return reverse('gtd:project-detail', kwargs={"pk": self.id}) + + @property + def get_previous_admin_url(self): + n = self.get_previous_by_date_goal() + return reverse('admin:%s_%s_change' %(self._meta.app_label, self._meta.model_name), args=[n.id] ) + + @property + def get_next_admin_url(self): + model = apps.get_model(app_label=self._meta.app_label, model_name=self._meta.model_name) + try: + return reverse('admin:%s_%s_change' %(self._meta.app_label, self._meta.model_name), args=[self.get_next_by_date_goal().pk] ) + except model.DoesNotExist: + return '' + + def save(self, *args, **kwargs): + created = self.pk is None + if not created: + md = render_images(self.body_markdown) + self.body_html = markdown_to_html(md) + super(GTDProject, self).save(*args, **kwargs) + + +class NoteType(models.IntegerChoices): + ACTION = 0, ('action') + REMINDER = 1, ('reminder') + REFERENCE = 2, ('reference') + + +class GTDNote(models.Model): + title = models.CharField(max_length=200) + body_markdown = models.TextField() + body_html = models.TextField(blank=True) + date_completed = models.DateField(null=True, blank=True) + date_created = models.DateTimeField(auto_now=True) + note_type = models.IntegerField(choices=NoteType.choices, default=NoteType.ACTION) + reminder = models.BigIntegerField(help_text="In days", null=True, blank=True) + project = models.ForeignKey(GTDProject, on_delete=models.SET_NULL, null=True, blank=True) + STATUS = ( + (0, 'None'), + (1, 'Open'), + (2, 'Completed'), + ) + status = models.IntegerField(choices=STATUS, default=0) + + class Meta: + ordering = ('-date_created',) + get_latest_by = 'date_created' + + def __str__(self): + return self.title + + def get_absolute_url(self, *args, **kwargs): + return reverse('gtd:note-edit', kwargs={"pk": self.pk}) + + def save(self, *args, **kwargs): + self.body_html = markdown_to_html(self.body_markdown) + super(GTDNote, self).save(*args, **kwargs) + + +class PostType(models.IntegerChoices): + REVIEW = 0, ('review') + GUIDE = 1, ('guide') + HOWTO = 2, ('how-to') + + +class TemplateType(models.IntegerChoices): + STORY = 0, ('story') + GALLERY = 1, ('gallery') + + +class PostStatus(models.IntegerChoices): + ASSIGNED = 0, ('Assigned') + TURNEDIN = 1, ('turned in') + PUBLISHED = 2, ('published') + + +class WiredPost(models.Model): + # an entry in a feed + title = models.CharField(max_length=512, blank=True, null=True) + body = models.TextField(blank=True, null=True) + url = models.CharField(max_length=512, blank=True, null=True) + edit_url = models.CharField(max_length=512, blank=True, null=True) + date_last_pub = models.DateField(default=timezone.now()) + guid = models.CharField(max_length=512, blank=True, null=True, db_index=True) + author = models.CharField(max_length=255, blank=True, null=True) + post_type = models.IntegerField(choices=PostType.choices, default=PostType.GUIDE) + template_type = models.IntegerField(choices=TemplateType.choices, default=TemplateType.STORY) + update_frequency = models.BigIntegerField(help_text="In days") + #products = models.ManyToManyField(ProductLink, blank=True, null=True) + needs_update = models.BooleanField(default=False) + is_live = models.BooleanField(default=True) + post_status = models.IntegerField(choices=PostStatus.choices, default=PostStatus.PUBLISHED) + + + class Meta: + ordering = ('date_last_pub',) + + def __str__(self): + return self.title + + def time_since_update(self): + td = timezone.localdate() - self.date_last_pub + return int(td.days) + + #def get_needs_update(self): + # if self.time_since_update() > self.update_frequency: + # return True + # else: + # return False + + def days_overdue(self): + if self.needs_update == True: + return self.time_since_update() - self.update_frequency + else: + return 0 + + def admin_url(self): + return format_html('<a target="_blank" href="%s">%s</a>' % (self.url, self.url)) + admin_link.short_description = 'Link' + + def save(self, *args, **kwargs): + td = timezone.localdate() - self.date_last_pub + if td.days > self.update_frequency and self.post_status != 1: + self.needs_update = True + else: + self.needs_update = False + super(WiredPost, self).save() + + +class WiredNote(models.Model): + title = models.CharField(max_length=400) + url = models.CharField(max_length=400, blank=True, null=True) + body_markdown = models.TextField(blank=True, null=True) + date_created = models.DateTimeField(default=timezone.now) + post = models.ForeignKey(WiredPost, on_delete=models.CASCADE, null=True, blank=True) + STATUS = ( + (0, 'Call In'), + (1, 'Asked For'), + (2, 'Coming'), + (3, 'Testing'), + (4, 'Done'), + (5, 'Live'), + ) + status = models.IntegerField(choices=STATUS, default=0) + PLAN = ( + (0, 'For Guide'), + (1, 'Review'), + (2, 'Rave/Rant'), + (3, 'No Plan'), + ) + plan = models.IntegerField(choices=PLAN, default=0) + + class Meta: + ordering = ('date_created', 'status') + + def __str__(self): + return self.title + + def get_absolute_url(self): + return reverse('gtd:wirednote-edit', kwargs={"pk": self.pk}) + + def save(self, *args, **kwargs): + super(WiredNote, self).save() |