Added inotify code for autorebuild

Made menuitem and news feed drop state on initial None message
This commit is contained in:
Sebastian 2016-04-22 22:29:08 +02:00
parent 871cab9621
commit fdd2cd139d
4 changed files with 59 additions and 26 deletions

View File

@ -7,30 +7,29 @@ class MenuItemMixin(MessageMixin):
menu_label = None menu_label = None
menu_parent = None menu_parent = None
url = "index.html" url = "index.html"
menu_items = None menu_items = None
def process_message(self, message): def process_message(self, message):
other_messages = super(MenuItemMixin, self).process_message(message) other_messages = super(MenuItemMixin, self).process_message(message)
if message == None: if message == None:
return other_messages + [{'type': 'menu_add_item', self.menu_items = {}
'title' : self.menu_title, return other_messages + [{'type': 'menu_add_item',
'title' : self.menu_title,
'parent' : self.menu_parent, 'parent' : self.menu_parent,
'label' : self.menu_label, 'label' : self.menu_label,
'url' : self.url}] 'url' : self.url}]
elif message['type'] == 'menu_add_item': elif message['type'] == 'menu_add_item':
if self.menu_items == None:
self.menu_items = {}
label = message['label'] label = message['label']
if label in self.menu_items.keys(): if label in self.menu_items.keys():
print '[Warn] Depulicate menu item label: %s in %s' % (label, self.menu_label) print '[Warn] Depulicate menu item label: %s in %s' % (label, self.menu_label)
return other_messages return other_messages
self.menu_items[label] = {} self.menu_items[label] = {}
for key in ['title', 'parent', 'label', 'url']: for key in ['title', 'parent', 'label', 'url']:
self.menu_items[label][key] = message[key] self.menu_items[label][key] = message[key]
@ -41,14 +40,14 @@ class MenuItemMixin(MessageMixin):
path = [self.menu_label] path = [self.menu_label]
while self.menu_items[path[0]]['parent'] != None: while self.menu_items[path[0]]['parent'] != None:
path = [self.menu_items[path[0]]['parent']] + path path = [self.menu_items[path[0]]['parent']] + path
return path return path
def get_menu_level(self, parent): def get_menu_level(self, parent):
return filter(lambda x: x['parent'] == parent, self.menu_items.values()) return filter(lambda x: x['parent'] == parent, self.menu_items.values())
def generate_levels(self, path): def generate_levels(self, path):
level = path[0] level = path[0]
next_level = None next_level = None
@ -69,16 +68,16 @@ class MenuItemMixin(MessageMixin):
res += '</li>' res += '</li>'
else: else:
res += '<li><a href="/%s">%s</a></li>' % (item['url'], item['title']) res += '<li><a href="/%s">%s</a></li>' % (item['url'], item['title'])
res += '</ul>' res += '</ul>'
return res return res
def generate_menu(self): def generate_menu(self):
path = self.get_menu_path() path = self.get_menu_path()
return self.generate_levels([None] + path) return self.generate_levels([None] + path)
def get_context(self): def get_context(self):
@ -87,4 +86,3 @@ class MenuItemMixin(MessageMixin):
context['menu'] = self.generate_menu() context['menu'] = self.generate_menu()
return context return context

View File

@ -29,7 +29,9 @@ class NewsFeed(MenuItemMixin, TemplateMixin, AssetsMixin):
def process_message(self, message): def process_message(self, message):
other_messages = super(NewsFeed, self).process_message(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: if message['feed_id'] == self.news_feed_id:
self.items += [message['item']] self.items += [message['item']]

View File

@ -1,7 +1,7 @@
inotify==0.2.4
Jinja2==2.7.3 Jinja2==2.7.3
Markdown==2.6 Markdown==2.6
MarkupSafe==0.23 MarkupSafe==0.23
Pillow==3.1.0 Pillow==3.1.0
python-dateutil==2.4.2 python-dateutil==2.4.2
six==1.10.0 six==1.10.0
wheel==0.24.0

View File

@ -3,23 +3,22 @@
import os import os
import sys import sys
import SocketServer import SocketServer
import inotify.adapters
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
from SimpleHTTPServer import SimpleHTTPRequestHandler from SimpleHTTPServer import SimpleHTTPRequestHandler
from multiprocessing import Process
from constants import CONTENT_DIRECTORY, OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS
from constants import OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS
class Verdandi(object): class Verdandi(object):
template_directory = TEMPLATE_DIRECTORY
output_directory = OUTPUT_DIRECTORY output_directory = OUTPUT_DIRECTORY
modules = [] modules = []
def __init__(self): 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): def send_message(self, message):
@ -52,12 +51,46 @@ class Verdandi(object):
def run(self): 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.pass_messages()
self.collect_assets() self.collect_assets()
self.render() 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) os.chdir(self.output_directory)
httpd = SocketServer.TCPServer((SERVE_BIND_ADDRESS, SERVE_PORT), SimpleHTTPRequestHandler) httpd = SocketServer.TCPServer((SERVE_BIND_ADDRESS, SERVE_PORT), SimpleHTTPRequestHandler)
print "Serving under %s:%d" % (SERVE_BIND_ADDRESS, SERVE_PORT) print "Serving under %s:%d" % (SERVE_BIND_ADDRESS, SERVE_PORT)
httpd.serve_forever() 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()