pulseapi/entries/models.py (133 lines of code) (raw):
"""Main entry data"""
import os
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.utils.html import format_html
from pulseapi.tags.models import Tag
from pulseapi.issues.models import Issue
from pulseapi.helptypes.models import HelpType
from pulseapi.users.models import EmailUser
def entry_thumbnail_path(instance, filename):
return 'images/entries/{timestamp}{ext}'.format(
timestamp=str(timezone.now()),
ext=os.path.splitext(filename)[1]
)
# Create your models here.
class ModerationState(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return str(self.name)
def get_default_moderation_state():
"""
Helper function to ensure there is a default
ModerationState that can be tacked onto Entries.
"""
states = ModerationState.objects.all()
if len(states) == 0:
return -1
default_state = states[0].id
return default_state
class EntryQuerySet(models.query.QuerySet):
"""
A queryset for entries which returns all entries
"""
def public(self):
"""
Return all entries that have been approved
"""
return self.filter(moderation_state__name='Approved')
def with_related(self):
"""
Return all entries with their related data as separate queries
"""
return self.prefetch_related(
'tags',
'issues',
'help_types',
'published_by',
'bookmarked_by',
'bookmarked_by__profile__related_user',
'published_by__profile',
'moderation_state',
'related_entry_creators__profile__related_user',
)
def by_active_profile(self):
"""
Return all entries that have been created by pulse users who's profiles are set to "Active" by moderator.
"""
return self.filter(published_by__profile__is_active=True)
class Entry(models.Model):
"""
A pulse entry
"""
ENTRY_TYPES = (
('base', 'base'),
('project', 'project'),
('news', 'news'),
('curriculum', 'curriculum'),
('research', 'research'),
('session', 'session'),
)
# required fields
entry_type = models.CharField(
max_length=20,
choices=ENTRY_TYPES,
default=ENTRY_TYPES[0][0],
)
title = models.CharField(max_length=140)
content_url = models.URLField(
blank=True,
)
# optional fields
description = models.CharField(max_length=600, blank=True)
get_involved = models.CharField(max_length=300, blank=True)
get_involved_url = models.URLField(blank=True)
interest = models.CharField(max_length=600, blank=True)
featured = models.BooleanField(default=False)
internal_notes = models.TextField(blank=True)
published_by_creator = models.BooleanField(default=False)
# thumbnail image
thumbnail = models.ImageField(
max_length=2048,
upload_to=entry_thumbnail_path,
blank=True
)
def thumbnail_image_tag(self):
if not self.thumbnail:
return format_html('<span>No image to preview</span>')
media_url = settings.MEDIA_URL
if settings.USE_S3:
media_url = 'https://{domain}/{bucket}/'.format(
domain=settings.AWS_S3_CUSTOM_DOMAIN,
bucket=settings.AWS_LOCATION
)
html = '<img src="{media_url}{src}" style="width:25%">'.format(
media_url=media_url,
src=self.thumbnail
)
return format_html(html)
thumbnail_image_tag.short_description = 'Thumbnail preview'
# crosslink fields
tags = models.ManyToManyField(
Tag,
related_name='entries',
blank=True
)
issues = models.ManyToManyField(
Issue,
related_name='entries',
blank=True
)
help_types = models.ManyToManyField(
HelpType,
related_name='entries',
blank=True
)
# automatically managed fields
published_by = models.ForeignKey(
EmailUser,
related_name='entries',
on_delete=models.CASCADE
)
created = models.DateTimeField(
default=timezone.now
)
# moderation information
moderation_state = models.ForeignKey(
ModerationState,
related_name='entries',
default=get_default_moderation_state,
on_delete=models.PROTECT
)
def set_moderation_state(self, state_name):
(moderation_state, created) = ModerationState.objects.get_or_create(
name=state_name
)
self.moderation_state = moderation_state
def is_approved(self):
return self.moderation_state.name == 'Approved'
objects = EntryQuerySet.as_manager()
def frontend_entry_url(self):
return '{frontend_url}/entry/{pk}'.format(frontend_url=settings.PULSE_FRONTEND_HOSTNAME, pk=self.id)
class Meta:
"""
Make plural not be wrong
"""
verbose_name_plural = "entries"
ordering = ['-id']
permissions = (
('change_creators', 'Can change the creators for entries'),
)
def __str__(self):
return str(self.title)