diff options
author | Lars Wirzenius <liw@liw.fi> | 2017-04-29 20:03:56 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2017-04-29 20:03:56 +0300 |
commit | 5e7a8c6b497ed7fa7ffac2c0a80244dd3fa85cde (patch) | |
tree | 7a790b063df6fe6f034b5e5b635572fae73edf37 /distixlib | |
parent | bc8b0b2682522587742ac65091e3ea005c0f94e6 (diff) | |
download | distix-5e7a8c6b497ed7fa7ffac2c0a80244dd3fa85cde.tar.gz |
Use lightweight versions of tickets for renderingliw/memopt
This way, we save memory by not having large numbers of Ticket objects
in memory at once. Also, only load into memory tickets while they are
neeeded.
Diffstat (limited to 'distixlib')
-rw-r--r-- | distixlib/plugins/html_plugin.py | 45 | ||||
-rw-r--r-- | distixlib/ticket_store.py | 6 |
2 files changed, 45 insertions, 6 deletions
diff --git a/distixlib/plugins/html_plugin.py b/distixlib/plugins/html_plugin.py index 379a83c..2ee8bd1 100644 --- a/distixlib/plugins/html_plugin.py +++ b/distixlib/plugins/html_plugin.py @@ -84,8 +84,10 @@ class StaticSite(object): 'index.html.j2', 'index.html', self._ticket_is_open) self._render_ticket_list( 'closed.html.j2', 'closed.html', self._ticket_is_closed) - for ticket in self._ticket_store.get_tickets(): + for ticket_id in self._ticket_store.get_ticket_ids(): + ticket = self._ticket_store.get_ticket(ticket_id) self._render_ticket(ticket) + self._ticket_store.clear_ticket_cache() self._copy_static_files() def _format_timestamp(self): @@ -129,11 +131,16 @@ class StaticSite(object): return markdown.markdown(text) def _get_tickets(self, condition): - return [ - ticket - for ticket in self._ticket_store.get_tickets() - if condition(ticket) - ] + for ticket_id in self._ticket_store.get_ticket_ids(): + ticket = self._ticket_store.get_ticket(ticket_id) + self._ticket_store.clear_ticket_cache() + if condition(ticket): + lt = TicketLight() + lt.set_ticket_id(ticket_id) + lt.set_title(ticket.get_title()) + lt.set_newest_message_timestamp( + ticket.get_newest_message_timestamp()) + yield lt def _ticket_is_open(self, ticket): return not self._ticket_is_closed(ticket) @@ -163,6 +170,32 @@ class StaticSite(object): f.write(text.encode('UTF8')) +class TicketLight(object): + + def __init__(self): + self._ticket_id = None + self._title = None + self._timestamp = None + + def set_ticket_id(self, ticket_id): + self._ticket_id = ticket_id + + def set_title(self, title): + self._title = title + + def set_newest_message_timestamp(self, timestamp): + self._timestamp = timestamp + + def get_ticket_id(self): + return self._ticket_id + + def get_title(self): + return self._title + + def get_newest_message_timestamp(self): + return self._timestamp + + class UsageError(distixlib.StructuredError): msg = '"html" command must get exactly one argument: the output directory' diff --git a/distixlib/ticket_store.py b/distixlib/ticket_store.py index 2343e2e..fdf5b02 100644 --- a/distixlib/ticket_store.py +++ b/distixlib/ticket_store.py @@ -74,6 +74,9 @@ class TicketStore(object): return os.listdir(self._dirname) return [] + def clear_ticket_cache(self): # pragma: no cover + self._ticket_cache.clear() + def get_ticket(self, ticket_id_or_prefix): '''Return a distixlib.Ticket for an existing ticket in the store.''' @@ -226,3 +229,6 @@ class _TicketCache(object): def get_all(self): return self._known_tickets.values() + + def clear(self): # pragma: no cover + self._known_tickets.clear() |