X-Git-Url: https://git.mdrn.pl/turniej.git/blobdiff_plain/479cb324a4cbc258f3f6de8de1025e7dccb1da2d..80b74642b6a6a375462d6eae7efb203981a412d6:/src/poetry/models.py diff --git a/src/poetry/models.py b/src/poetry/models.py new file mode 100644 index 0000000..58b8caf --- /dev/null +++ b/src/poetry/models.py @@ -0,0 +1,85 @@ +import os +import subprocess +from django.db import models +from django.urls import reverse +from django.conf import settings +from poetry.utils import get_hash + + +class Poet(models.Model): + name = models.CharField(max_length=50) + path = models.CharField(max_length=255) + slug = models.SlugField(max_length=50, unique=True, db_index=True) + author = models.CharField(max_length=128, blank=True) + url = models.CharField(max_length=255, blank=True) + description = models.TextField(blank=True) + first_line_title = models.BooleanField(default=False) + skip_first_lines = models.IntegerField(default=0) + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('poetry_poet', kwargs={'slug': self.slug}) + + def write(self): + curdir = os.getcwd() + os.chdir(os.path.dirname(self.path)) + proc = subprocess.Popen(self.path, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + os.chdir(curdir) + stdout, stderr = proc.communicate() + text = str(stdout, "utf-8", errors="ignore")[:1000] + slug = get_hash(text) + title = '' + if self.first_line_title: + title, text = text.split('\n', 1) + if self.skip_first_lines: + text = text.split('\n', self.skip_first_lines)[-1] + text = text.strip('\n') + poem = self.poem_set.create( + slug=slug, + text=text, + title=title + ) + return poem + + def make_for_contest(self): + assert not self.poem_set.filter(for_contest=True).exists() + for i in range(settings.POETRY_POEMS_FOR_CONTEST): + p = self.write() + p.for_contest = True + p.save() + return self.poem_set.filter(for_contest=True) + + def contest_poems(self): + return self.poem_set.filter(in_contest=True) + + +class Poem(models.Model): + slug = models.SlugField(max_length=50, db_index=True) + title = models.CharField(max_length=255, null=True, blank=True) + text = models.TextField() + poet = models.ForeignKey(Poet, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True, editable=False, db_index=True) + seen_at = models.DateTimeField(auto_now_add=True, editable=False) + view_count = models.IntegerField(default=1) + + for_contest = models.BooleanField(default=False) + in_contest = models.BooleanField(default=False) + + def __str__(self): + oneliner = "%s, %s" % (self.poet.name, self.pretty_title()) + oneliner += " [%s…]" % (" ".join(self.text.split()[:5])) + return oneliner + + def get_absolute_url(self): + return reverse('poetry_poem', kwargs={'slug': self.slug}) + + def pretty_title(self): + return self.title or "***" + + def visit(self): + self.view_count += 1 + self.seen_at = datetime.now() + self.save()