article.py 2.52 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

cynddl's avatar
cynddl committed
8

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

15 16 17 18 19 20 21 22 23 24
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
25

luxcem's avatar
luxcem committed
26
class Article(VoteMixin):
27
    url = models.URLField("URL", help_text=URL_HELP_TEXT)
cynddl's avatar
cynddl committed
28
    lang = models.CharField(_("Language"), max_length=50, null=True)
29 30 31 32 33 34 35
    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
36
    website = models.CharField(_("Website"), max_length=255, default="")
37 38 39
    extracts = models.TextField(
        _("Content extracts"), blank=True, null=True,
        help_text=EXTRACTS_HELP_TEXT)
cynddl's avatar
cynddl committed
40 41 42

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

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

luxcem's avatar
luxcem committed
51
    tags = TaggableManager()
52

53 54 55
    class Meta:
        verbose_name = _("Article")
        verbose_name_plural = _("Articles")
luxcem's avatar
luxcem committed
56 57 58 59 60
        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
61 62 63

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

    def parse(self):
luxcem's avatar
luxcem committed
66
        article = ArticleParser(url=self.url, language=self.lang)
dave's avatar
dave committed
67 68 69 70 71 72
        article.download()
        article.parse()
        self.title = article.title
        self.extracts = article.text
        # self.screenshot = getScreenshot(self.url)
        # TODO: save metadata