post method bound to kot’s URL; refactoring and new pick.node function; minor CSS...
[kot:kot.git] / pick.py
1 #coding=utf-8
2
3 # Kot: a quote engine for TdCT
4 # Copyright (C) 2011 Paul Bazin
5 #
6 # This file is part of Kot.
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21 import libxml2
22
23 datafile = 'data.xml'
24 maxlength = 20
25
26 class Kot(object):
27     def __init__(self, elem, ukid=None, prefix=''):
28         proplist = {'author': u'', 'id': '', 'uprate': 0, 'downrate': 0}
29         prop = elem.properties
30         while prop:
31             proplist[prop.name] = prop.content
32             prop = prop.next
33
34         self.owner = proplist['author'].decode('utf-8')
35         self.uprate = int(proplist['uprate'])
36         self.downrate = int(proplist['downrate'])
37         if ukid:
38             self.id = ukid
39         else:
40             self.id = proplist['id']
41         if prefix:
42             self.id = ':'.join((prefix, self.id))
43         self.content = u''
44         self.comments = list()
45
46         child = elem.children
47         while child:
48             if child.type == 'element' and child.name == 'kot':
49                 self.comments.append(Kot(child, prefix=self.id))
50             elif child.type == 'element' and child.name == 'content':
51                 self.content = child.content.decode('utf-8')
52             child = child.next
53
54     def rating(sf):
55         if sf.uprate or sf.downrate:
56             return float(sf.uprate - sf.downrate) / (sf.uprate +
57                     sf.downrate)
58         else:
59             return 0.0
60
61 def index():
62     ret = list()
63     root = libxml2.parseFile(datafile).children
64     child = root.children
65     while child:
66         if child.type == 'element':
67             ret.append(Kot(child))
68         child = child.next
69     return ret
70
71 def _find_kid(child, kid):
72     while child:
73         if child.type == 'element' and child.name == 'kot':
74             prop = child.properties
75             while prop:
76                 if prop.name == 'id' and int(prop.content) == kid:
77                     return child
78                 prop = prop.next
79         child = child.next
80     return None
81
82 def node(ukid):
83     child = libxml2.parseFile(datafile).children
84     for kid in [int(kid) for kid in ukid.split(':')]:
85         child = child.children
86         child = _find_kid(child, kid)
87         if not child:
88             return None
89     return child
90
91 def by_id(ukid):
92     child = node(ukid)
93     if not child:
94         return None
95     return Kot(child, ukid=ukid)
96
97 def by_key(key, keeper=None):
98     kots = filter(keeper, index())
99     kots.sort(key=key, reverse=True)
100     kots = kots if len(kots) <= maxlength else kots[:maxlength]
101     return kots
102