2.1 --- a/MoinSupport.py Wed Nov 06 00:24:17 2013 +0100
2.2 +++ b/MoinSupport.py Wed Nov 06 01:46:22 2013 +0100
2.3 @@ -13,9 +13,9 @@
2.4 """
2.5
2.6 from DateSupport import *
2.7 -from ItemSupport import ItemDirectoryStore, ItemStoreBase
2.8 +from ItemSupport import DirectoryItemStore, GeneralItemStore
2.9 from MoinMoin.parser import text_moin_wiki
2.10 -from MoinMoin.Page import Page
2.11 +from MoinMoin.Page import Page, RootPage
2.12 from MoinMoin.PageEditor import PageEditor
2.13 from MoinMoin.util import lock
2.14 from MoinMoin import config, search, wikiutil
2.15 @@ -1093,18 +1093,109 @@
2.16
2.17 # Content storage support.
2.18
2.19 -class ItemStore:
2.20 +# Specific storage mechanisms.
2.21 +
2.22 +class SubpageItemStore(GeneralItemStore):
2.23 +
2.24 + "A subpage-based item store."
2.25 +
2.26 + def __init__(self, page, lock_dir):
2.27 +
2.28 + "Initialise an item store for subpages under the given 'page'."
2.29 +
2.30 + GeneralItemStore.__init__(self, lock_dir)
2.31 + self.page = page
2.32 +
2.33 + def mtime(self):
2.34 +
2.35 + "Return the last modified time of the item store."
2.36 +
2.37 + keys = self.get_keys()
2.38 + if not keys:
2.39 + page = self.page
2.40 + else:
2.41 + page = Page(self.page.request, self.get_item_path(max(keys)))
2.42
2.43 - "A page-specific item store."
2.44 + return wikiutil.version2timestamp(
2.45 + getMetadata(page)["last-modified"]
2.46 + )
2.47 +
2.48 + def get_next(self):
2.49 +
2.50 + "Return the next item number."
2.51 +
2.52 + return self.deduce_next()
2.53 +
2.54 + def get_keys(self):
2.55 +
2.56 + "Return the item keys."
2.57
2.58 - def __init__(self, page, item_dir="items", lock_dir="item_locks", store=None):
2.59 + is_subpage = re.compile(u"^%s/" % re.escape(self.page.page_name), re.UNICODE).match
2.60 +
2.61 + # Collect the strict subpages of the parent page.
2.62 +
2.63 + leafnames = []
2.64 + parentname = self.page.page_name
2.65 +
2.66 + for pagename in RootPage(self.page.request).getPageList(filter=is_subpage):
2.67 + parts = pagename[len(parentname)+1:].split("/")
2.68 +
2.69 + # Only collect numbered pages immediately below the parent.
2.70 +
2.71 + if len(parts) == 1 and parts[0].isdigit():
2.72 + leafnames.append(int(parts[0]))
2.73
2.74 - "Initialise an item store for the given 'page'."
2.75 + return leafnames
2.76 +
2.77 + def write_item(self, item, next):
2.78 +
2.79 + "Write the given 'item' to a file with the given 'next' item number."
2.80 +
2.81 + page = PageEditor(self.page.request, self.get_item_path(next))
2.82 + page.saveText(item, 0)
2.83 +
2.84 + def read_item(self, number):
2.85 +
2.86 + "Read the item with the given item 'number'."
2.87 +
2.88 + page = Page(self.page.request, self.get_item_path(number))
2.89 + return page.get_raw_body()
2.90 +
2.91 + def remove_item(self, number):
2.92 +
2.93 + "Remove the item with the given item 'number'."
2.94 +
2.95 + page = PageEditor(self.page.request, self.get_item_path(number))
2.96 + page.deletePage()
2.97 +
2.98 + def get_item_path(self, number):
2.99
2.100 - item_dir_path = tuple(item_dir.split("/"))
2.101 - lock_dir_path = tuple(lock_dir.split("/"))
2.102 + "Get the path for the given item 'number'."
2.103 +
2.104 + return "%s/%s" % (self.page.page_name, number)
2.105 +
2.106 + # High-level methods.
2.107 +
2.108 + def append(self, item):
2.109 +
2.110 + "Append the given 'item' to the store."
2.111 +
2.112 + self.writelock.acquire()
2.113 + try:
2.114 + next = self.get_next()
2.115 + self.write_item(item, next)
2.116 + finally:
2.117 + self.writelock.release()
2.118 +
2.119 +# General item store classes.
2.120 +
2.121 +class ItemStoreBase:
2.122 +
2.123 + "Support for page-specific item stores."
2.124 +
2.125 + def __init__(self, page, store):
2.126 self.page = page
2.127 - self.store = store or ItemDirectoryStore(page.getPagePath(*item_dir_path), page.getPagePath(*lock_dir_path))
2.128 + self.store = store
2.129
2.130 def can_write(self):
2.131
2.132 @@ -1194,97 +1285,27 @@
2.133 def next(self):
2.134 return self.store.next()
2.135
2.136 -class ItemSubpageStore(ItemStoreBase):
2.137 -
2.138 - "A subpage-based item store."
2.139 -
2.140 - def __init__(self, page, lock_dir="item_locks"):
2.141 -
2.142 - "Initialise an item store for subpages under the given 'page'."
2.143 -
2.144 - lock_dir_path = tuple(lock_dir.split("/"))
2.145 - ItemStoreBase.__init__(self, page.getPagePath(*lock_dir_path))
2.146 - self.page = page
2.147 -
2.148 - def mtime(self):
2.149 -
2.150 - "Return the last modified time of the item store."
2.151 -
2.152 - keys = self.get_keys()
2.153 - if not keys:
2.154 - page = self.page
2.155 - else:
2.156 - page = Page(self.page.request, self.get_item_path(max(keys)))
2.157 +def getDirectoryItemStoreForPage(page, item_dir, lock_dir):
2.158 + item_dir_path = tuple(item_dir.split("/"))
2.159 + lock_dir_path = tuple(lock_dir.split("/"))
2.160 + return DirectoryItemStore(page.getPagePath(*item_dir_path), page.getPagePath(*lock_dir_path))
2.161
2.162 - return wikiutil.version2timestamp(
2.163 - getMetadata(page)["last-modified"]
2.164 - )
2.165 -
2.166 - def get_next(self):
2.167 -
2.168 - "Return the next item number."
2.169 -
2.170 - return self.deduce_next()
2.171 -
2.172 - def get_keys(self):
2.173 +def getSubpageItemStoreForPage(page, lock_dir):
2.174 + lock_dir_path = tuple(lock_dir.split("/"))
2.175 + return SubpageItemStore(page, page.getPagePath(*lock_dir_path))
2.176
2.177 - "Return the item keys."
2.178 -
2.179 - is_subpage = re.compile(u"^%s/" % re.escape(self.page.page_name), re.UNICODE).match
2.180 -
2.181 - # Collect the strict subpages of the parent page.
2.182 -
2.183 - leafnames = []
2.184 - parentname = self.page.page_name
2.185 -
2.186 - for pagename in RootPage(self.page.request).getPageList(filter=is_subpage):
2.187 - parts = pagename[len(parentname)+1:].split("/")
2.188 +# Convenience store constructors.
2.189
2.190 - # Only collect numbered pages immediately below the parent.
2.191 -
2.192 - if len(parts) == 1 and parts[0].isdigit():
2.193 - leafnames.append(int(parts[0]))
2.194 -
2.195 - return leafnames
2.196 -
2.197 - def write_item(self, item, next):
2.198 -
2.199 - "Write the given 'item' to a file with the given 'next' item number."
2.200 +def ItemStore(page, item_dir="items", lock_dir="item_locks"):
2.201
2.202 - page = PageEditor(self.page.request, self.get_item_path(next))
2.203 - page.saveText(item, 0)
2.204 -
2.205 - def read_item(self, number):
2.206 + "Store items in a directory via a page."
2.207
2.208 - "Read the item with the given item 'number'."
2.209 -
2.210 - page = Page(self.page.request, self.get_item_path(number))
2.211 - return page.get_raw_body()
2.212 -
2.213 - def remove_item(self, number):
2.214 + return ItemStoreBase(page, getDirectoryItemStoreForPage(page, item_dir, lock_dir))
2.215
2.216 - "Remove the item with the given item 'number'."
2.217 -
2.218 - page = PageEditor(self.page.request, self.get_item_path(number))
2.219 - page.deletePage()
2.220 -
2.221 - def get_item_path(self, number):
2.222 -
2.223 - "Get the path for the given item 'number'."
2.224 -
2.225 - return "%s/%s" % (self.page.page_name, number)
2.226 +def ItemSubpageStore(page, lock_dir="item_locks"):
2.227
2.228 - # High-level methods.
2.229 -
2.230 - def append(self, item):
2.231 -
2.232 - "Append the given 'item' to the store."
2.233 + "Store items in subpages of a page."
2.234
2.235 - self.writelock.acquire()
2.236 - try:
2.237 - next = self.get_next()
2.238 - self.write_item(item, next)
2.239 - finally:
2.240 - self.writelock.release()
2.241 + return ItemStoreBase(page, getSubpageItemStoreForPage(page, lock_dir))
2.242
2.243 # vim: tabstop=4 expandtab shiftwidth=4