Created
June 9, 2016 02:00
-
-
Save binary1230/500bf727858b585e09a94e37e8f6ea30 to your computer and use it in GitHub Desktop.
Revisions
-
binary1230 created this gist
Jun 9, 2016 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,84 @@ import json # Dom's idea to try and rework the ubersystem menu system so we can append things to it from plugins # right now, we can't really inject things into the menu from plugins, and I thought this should be an easier thing. # (mostly, was trying to get some links for the band plugin on the main menu) # # TLDR ended up coming up with this idea for how to represent the menu in python, and then passing that as JSON to # our javascript code which actually creates the HTML elements. # # Lemme know what you guys think and if it's worth pursuing I'll continue on with this when I have a few spare minutes # pretend this is uber's Config() class class DomsJunkConfig(object): # fake config data to make this example work ACCOUNTS = 0 PEOPLE = 1 REG_AT_CON = 2 PEOPLE = 3 WATCHLIST = 4 STUFF = 5 STATS = 6 AT_THE_CON = False # end fake config data class MenuItemEncoder(json.JSONEncoder): def default(self, o): out = {} # skip anything that is None for key,value in o.__dict__.items(): if value: out[key] = value return out @property def MENU_JSON(self): return json.dumps(c.MENU, cls=self.MenuItemEncoder, sort_keys=True, indent=2) c = DomsJunkConfig() class MenuItem: access = None # list of permission levels allowed to display this menu href = None # link to show submenu = None # submenu to show def __init__(self, href=None, access=None, submenu=None): if submenu: self.submenu = submenu else: self.href = href self.access = access # in base ubersystem, we represent the menu like this c.MENU = { 'Accounts': MenuItem(href='../accounts/', access=c.ACCOUNTS), 'People': MenuItem(access=[c.PEOPLE, c.REG_AT_CON], submenu=[ {'Attendees': MenuItem(href='../registration/{}'.format('?invalid=True' if c.AT_THE_CON else ''))}, {'Groups': MenuItem(href='../groups/')}, {'All Untaken Shifts': MenuItem(access=c.PEOPLE, href='../jobs/everywhere')}, {'Jobs': MenuItem(access=c.PEOPLE, href='../jobs/')}, {'Watchlist': MenuItem(access=c.WATCHLIST, href='../registration/watchlist_entries')}, {'Feed of Database Changes': MenuItem(href='../registration/feed')} ]), 'Schedule': MenuItem(access=c.STUFF, submenu=[ {'View Schedule': MenuItem(href='../schedule/')}, {'Edit Schedule': MenuItem(href='../schedule/edit')} ]), 'Statistics': MenuItem(href='../summary/'), } # in plugins, we can add stuff to the menus like this: c.MENU['People'].submenu.append( {'Bands': MenuItem(href='../registration/feed')} ) # convert to JSON like this and pass to the templates (should already be passed to templates because it's in 'c') print(c.MENU_JSON)