1.1 --- a/MoinSupport.py Wed Nov 06 00:24:17 2013 +0100
1.2 +++ b/MoinSupport.py Wed Nov 06 01:46:22 2013 +0100
1.3 @@ -13,9 +13,9 @@
1.4 """
1.5
1.6 from DateSupport import *
1.7 -from ItemSupport import ItemDirectoryStore, ItemStoreBase
1.8 +from ItemSupport import DirectoryItemStore, GeneralItemStore
1.9 from MoinMoin.parser import text_moin_wiki
1.10 -from MoinMoin.Page import Page
1.11 +from MoinMoin.Page import Page, RootPage
1.12 from MoinMoin.PageEditor import PageEditor
1.13 from MoinMoin.util import lock
1.14 from MoinMoin import config, search, wikiutil
1.15 @@ -1093,18 +1093,109 @@
1.16
1.17 # Content storage support.
1.18
1.19 -class ItemStore:
1.20 +# Specific storage mechanisms.
1.21 +
1.22 +class SubpageItemStore(GeneralItemStore):
1.23 +
1.24 + "A subpage-based item store."
1.25 +
1.26 + def __init__(self, page, lock_dir):
1.27 +
1.28 + "Initialise an item store for subpages under the given 'page'."
1.29 +
1.30 + GeneralItemStore.__init__(self, lock_dir)
1.31 + self.page = page
1.32 +
1.33 + def mtime(self):
1.34 +
1.35 + "Return the last modified time of the item store."
1.36 +
1.37 + keys = self.get_keys()
1.38 + if not keys:
1.39 + page = self.page
1.40 + else:
1.41 + page = Page(self.page.request, self.get_item_path(max(keys)))
1.42
1.43 - "A page-specific item store."
1.44 + return wikiutil.version2timestamp(
1.45 + getMetadata(page)["last-modified"]
1.46 + )
1.47 +
1.48 + def get_next(self):
1.49 +
1.50 + "Return the next item number."
1.51 +
1.52 + return self.deduce_next()
1.53 +
1.54 + def get_keys(self):
1.55 +
1.56 + "Return the item keys."
1.57
1.58 - def __init__(self, page, item_dir="items", lock_dir="item_locks", store=None):
1.59 + is_subpage = re.compile(u"^%s/" % re.escape(self.page.page_name), re.UNICODE).match
1.60 +
1.61 + # Collect the strict subpages of the parent page.
1.62 +
1.63 + leafnames = []
1.64 + parentname = self.page.page_name
1.65 +
1.66 + for pagename in RootPage(self.page.request).getPageList(filter=is_subpage):
1.67 + parts = pagename[len(parentname)+1:].split("/")
1.68 +
1.69 + # Only collect numbered pages immediately below the parent.
1.70 +
1.71 + if len(parts) == 1 and parts[0].isdigit():
1.72 + leafnames.append(int(parts[0]))
1.73
1.74 - "Initialise an item store for the given 'page'."
1.75 + return leafnames
1.76 +
1.77 + def write_item(self, item, next):
1.78 +
1.79 + "Write the given 'item' to a file with the given 'next' item number."
1.80 +
1.81 + page = PageEditor(self.page.request, self.get_item_path(next))
1.82 + page.saveText(item, 0)
1.83 +
1.84 + def read_item(self, number):
1.85 +
1.86 + "Read the item with the given item 'number'."
1.87 +
1.88 + page = Page(self.page.request, self.get_item_path(number))
1.89 + return page.get_raw_body()
1.90 +
1.91 + def remove_item(self, number):
1.92 +
1.93 + "Remove the item with the given item 'number'."
1.94 +
1.95 + page = PageEditor(self.page.request, self.get_item_path(number))
1.96 + page.deletePage()
1.97 +
1.98 + def get_item_path(self, number):
1.99
1.100 - item_dir_path = tuple(item_dir.split("/"))
1.101 - lock_dir_path = tuple(lock_dir.split("/"))
1.102 + "Get the path for the given item 'number'."
1.103 +
1.104 + return "%s/%s" % (self.page.page_name, number)
1.105 +
1.106 + # High-level methods.
1.107 +
1.108 + def append(self, item):
1.109 +
1.110 + "Append the given 'item' to the store."
1.111 +
1.112 + self.writelock.acquire()
1.113 + try:
1.114 + next = self.get_next()
1.115 + self.write_item(item, next)
1.116 + finally:
1.117 + self.writelock.release()
1.118 +
1.119 +# General item store classes.
1.120 +
1.121 +class ItemStoreBase:
1.122 +
1.123 + "Support for page-specific item stores."
1.124 +
1.125 + def __init__(self, page, store):
1.126 self.page = page
1.127 - self.store = store or ItemDirectoryStore(page.getPagePath(*item_dir_path), page.getPagePath(*lock_dir_path))
1.128 + self.store = store
1.129
1.130 def can_write(self):
1.131
1.132 @@ -1194,97 +1285,27 @@
1.133 def next(self):
1.134 return self.store.next()
1.135
1.136 -class ItemSubpageStore(ItemStoreBase):
1.137 -
1.138 - "A subpage-based item store."
1.139 -
1.140 - def __init__(self, page, lock_dir="item_locks"):
1.141 -
1.142 - "Initialise an item store for subpages under the given 'page'."
1.143 -
1.144 - lock_dir_path = tuple(lock_dir.split("/"))
1.145 - ItemStoreBase.__init__(self, page.getPagePath(*lock_dir_path))
1.146 - self.page = page
1.147 -
1.148 - def mtime(self):
1.149 -
1.150 - "Return the last modified time of the item store."
1.151 -
1.152 - keys = self.get_keys()
1.153 - if not keys:
1.154 - page = self.page
1.155 - else:
1.156 - page = Page(self.page.request, self.get_item_path(max(keys)))
1.157 +def getDirectoryItemStoreForPage(page, item_dir, lock_dir):
1.158 + item_dir_path = tuple(item_dir.split("/"))
1.159 + lock_dir_path = tuple(lock_dir.split("/"))
1.160 + return DirectoryItemStore(page.getPagePath(*item_dir_path), page.getPagePath(*lock_dir_path))
1.161
1.162 - return wikiutil.version2timestamp(
1.163 - getMetadata(page)["last-modified"]
1.164 - )
1.165 -
1.166 - def get_next(self):
1.167 -
1.168 - "Return the next item number."
1.169 -
1.170 - return self.deduce_next()
1.171 -
1.172 - def get_keys(self):
1.173 +def getSubpageItemStoreForPage(page, lock_dir):
1.174 + lock_dir_path = tuple(lock_dir.split("/"))
1.175 + return SubpageItemStore(page, page.getPagePath(*lock_dir_path))
1.176
1.177 - "Return the item keys."
1.178 -
1.179 - is_subpage = re.compile(u"^%s/" % re.escape(self.page.page_name), re.UNICODE).match
1.180 -
1.181 - # Collect the strict subpages of the parent page.
1.182 -
1.183 - leafnames = []
1.184 - parentname = self.page.page_name
1.185 -
1.186 - for pagename in RootPage(self.page.request).getPageList(filter=is_subpage):
1.187 - parts = pagename[len(parentname)+1:].split("/")
1.188 +# Convenience store constructors.
1.189
1.190 - # Only collect numbered pages immediately below the parent.
1.191 -
1.192 - if len(parts) == 1 and parts[0].isdigit():
1.193 - leafnames.append(int(parts[0]))
1.194 -
1.195 - return leafnames
1.196 -
1.197 - def write_item(self, item, next):
1.198 -
1.199 - "Write the given 'item' to a file with the given 'next' item number."
1.200 +def ItemStore(page, item_dir="items", lock_dir="item_locks"):
1.201
1.202 - page = PageEditor(self.page.request, self.get_item_path(next))
1.203 - page.saveText(item, 0)
1.204 -
1.205 - def read_item(self, number):
1.206 + "Store items in a directory via a page."
1.207
1.208 - "Read the item with the given item 'number'."
1.209 -
1.210 - page = Page(self.page.request, self.get_item_path(number))
1.211 - return page.get_raw_body()
1.212 -
1.213 - def remove_item(self, number):
1.214 + return ItemStoreBase(page, getDirectoryItemStoreForPage(page, item_dir, lock_dir))
1.215
1.216 - "Remove the item with the given item 'number'."
1.217 -
1.218 - page = PageEditor(self.page.request, self.get_item_path(number))
1.219 - page.deletePage()
1.220 -
1.221 - def get_item_path(self, number):
1.222 -
1.223 - "Get the path for the given item 'number'."
1.224 -
1.225 - return "%s/%s" % (self.page.page_name, number)
1.226 +def ItemSubpageStore(page, lock_dir="item_locks"):
1.227
1.228 - # High-level methods.
1.229 -
1.230 - def append(self, item):
1.231 -
1.232 - "Append the given 'item' to the store."
1.233 + "Store items in subpages of a page."
1.234
1.235 - self.writelock.acquire()
1.236 - try:
1.237 - next = self.get_next()
1.238 - self.write_item(item, next)
1.239 - finally:
1.240 - self.writelock.release()
1.241 + return ItemStoreBase(page, getSubpageItemStoreForPage(page, lock_dir))
1.242
1.243 # vim: tabstop=4 expandtab shiftwidth=4