from owrx.controllers.template import WebpageController from owrx.controllers.admin import AuthorizationMixin from owrx.bookmarks import Bookmark, Bookmarks from owrx.modes import Modes import json import logging logger = logging.getLogger(__name__) class BookmarksController(AuthorizationMixin, WebpageController): def header_variables(self): variables = super().header_variables() variables["assets_prefix"] = "../" return variables def template_variables(self): variables = super().template_variables() variables["bookmarks"] = self.render_table() return variables def render_table(self): bookmarks = Bookmarks.getSharedInstance() def render_mode(m): return """ """.format( mode=m.modulation, name=m.name, ) return """ {bookmarks}
Name Frequency Modulation Actions
""".format( bookmarks="".join(self.render_bookmark(b) for b in bookmarks.getBookmarks()), options="".join(render_mode(m) for m in Modes.getAvailableModes()), ) def render_bookmark(self, bookmark: Bookmark): mode = Modes.findByModulation(bookmark.getModulation()) return """ {name} {frequency} {modulation_name} """.format( id=id(bookmark), name=bookmark.getName(), frequency=bookmark.getFrequency(), modulation=bookmark.getModulation() if mode is None else mode.modulation, modulation_name=bookmark.getModulation() if mode is None else mode.name, ) def _findBookmark(self, bookmark_id): bookmarks = Bookmarks.getSharedInstance() try: return next(b for b in bookmarks.getBookmarks() if id(b) == bookmark_id) except StopIteration: return None def update(self): bookmark_id = int(self.request.matches.group(1)) bookmark = self._findBookmark(bookmark_id) if bookmark is None: self.send_response("{}", content_type="application/json", code=404) return try: data = json.loads(self.get_body()) for key in ["name", "frequency", "modulation"]: if key in data: value = data[key] if key == "frequency": value = int(value) setattr(bookmark, key, value) Bookmarks.getSharedInstance().store() self.send_response("{}", content_type="application/json", code=200) except json.JSONDecodeError: self.send_response("{}", content_type="application/json", code=400) def new(self): bookmarks = Bookmarks.getSharedInstance() try: data = json.loads(self.get_body()) # sanitize data = {k: data[k] for k in ["name", "frequency", "modulation"]} bookmark = Bookmark(data) bookmarks.addBookmark(bookmark) bookmarks.store() self.send_response(json.dumps({"bookmark_id": id(bookmark)}), content_type="application/json", code=200) except json.JSONDecodeError: self.send_response("{}", content_type="application/json", code=400) def delete(self): bookmark_id = int(self.request.matches.group(1)) bookmark = self._findBookmark(bookmark_id) if bookmark is None: self.send_response("{}", content_type="application/json", code=404) return bookmarks = Bookmarks.getSharedInstance() bookmarks.removeBookmark(bookmark) bookmarks.store() self.send_response("{}", content_type="application/json", code=200) def indexAction(self): self.serve_template("settings/bookmarks.html", **self.template_variables())