article.py 2.7 KB
Newer Older
cynddl's avatar
cynddl committed
1
from django.db import models
cynddl's avatar
cynddl committed
2
from django.utils.translation import ugettext_lazy as _
luxcem's avatar
luxcem committed
3

cynddl's avatar
cynddl committed
4
from taggit.managers import TaggableManager
luxcem's avatar
luxcem committed
5
from newspaper import Article as ArticleParser
luxcem's avatar
luxcem committed
6
from django_und.models import VoteMixin
luxcem's avatar
luxcem committed
7

8 9
from datetime import datetime

cynddl's avatar
cynddl committed
10

luxcem's avatar
luxcem committed
11 12 13 14 15 16
STATUS_CHOICES = (
    ("PENDING", _("Pending")),
    ("PUBLISHED", _("Published")),
    ("REJECTED", _("Rejected"))
)

17 18 19 20 21 22 23 24 25 26
URL_HELP_TEXT = """The URL should not contain any marketing tags. We
automatically strip the most known tags."""

TITLE_HELP_TEXT = """Please remove non-necessary parts such as newspapers'
names and leave only the article title."""

EXTRACTS_HELP_TEXT = """Please select short and helpful extracts from the
article content. You should aim at around 500 characters. Use bracket ellipsis
[…] to cut parts not required to understand the context."""

luxcem's avatar
luxcem committed
27

luxcem's avatar
luxcem committed
28
class Article(VoteMixin):
29
    url = models.URLField("URL", help_text=URL_HELP_TEXT)
cynddl's avatar
cynddl committed
30
    lang = models.CharField(_("Language"), max_length=50, null=True)
31 32 33 34 35 36 37
    metadata = models.TextField(
        _("Opengraph metadata"), blank=True, null=True)
    screenshot = models.ImageField(
        _("Article screenshot"), blank=True, null=True)
    title = models.CharField(
        _("Article title"), max_length=255, default="",
        help_text=TITLE_HELP_TEXT)
cynddl's avatar
cynddl committed
38
    website = models.CharField(_("Website"), max_length=255, default="")
39 40 41
    extracts = models.TextField(
        _("Content extracts"), blank=True, null=True,
        help_text=EXTRACTS_HELP_TEXT)
cynddl's avatar
cynddl committed
42 43 44

    created_at = models.DateTimeField(_("Creation date"), auto_now_add=True)
    updated_at = models.DateTimeField(_("Last update"), auto_now=True)
45 46
    published_at = models.DateTimeField(
        _("Publication date"), blank=True, null=True)
cynddl's avatar
cynddl committed
47
    status = models.CharField(
48
        _("Status"), choices=STATUS_CHOICES, default="PENDING", max_length=20)
cynddl's avatar
cynddl committed
49

luxcem's avatar
luxcem committed
50 51
    #: priority: True if article have priority
    priority = models.BooleanField(default=False)
52

luxcem's avatar
luxcem committed
53
    tags = TaggableManager()
54

55 56 57
    class Meta:
        verbose_name = _("Article")
        verbose_name_plural = _("Articles")
luxcem's avatar
luxcem committed
58 59 60 61 62
        permissions = (
            ("can_change_status", "Can change article status"),
            ("can_change_priority", "Can change article priority"),
            ("can_vote", "Can vote articles"),
        )
luxcem's avatar
luxcem committed
63 64 65

    def __str__(self):
        return self.title
dave's avatar
dave committed
66

67 68 69 70 71 72 73
    def publish(self):
        if not self.published_at:
            self.published_at = datetime.now()

        self.status = "PUBLISHED"
        self.save()

dave's avatar
dave committed
74
    def parse(self):
luxcem's avatar
luxcem committed
75
        article = ArticleParser(url=self.url, language=self.lang)
dave's avatar
dave committed
76 77 78 79 80 81
        article.download()
        article.parse()
        self.title = article.title
        self.extracts = article.text
        # self.screenshot = getScreenshot(self.url)
        # TODO: save metadata