1.1 --- a/ItemSupport.py Fri May 31 02:07:53 2013 +0200
1.2 +++ b/ItemSupport.py Mon Jun 03 23:37:05 2013 +0200
1.3 @@ -41,11 +41,17 @@
1.4 self.write_next(next)
1.5 return next
1.6
1.7 + def get_keys(self):
1.8 +
1.9 + "Return the item keys."
1.10 +
1.11 + return [int(filename) for filename in os.listdir(self.path) if filename.isdigit()]
1.12 +
1.13 def deduce_next(self):
1.14
1.15 "Deduce the next item number from the existing item files."
1.16
1.17 - return max([int(filename) for filename in os.listdir(self.path) if filename.isdigit()] or [-1]) + 1
1.18 + return max(self.get_keys() or [-1]) + 1
1.19
1.20 def read_next(self):
1.21
1.22 @@ -93,6 +99,12 @@
1.23 finally:
1.24 f.close()
1.25
1.26 + def remove_item(self, number):
1.27 +
1.28 + "Remove the item with the given item 'number'."
1.29 +
1.30 + os.remove(self.get_item_path(number))
1.31 +
1.32 def get_item_path(self, number):
1.33
1.34 "Get the path for the given item 'number'."
1.35 @@ -122,15 +134,10 @@
1.36 def __len__(self):
1.37
1.38 """
1.39 - Return the number of the next item (which should also be the number of
1.40 - items).
1.41 + Return the number of items.
1.42 """
1.43
1.44 - self.writelock.acquire()
1.45 - try:
1.46 - return self.get_next()
1.47 - finally:
1.48 - self.writelock.release()
1.49 + return len(self.keys())
1.50
1.51 def __iter__(self):
1.52
1.53 @@ -138,6 +145,16 @@
1.54
1.55 return ItemIterator(self)
1.56
1.57 + def keys(self):
1.58 +
1.59 + "Return a list of keys for items in the store."
1.60 +
1.61 + self.readlock.acquire()
1.62 + try:
1.63 + return self.get_keys()
1.64 + finally:
1.65 + self.readlock.release()
1.66 +
1.67 def __getitem__(self, number):
1.68
1.69 "Return the item with the given 'number'."
1.70 @@ -151,6 +168,32 @@
1.71 finally:
1.72 self.readlock.release()
1.73
1.74 + def __delitem__(self, number):
1.75 +
1.76 + "Remove the item with the given 'number' from the store."
1.77 +
1.78 + self.writelock.acquire()
1.79 + try:
1.80 + try:
1.81 + self.remove_item(number)
1.82 + except (IOError, OSError):
1.83 + raise IndexError, number
1.84 + finally:
1.85 + self.writelock.release()
1.86 +
1.87 + def next(self):
1.88 +
1.89 + """
1.90 + Return the number of the next item (which should also be the number of
1.91 + items if none have been deleted).
1.92 + """
1.93 +
1.94 + self.writelock.acquire()
1.95 + try:
1.96 + return self.get_next()
1.97 + finally:
1.98 + self.writelock.release()
1.99 +
1.100 class ItemIterator:
1.101
1.102 "An iterator over items in a store."
1.103 @@ -163,9 +206,9 @@
1.104 def reset(self):
1.105 if self.direction == 1:
1.106 self._next = 0
1.107 - self.final = len(self.store)
1.108 + self.final = self.store.next()
1.109 else:
1.110 - self._next = len(self.store) - 1
1.111 + self._next = self.store.next() - 1
1.112 self.final = 0
1.113
1.114 def more(self):
2.1 --- a/MoinSupport.py Fri May 31 02:07:53 2013 +0200
2.2 +++ b/MoinSupport.py Mon Jun 03 23:37:05 2013 +0200
2.3 @@ -1026,6 +1026,16 @@
2.4 user = self.page.request.user
2.5 return user and user.may.read(self.page.page_name)
2.6
2.7 + def can_delete(self):
2.8 +
2.9 + """
2.10 + Return whether the user associated with the request can delete the
2.11 + page owning this store.
2.12 + """
2.13 +
2.14 + user = self.page.request.user
2.15 + return user and user.may.delete(self.page.page_name)
2.16 +
2.17 # High-level methods.
2.18
2.19 def append(self, item):
2.20 @@ -1039,10 +1049,7 @@
2.21
2.22 def __len__(self):
2.23
2.24 - """
2.25 - Return the number of the next item (which should also be the number of
2.26 - items).
2.27 - """
2.28 + "Return the number of items in the store."
2.29
2.30 if not self.can_read():
2.31 return 0
2.32 @@ -1058,4 +1065,13 @@
2.33
2.34 return ItemDirectoryStore.__getitem__(self, number)
2.35
2.36 + def __delitem__(self, number):
2.37 +
2.38 + "Remove the item with the given 'number'."
2.39 +
2.40 + if not self.can_delete():
2.41 + return
2.42 +
2.43 + return ItemDirectoryStore.__delitem__(self, number)
2.44 +
2.45 # vim: tabstop=4 expandtab shiftwidth=4