source: adhocracy/model/text.py @ 843:88ea4b0d06a7

Revision 843:88ea4b0d06a7, 4.5 KB checked in by fl, 3 years ago (diff)

[svn r1189] finish most of the diffing madness.

Line 
1from datetime import datetime
2import logging
3
4from sqlalchemy import Table, Column, Integer, Unicode, UnicodeText, ForeignKey, DateTime, func, or_
5from sqlalchemy.orm import relation, backref
6
7import meta
8import instance_filter as ifilter
9
10log = logging.getLogger(__name__)
11
12
13text_table = Table('text', meta.data,                     
14    Column('id', Integer, primary_key=True),
15    Column('page_id', Integer, ForeignKey('page.id'), nullable=False),
16    Column('user_id', Integer, ForeignKey('user.id'), nullable=False),
17    Column('parent_id', Integer, ForeignKey('text.id'), nullable=True),
18    Column('variant', Unicode(255), nullable=True),
19    Column('title', Unicode(255), nullable=True),
20    Column('text', UnicodeText(), nullable=True),
21    Column('create_time', DateTime, default=datetime.utcnow),
22    Column('delete_time', DateTime)
23    )
24
25
26class Text(object):
27   
28    HEAD = u'HEAD'
29    LINE_LENGTH = 60
30   
31    def __init__(self, page, variant, user, title, text):
32        self.page = page
33        self.variant = variant
34        self.user = user
35        self.title = title
36        self.text = text
37   
38   
39    @classmethod
40    def find(cls, id, instance_filter=True, include_deleted=False):
41        try:
42            q = meta.Session.query(Text)
43            q = q.filter(Text.id==id)
44            if not include_deleted:
45                q = q.filter(or_(Text.delete_time==None,
46                                 Text.delete_time>datetime.utcnow()))
47            return q.first()
48        except Exception, e:
49            log.warn("find(%s): %s" % (id, e))
50            return None
51
52
53    @classmethod
54    def create(cls, page, variant, user, title, text, parent=None):
55        from adhocracy.lib.text import title2alias
56        if variant is None:
57            if parent is not None:
58                variant = parent.variant
59            else:
60                variant = Text.HEAD
61       
62        variant_is_new = False
63        if not variant in page.variants:
64            variant_is_new = True
65        _text = Text(page, variant, user, title, text)
66        if parent:
67            _text.parent = parent
68        meta.Session.add(_text)
69        meta.Session.flush()
70        if variant_is_new:
71            page.establish_variant(variant, user)
72        return _text
73   
74   
75    @property
76    def history(self):
77        # TODO: Performance fail.
78        if self.parent:
79            return [self] + self.parent.history
80        return [self]
81   
82   
83    @property
84    def variant_title(self):
85        from pylons.i18n import _
86        if self.variant == self.HEAD:
87            return _("[status quo]")
88        return self.variant
89   
90   
91    def delete(self, delete_time=None):
92        if delete_time is None:
93            delete_time = datetime.utcnow()
94        if self.delete_time is None:
95            self.delete_time = delete_time
96   
97   
98    def is_deleted(self, at_time=None):
99        if at_time is None:
100            at_time = datetime.utcnow()
101        return (self.delete_time is not None) and \
102               self.delete_time<=at_time
103   
104   
105    def render(self):
106        from adhocracy.lib import text
107        if self.page.function == self.page.NORM:
108            return text.render_line_based(self)
109        return text.render(self.text)
110   
111    @property
112    def lines(self):
113        from webhelpers.text import truncate
114        if self.text is None:
115            return
116        for line in self.text.strip().split("\n"):
117            while len(line) > self.LINE_LENGTH:
118                part = truncate(line, length=self.LINE_LENGTH, indicator='', whole_word=True)
119                line = line[len(part):]
120                line = line.lstrip()
121                yield part
122            yield line
123   
124    @property
125    def has_text(self):
126        return self.text is not None and len(self.text.strip()) > 0
127   
128   
129    @property
130    def is_head(self):
131        return self.variant == self.HEAD
132   
133   
134    def _index_id(self):
135        return self.id
136   
137   
138    def to_dict(self):
139        from adhocracy.lib import helpers as h
140        d =    dict(id=self.id,
141                    page_id=self.page.id,
142                    url=h.entity_url(self),
143                    create_time=self.create_time,
144                    text=self.text,
145                    variant=self.variant,
146                    title=self.title,
147                    user=self.user.user_name)
148        if self.parent:
149            d['parent'] = self.parent.id
150        return d
151   
152   
153    def __repr__(self):
154        return u"<Text(%s, %s, %s)>" % (self.id, self.variant.encode('ascii', 'replace'),
155                                        self.user.user_name)
156   
Note: See TracBrowser for help on using the repository browser.