diff --git a/mixins/menuitemmixin.py b/mixins/menuitemmixin.py index b4f69f4..f429a44 100644 --- a/mixins/menuitemmixin.py +++ b/mixins/menuitemmixin.py @@ -7,30 +7,29 @@ class MenuItemMixin(MessageMixin): menu_label = None menu_parent = None url = "index.html" - + menu_items = None def process_message(self, message): other_messages = super(MenuItemMixin, self).process_message(message) - + if message == None: - return other_messages + [{'type': 'menu_add_item', - 'title' : self.menu_title, + self.menu_items = {} + return other_messages + [{'type': 'menu_add_item', + 'title' : self.menu_title, 'parent' : self.menu_parent, 'label' : self.menu_label, 'url' : self.url}] - elif message['type'] == 'menu_add_item': - if self.menu_items == None: - self.menu_items = {} - + elif message['type'] == 'menu_add_item': + label = message['label'] if label in self.menu_items.keys(): print '[Warn] Depulicate menu item label: %s in %s' % (label, self.menu_label) return other_messages - + self.menu_items[label] = {} - + for key in ['title', 'parent', 'label', 'url']: self.menu_items[label][key] = message[key] @@ -41,14 +40,14 @@ class MenuItemMixin(MessageMixin): path = [self.menu_label] while self.menu_items[path[0]]['parent'] != None: path = [self.menu_items[path[0]]['parent']] + path - + return path - + def get_menu_level(self, parent): return filter(lambda x: x['parent'] == parent, self.menu_items.values()) - + def generate_levels(self, path): level = path[0] next_level = None @@ -69,16 +68,16 @@ class MenuItemMixin(MessageMixin): res += '' else: res += '
  • %s
  • ' % (item['url'], item['title']) - + res += '' return res def generate_menu(self): - + path = self.get_menu_path() - - return self.generate_levels([None] + path) + + return self.generate_levels([None] + path) def get_context(self): @@ -87,4 +86,3 @@ class MenuItemMixin(MessageMixin): context['menu'] = self.generate_menu() return context - diff --git a/modules/newsfeed.py b/modules/newsfeed.py index b50e256..f4891e3 100644 --- a/modules/newsfeed.py +++ b/modules/newsfeed.py @@ -29,7 +29,9 @@ class NewsFeed(MenuItemMixin, TemplateMixin, AssetsMixin): def process_message(self, message): other_messages = super(NewsFeed, self).process_message(message) - if message != None and message['type'] == 'news_feed_item': + if message == None: + self.items = [] + elif message['type'] == 'news_feed_item': if message['feed_id'] == self.news_feed_id: self.items += [message['item']] diff --git a/requirements.txt b/requirements.txt index 3a11ca9..5f84310 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ +inotify==0.2.4 Jinja2==2.7.3 Markdown==2.6 MarkupSafe==0.23 Pillow==3.1.0 python-dateutil==2.4.2 six==1.10.0 -wheel==0.24.0 diff --git a/verdandi.py b/verdandi.py index 91b9b53..6670b13 100644 --- a/verdandi.py +++ b/verdandi.py @@ -3,23 +3,22 @@ import os import sys import SocketServer +import inotify.adapters from jinja2 import Environment, FileSystemLoader from SimpleHTTPServer import SimpleHTTPRequestHandler +from multiprocessing import Process - - -from constants import OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS +from constants import CONTENT_DIRECTORY, OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS class Verdandi(object): - template_directory = TEMPLATE_DIRECTORY output_directory = OUTPUT_DIRECTORY modules = [] def __init__(self): - self.jinja_env = Environment(loader=FileSystemLoader(self.template_directory)) + self.jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRECTORY)) def send_message(self, message): @@ -52,12 +51,46 @@ class Verdandi(object): def run(self): + self.generate_output() + + if len(sys.argv) > 1 and sys.argv[1] == 'serve': + self.serve() + + + def generate_output(self): self.pass_messages() self.collect_assets() self.render() - if len(sys.argv) > 1 and sys.argv[1] == 'serve': + + def serve(self): + + def has_create_or_modify(watch): + result = False + for event in watch.event_gen(): + if event == None: + break + + result = result or ('IN_CREATE' in event[1]) + result = result or ('IN_DELETE' in event[1]) + result = result or ('IN_MODIFY' in event[1]) + + return result + + content_watch = inotify.adapters.InotifyTree(CONTENT_DIRECTORY) + template_watch = inotify.adapters.InotifyTree(TEMPLATE_DIRECTORY) + + + def serve(): os.chdir(self.output_directory) httpd = SocketServer.TCPServer((SERVE_BIND_ADDRESS, SERVE_PORT), SimpleHTTPRequestHandler) print "Serving under %s:%d" % (SERVE_BIND_ADDRESS, SERVE_PORT) httpd.serve_forever() + + + server_process = Process(target=serve) + server_process.start() + + while True: + if has_create_or_modify(content_watch) or has_create_or_modify(template_watch): + self.generate_output()