X-Git-Url: https://git.mdrn.pl/django-migdal.git/blobdiff_plain/734cd58d3f12c5397b42c1ae122c947500386014..59793b23fc45b9ea5e483702e7794b66f014c4dc:/migdal/models.py diff --git a/migdal/models.py b/migdal/models.py index 54091e4..d0b16c0 100644 --- a/migdal/models.py +++ b/migdal/models.py @@ -2,34 +2,35 @@ # This file is part of PrawoKultury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # +import re from datetime import datetime from django.conf import settings from django.contrib.sites.models import Site from django.core.exceptions import ValidationError -from django.core.mail import send_mail +from django.core.mail import mail_managers, send_mail from django.db import models from django.template import loader, Context -from django.utils.translation import get_language, ugettext_lazy as _, ugettext +from django.utils.translation import ugettext_lazy as _, ugettext from django_comments_xtd.models import XtdComment from markupfield.fields import MarkupField +from fnpdjango.utils.models.translation import add_translatable, tQ from migdal import app_settings -from fnpdjango.utils.models.translation import add_translatable from migdal.fields import SlugNullField + class Category(models.Model): - taxonomy = models.CharField(_('taxonomy'), max_length=32, - choices=app_settings.TAXONOMIES) + taxonomy = models.CharField(_('taxonomy'), max_length=32, choices=app_settings.TAXONOMIES) class Meta: verbose_name = _('category') verbose_name_plural = _('categories') def __unicode__(self): - return self.title + return self.title or u"" @models.permalink def get_absolute_url(self): - return ('migdal_category', [self.slug]) + return 'migdal_category', [self.slug] add_translatable(Category, { @@ -38,18 +39,33 @@ add_translatable(Category, { }) +class PublishedEntryManager(models.Manager): + def get_query_set(self): + return super(PublishedEntryManager, self).get_query_set().filter( + tQ(published=True) + ) + + class Entry(models.Model): - type = models.CharField(max_length=16, - choices=((t.db, t.slug) for t in app_settings.TYPES), - db_index=True) + type = models.CharField( + max_length=16, + choices=((t.db, t.slug) for t in app_settings.TYPES), + db_index=True) date = models.DateTimeField(_('created at'), auto_now_add=True, db_index=True) changed_at = models.DateTimeField(_('changed at'), auto_now=True, db_index=True) author = models.CharField(_('author'), max_length=128) - author_email = models.EmailField(_('author email'), max_length=128, null=True, blank=True, - help_text=_('Used only to display gravatar and send notifications.')) + author_email = models.EmailField( + _('author email'), max_length=128, null=True, blank=True, + help_text=_('Used only to display gravatar and send notifications.')) image = models.ImageField(_('image'), upload_to='entry/image/', null=True, blank=True) promo = models.BooleanField(_('promoted'), default=False) - categories = models.ManyToManyField(Category, null=True, blank=True, verbose_name=_('categories')) + in_stream = models.BooleanField(_('in stream'), default=True) + categories = models.ManyToManyField(Category, blank=True, verbose_name=_('categories')) + first_published_at = models.DateTimeField(_('published at'), null=True, blank=True) + canonical_url = models.URLField(_('canonical link'), null=True, blank=True) + + objects = models.Manager() + published_objects = PublishedEntryManager() class Meta: verbose_name = _('entry') @@ -60,17 +76,18 @@ class Entry(models.Model): return self.title def save(self, *args, **kwargs): - if self.pk is not None: - orig = type(self).objects.get(pk=self.pk) - published_now = False - for lc, ln in settings.LANGUAGES: - if (getattr(self, "published_%s" % lc) - and getattr(self, "published_at_%s" % lc) is None): - setattr(self, "published_at_%s" % lc, datetime.now()) + published_now = False + for lc, ln in settings.LANGUAGES: + if (getattr(self, "published_%s" % lc) + and getattr(self, "published_at_%s" % lc) is None): + now = datetime.now() + setattr(self, "published_at_%s" % lc, now) + if self.first_published_at is None: + self.first_published_at = now published_now = True - if published_now: - self.notify_author_published() super(Entry, self).save(*args, **kwargs) + if published_now and self.pk is not None: + self.notify_author_published() def clean(self): for lc, ln in settings.LANGUAGES: @@ -81,7 +98,7 @@ class Entry(models.Model): @models.permalink def get_absolute_url(self): - return ('migdal_entry_%s' % self.type, [self.slug]) + return 'migdal_entry_%s' % self.type, [self.slug] def get_type(self): return dict(app_settings.TYPES_DICT)[self.type] @@ -100,6 +117,12 @@ class Entry(models.Model): mail_text, settings.SERVER_EMAIL, [self.author_email] ) + def inline_html(self): + for att in self.attachment_set.all(): + if att.file.name.endswith(".html"): + with open(att.file.path) as f: + yield f.read() + add_translatable(Entry, languages=app_settings.OPTIONAL_LANGUAGES, fields={ 'needed': models.CharField(_('needed'), max_length=1, db_index=True, choices=( @@ -110,10 +133,12 @@ add_translatable(Entry, languages=app_settings.OPTIONAL_LANGUAGES, fields={ add_translatable(Entry, { 'slug': SlugNullField(unique=True, db_index=True, null=True, blank=True), 'title': models.CharField(_('title'), max_length=255, null=True, blank=True), - 'lead': MarkupField(_('lead'), markup_type='textile_pl', null=True, blank=True, - help_text=_('Use Textile syntax.')), - 'body': MarkupField(_('body'), markup_type='textile_pl', null=True, blank=True, - help_text=_('Use Textile syntax.')), + 'lead': MarkupField( + _('lead'), markup_type='textile_pl', null=True, blank=True, + help_text=_('Use Textile syntax.')), + 'body': MarkupField( + _('body'), markup_type='textile_pl', null=True, blank=True, + help_text=_('Use Textile syntax.')), 'published': models.BooleanField(_('published'), default=False), 'published_at': models.DateTimeField(_('published at'), null=True, blank=True), }) @@ -127,10 +152,8 @@ class Attachment(models.Model): return self.file.url if self.file else '' - def notify_new_comment(sender, instance, created, **kwargs): - if (created and isinstance(instance.content_object, Entry) and - instance.content_object.author_email): + if created and isinstance(instance.content_object, Entry) and instance.content_object.author_email: site = Site.objects.get_current() mail_text = loader.get_template('migdal/mail/new_comment.txt').render( Context({ @@ -142,4 +165,21 @@ def notify_new_comment(sender, instance, created, **kwargs): mail_text, settings.SERVER_EMAIL, [instance.content_object.author_email] ) -models.signals.post_save.connect(notify_new_comment, sender=XtdComment) \ No newline at end of file +models.signals.post_save.connect(notify_new_comment, sender=XtdComment) + + +def spamfilter(sender, comment, **kwargs): + """Very simple spam filter. Just don't let any HTML links go through.""" + if re.search(r"