244538a48dd12b8056dbf206678b625cf6402809
[turniej.git] / apps / poetry / models.py
1 # -*- coding: utf-8 -*-
2 import os
3 import subprocess
4 from django.db import models
5 from django.core.urlresolvers import reverse
6 from poetry.utils import get_hash
7
8
9 class Poet(models.Model):
10     name = models.CharField(max_length=50)
11     path = models.CharField(max_length=255)
12     slug = models.SlugField(max_length=50, unique=True, db_index=True)
13     author = models.CharField(max_length=128, blank=True)
14     url = models.CharField(max_length=255, blank=True)
15     description = models.TextField(blank=True)
16     first_line_title = models.BooleanField(default=False)
17     skip_first_lines = models.IntegerField(default=0)
18
19     def __unicode__(self):
20         return self.name
21
22     def get_absolute_url(self):
23         return reverse('poetry_poet', kwargs={'slug': self.slug})
24
25     def write(self):
26         curdir = os.getcwd()
27         os.chdir(os.path.dirname(self.path))
28         proc = subprocess.Popen(self.path,
29             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
30         os.chdir(curdir)
31         stdout, stderr = proc.communicate()
32         text = stdout.decode("utf-8")[:1000]
33         slug = get_hash(text)
34         title = ''
35         if self.first_line_title:
36             title, text = text.split('\n', 1)
37         if self.skip_first_lines:
38             text = text.split('\n', self.skip_first_lines)[-1]
39         text = text.strip('\n')
40         poem = self.poem_set.create(
41             slug=slug,
42             text=text,
43             title=title
44             )
45         return poem
46
47
48 class Poem(models.Model):
49     slug = models.SlugField(max_length=50, db_index=True)
50     title = models.CharField(max_length=255, null=True, blank=True)
51     text = models.TextField()
52     poet = models.ForeignKey(Poet)
53     created_at = models.DateTimeField(auto_now_add=True, editable=False, db_index=True)
54     seen_at = models.DateTimeField(auto_now_add=True, editable=False)
55     view_count = models.IntegerField(default=1)
56
57     for_contest = models.BooleanField(default=False)
58     in_contest = models.BooleanField(default=False)
59
60     def __unicode__(self):
61         oneliner = u"%s, %s" % (self.poet.name, self.pretty_title())
62         if not self.title:
63             oneliner += u" [%s…]" % self.text[:20]
64         return oneliner
65
66     def get_absolute_url(self):
67         return reverse('poetry_poem', kwargs={'slug': self.slug})
68
69     def pretty_title(self):
70         return self.title or "***"
71
72     def visit(self):
73         self.view_count += 1
74         self.seen_at = datetime.now()
75         self.save()