removed main.cfg, not used anywhere
[limo.git] / model.py
blob9305962e9760824d06a24b18ae7d6d4774a9828f
1 from db import Model, Query, Row, safe
2 from limoutil import *
3 from settings import Settings
6 class LimoModel(Model):
7 def model(self):
8 self\
9 .table('pages')\
10 .column('pid int primary key')\
11 .column('url varchar(256) not null')\
12 .column('name varchar(256) not null')\
13 .column('active int(1) not null default 1')\
14 .table('blocks')\
15 .column('bid int primary key')\
16 .column('name varchar(512) not null')\
17 .column('active int(1) not null default 1')\
18 .column("module varchar(32) null")\
19 .table('page_blocks')\
20 .column('pid int not null')\
21 .column('bid int not null')\
22 .column('region varchar(32) not null')\
23 .column('weight int not null default 0')\
24 .column('active int(1) not null default 1')\
25 .column('primary key (pid, bid, region, weight)')\
26 .column('index (pid)')\
27 .column('index (bid)')\
28 .column('index (region)')\
29 .table("users")\
30 .column("uid int primary key auto_increment")\
31 .column("name varchar(64) not null")\
32 .column("login varchar(32) not null")\
33 .column("passwd varchar(40) not null")\
34 .column("email varchar(128)")\
35 .column("theme varchar(64) not null default 'default'")\
36 .column("active int(1) not null default 1")\
37 .table("groups")\
38 .column("gid int primary key auto_increment")\
39 .column("name text not null")\
40 .table("roles")\
41 .column("rid int primary key auto_increment")\
42 .column("name varchar(64) not null")\
43 .table("group_roles")\
44 .column("gid int not null")\
45 .column("rid int not null")\
46 .column("primary key (gid, rid)")\
47 .table("group_users")\
48 .column("gid int not null")\
49 .column("uid int not null")\
50 .column("primary key (gid, uid)")\
51 .table("user_roles")\
52 .column("uid int not null")\
53 .column("rid int not null")\
54 .column("primary key (uid, rid)")\
55 .table("sessions",options="ENGINE=InnoDB")\
56 .column("sid int primary key auto_increment")\
57 .column("sha varchar(40) not null")\
58 .column("uid int not null default '0'")\
59 .column("data text")\
60 .column("unique index (sha)")\
61 .column("index (sid, sha)")\
62 .table("visits",options="ENGINE=InnoDB")\
63 .column("vid int primary key auto_increment")\
64 .column("entered timestamp default current_timestamp")\
65 .column("sid int not null")\
66 .column("url varchar(512) not null", version=1)\
67 .column("remote varchar(21) not null")\
68 .column("unique index (vid, entered, sid, remote, url(32))")\
69 .table("modules")\
70 .col("mid int not null primary key auto_increment")\
71 .col("name varchar(32) not null")\
72 .col("active int(1) not null default '1'")\
73 .col("weight int not null default '1'")\
74 .col("unique index (name)")\
75 .defaultRole('admin')\
76 .defaultRole('login')\
77 .defaultRole('debug')\
78 .defaultGroup('admin')\
79 .assignRoleToGroup('admin', 'admin')\
80 .assignRoleToGroup('debug', 'admin')\
81 .defaultGroup('users')\
82 .assignRoleToGroup('login', 'users')\
83 .defaultUser('admin', 'admin', 'admin', 'admin@admin.com', 1)\
84 .assignUserToGroup('admin','admin')\
85 .assignUserToGroup('admin','users')\
86 .defaultBlock('DebugBlock')\
87 .defaultBlock('HeadBlock')\
88 .defaultBlock('HeaderBlock')\
89 .defaultBlock('AdminMenuBlock')\
90 .defaultBlock('EmptyBlock')\
91 .defaultPage('/','Home')\
92 .attachBlockToRegion('/', 'head', 'HeadBlock')\
93 .attachBlockToRegion('/', 'header', 'HeaderBlock')\
94 .attachBlockToRegion('/', 'footer', 'DebugBlock')\
95 .attachBlockToRegion('/', 'left', 'AdminMenuBlock')\
96 .defaultBlock('StaticBlock')\
97 .defaultPage('/cache', 'Static cache for dynamically generated content')\
98 .attachBlockToRegion('/cache', 'entire', 'StaticBlock')\
99 .defaultBlock('RegisterBlock')\
100 .defaultPage('/register', 'Registration')\
101 .attachBlockToRegion('/register', 'main', 'RegisterBlock')\
102 .defaultBlock('SessionBlock')\
103 .attachBlockToRegion('/', 'left', 'SessionBlock')\
104 .defaultBlock('VisitBlock')\
105 .defaultPage('/visits')\
106 .attachBlockToRegion('/visits', 'main', 'VisitBlock')\
107 .defaultBlock('ModuleBlock')\
108 .defaultPage('/modules')\
109 .attachBlockToRegion('/modules', 'main', 'ModuleBlock')\
111 return Model.model(self)
113 def defaultPage(self, url, name=""):
114 page_id = Model.int_uid(url)
115 return self.table("pages").data([page_id, url, name])
116 def deletePage(self, url):
117 pid = Model.int_uid(url)
118 return self.deletePageByID(pid)
119 def deletePageByID(self, pageid):
120 Query("delete from pages where pid = %d" % pageid)
121 return self
123 def defaultBlock(self, name, active=1):
124 block_id = Model.int_uid(name)
125 return self.table("blocks").data([block_id, name, active])
126 def disableBlock(self, name):
127 Query("update blocks set active = 0 where name = '%s'" % (safe(name)))
128 return self
129 def enableBlock(self, name):
130 Query("update blocks set active = 1 where name = '%s'" % (safe(name)))
131 return self
133 def enableModule(self, name):
134 Query("update modules set active = 1 where name = '%s'" % (safe(name)))
135 return self
136 def disableModule(self, name):
137 Query("update modules set active = 0 where name = '%s'" % (safe(name)))
138 return self
140 def attachBlockToRegion(self, url, region, block_name, weight=0):
141 page_id = Model.int_uid(url)
142 block_id = Model.int_uid(block_name)
143 return self.attachBlockToRegionByID(page_id, region, block_id, weight)
144 def attachBlockToRegionByID(self, page_id, region, block_id, weight=0):
145 return self.table("page_blocks").data([page_id, block_id, region, weight])
147 def defaultRole(self, name):
148 role_id = Model.int_uid(name)
149 return self.table("roles").data([role_id, name])
150 def defaultGroup(self, name):
151 group_id = Model.int_uid(name)
152 return self.table("groups").data([group_id, name])
153 def defaultUser(self, name, login, passwd, email, active=1):
154 user_id = Model.int_uid(login)
155 passwd = Model.uid(passwd)
156 return self.table("users").data([user_id, name, login, passwd, email, active])
158 def assignRoleToGroup(self, role_name, group_name):
159 role_id = Model.int_uid(role_name)
160 group_id = Model.int_uid(group_name)
161 return self.assignRoleToGroupByID(role_id, group_id)
162 def assignRoleToGroupByID(self, role_id, group_id):
163 return self.table("group_roles").data([group_id, role_id])
165 def assignRoleToUser(self, role_name, user_name):
166 role_id = Model.int_uid(role_name)
167 user_id = Model.int_uid(user_name)
168 return self.assignRoleToUserByID(role_id, user_id)
169 def assignRoleToUserByID(self, role_id, user_id):
170 return self.table("user_roles").data([user_id, role_id])
172 def assignUserToGroup(self, login, group_name):
173 user_id = Model.int_uid(login)
174 group_id = Model.int_uid(group_name)
175 return self.table("group_users").data([group_id, user_id])
177 def getSiteMap(self):
178 """ Returns a dict full of everything known about the site. """
179 site = {}
180 pages = Query(name="pageset", sql="""
181 select p.pid, p.url, p.name as page_name, b.name as block_name, pb.region, pb.weight
182 from pages p
183 join page_blocks pb on pb.pid = p.pid
184 join blocks b on b.bid = pb.bid
185 where b.active = 1 and pb.active = 1
186 order by pb.weight asc
187 """)
188 for p in pages.Query("select distinct url,pid from __self__ order by url"):
189 site[p.url] = {}
190 for r in pages.Query("select distinct region from pageset where pid = %s order by weight" % p.pid)['region']:
191 b = pages.Query("select block_name from pageset where region = '%s' and pid = %s order by weight" % (r,p.pid))['block_name']
192 site[p.url][r] = ','.join([unicode(v) for v in b])
193 if Settings.debugSitemap:
194 log("[ %s ] %s -> %s" % (p.url, r, b))
195 return site