示例#1
0
    def rename(self, request):
        nerve.users.require_group('admin')

        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        # TODO you totally don't validate these names enough
        oldname = request.arg('oldname')
        newname = request.arg('newname')

        if not oldname or not nerve.has_object(oldname):
            raise nerve.ControllerError(
                "The directory you've specified is invalid.")
        if not newname:
            raise nerve.ControllerError("The new name given is invalid.")
        if nerve.has_object(newname):
            raise nerve.ControllerError(
                "An object of that name already exists.")

        obj = nerve.get_object(oldname)
        if not nerve.del_object(oldname):
            raise nerve.ControllerError("Unable to rename this object.")
        nerve.set_object(newname, obj)

        nerve.save_config()
        self.load_json_view({'notice': "Object renamed"})
示例#2
0
    def add_media_items(self, request):
        operation = request.arg('operation')
        if not operation:
            raise nerve.ControllerError("'operation' field must be set")
        if not request.arg('media[]'):
            raise nerve.ControllerError("'media[]' field must be set")

        count = 0
        medialib = nerve.get_object(self.get_setting('device'))

        media = medialib.get_media_queries(request.arg('media[]'))

        if operation == 'playnow':
            player = nerve.get_object(self.get_setting('player'))
            if len(media) > 0:
                player.play(media[0]['filename'])
                for media_item in media[1:]:
                    player.enqueue(media_item['filename'])
            count = len(media)

        elif operation in [ 'enqueue', 'replace' ]:
            if not request.arg('playlist'):
                raise nerve.ControllerError("'playlist' field must be set")
            playlist = nerve.medialib.Playlist(request.arg('playlist'))
            if operation == 'replace':
                count = playlist.set_list(media)
            elif operation == 'enqueue':
                count = playlist.add_list(media)

        if count > 0:
            self.load_json_view({ 'notice': str(count) + " track(s) were added to playlist " + request.arg('playlist') })
        else:
            self.load_json_view({ 'error': "No tracks were added" })
示例#3
0
    def deletepage(self, request):
        pagename = request.arg('name', default=None)

        if not pagename:
            raise nerve.ControllerError(
                'You must provide a page name to delete')
        if not self.model.page_exists(pagename):
            raise nerve.ControllerError(
                'Attempting to delete non-existent page: ' + pagename)

        self.model.delete_page(pagename)
        self.load_json_view({'notice': 'Page deleted successfully'})
示例#4
0
    def defaults(self, request):
        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)
        if not request.arg('type'):
            raise nerve.ControllerError("You must select a type first")

        basename = request.arg('basename', default='')
        self.set_view(
            FormView(nerve.types.ConfigType.get_type('object'),
                     {'__type__': request.arg('type')},
                     basename=basename))
示例#5
0
    def deleteblock(self, request):
        blockname = request.arg('name', default=None)

        if not blockname:
            raise nerve.ControllerError(
                'You must provide a block name to delete')
        if not self.model.block_exists(blockname):
            raise nerve.ControllerError(
                'Attempting to delete non-existent block: ' + blockname)

        self.model.delete_block(blockname)
        self.load_json_view({'notice': 'Block deleted successfully'})
示例#6
0
    def delete_code(self, request):
        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        code = request.arg('code')
        if not code:
            raise nerve.ControllerError(
                "You must provide the 'code' argument.")

        irremote = nerve.get_object('/devices/irremote')
        irremote.delete_code(code)
        self.load_json_view({'notice': code + ' has been deleted'})
示例#7
0
 def create(self, name):
     for pname in Playlist.listnames():
         if name == pname:
             raise nerve.ControllerError(
                 "A playlist by that name already exists")
     Playlist.create(name)
     return true
示例#8
0
    def remove_remote(self, request):
        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        remote_name = request.arg('remote_name')
        if not remote_name:
            raise nerve.ControllerError(
                "You must provide the 'remote_name' argument.")

        irremote = nerve.get_object('/devices/irremote')
        irremote.remove_remote(remote_name)
        self.load_json_view({
            'notice': "Remote " + remote_name + " has been removed.",
            'remote_name': remote_name
        })
示例#9
0
    def send_code(self, request):
        code = request.arg('code')
        if not code:
            raise nerve.ControllerError("You must provide an IR code")

        #irremote = nerve.get_object('/devices/irremote')
        nerve.query('/devices/rgb/ir', code)
        self.load_json_view({'notice': "Code sent."})
示例#10
0
    def saveblock(self, request):
        originalname = request.arg('originalname')
        blockname = request.arg('blockname')
        blocktext = request.arg('blocktext')

        if not blockname:
            raise nerve.ControllerError(
                'You must provide a name for this block')
        if originalname and not self.model.block_exists(originalname):
            raise nerve.ControllerError(
                'Attempting to save non-existent block: ' + originalname)
        if not originalname and self.model.block_exists(blockname):
            raise nerve.ControllerError(
                'A block by that name already exists: ' + blockname)

        self.model.save_block(originalname, blockname, blocktext)
        self.load_json_view({'notice': 'Block saved successfully'})
示例#11
0
    def clear(self, request):
        if not request.arg('nids[]'):
            raise nerve.ControllerError("'nids[]' field must be set")

        notify = nerve.get_object(self.get_setting('device'))
        for nid in request.arg('nids[]'):
            notify.clear(int(nid))
        self.load_json_view(True)
示例#12
0
    def create_playlist(self, request):
        playlists = nerve.get_object(self.get_setting('playlists'))
        playlist_name = request.args['playlist']
        for name in playlists.list():
            if name == playlist_name:
                raise nerve.ControllerError("A playlist by that name already exists")

        playlist = nerve.medialib.Playlist.create(playlist_name)
        self.load_json_view({ 'notice' : "Playlist created successfully" })
示例#13
0
    def savepage(self, request):
        originalname = request.arg('originalname')
        pagename = request.arg('pagename')

        if not pagename:
            raise nerve.ControllerError(
                'You must provide a name for this page')
        if originalname and not self.model.page_exists(originalname):
            raise nerve.ControllerError(
                'Attempting to save non-existent page: ' + originalname)
        if originalname != pagename and self.model.page_exists(pagename):
            raise nerve.ControllerError(
                'A page by that name already exists: ' + pagename)

        pagedata = PageView.get_config_info().validate(request.args)

        self.model.save_page_data(originalname, pagename, pagedata)
        self.load_json_view({'notice': 'Page saved successfully'})
示例#14
0
    def delete(self, request):
        nerve.users.require_group('admin')

        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        objectname = request.args['objectname']
        if not objectname or not nerve.has_object(objectname):
            raise nerve.ControllerError(
                "The object you've specified doesn't exist.")

        result = nerve.del_object(objectname)
        if not result:
            raise nerve.ControllerError("Unable to delete object.")

        nerve.save_config()
        self.load_json_view({'notice': "Object deleted"})
示例#15
0
 def index(self, request):
     if request.reqtype == 'CONNECT':
         self.handle_connection(request)
     elif request.reqtype == 'QUERY':
         self.load_plaintext_view('')
         for query_string in request.args['requests[]']:
             self.run_command(query_string)
     else:
         raise nerve.ControllerError("unexpected request type; received " + request.reqtype)
示例#16
0
    def save_action(self, request):
        nerve.users.require_group('admin')

        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        code = request.get_slug()
        if not code:
            raise nerve.ControllerError("You must provide a valid object name")

        irremote = nerve.get_object('/devices/irremote')
        defaults = nerve.ObjectNode.get_class_config_info(
            'asyncs/PyCodeAsyncTask')
        config = defaults.validate(request.args)
        config['__type__'] = 'asyncs/PyCodeAsyncTask'
        irremote.set_action(code, config)
        self.load_json_view({'notice': "Action added"})
示例#17
0
    def editblock(self, request):
        data = {}
        data['blockname'] = request.next_segment(default='')

        if request.segments_left() > 0:
            raise nerve.ControllerError("Too many path segments given")
        if data['blockname'] and not self.model.block_exists(
                data['blockname']):
            raise nerve.ControllerError("Block doesn't exist: " +
                                        data['blockname'])

        data['blocktext'] = self.model.get_block(
            data['blockname']) if data['blockname'] else ''

        self.load_template_view(
            'nerve/pages/views/editor/editblock.blk.pyhtml', data, request)
        #self.template_add_to_section('sidebar', self.make_html_view('nerve/pages/views/editor/sidebar.blk.pyhtml', data))
        self.template_add_to_section('jsfiles', '/pages/assets/js/pages.js')
        self.template_add_to_section('cssfiles', '/pages/assets/css/pages.css')
示例#18
0
    def add_remote(self, request):
        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        remote_name = request.arg('remote_name')
        if not remote_name:
            raise nerve.ControllerError(
                "You must provide the 'remote_name' argument.")

        irremote = nerve.get_object('/devices/irremote')
        if irremote.add_remote(remote_name):
            self.load_json_view({
                'notice': "Remote " + remote_name + " has been added.",
                'remote_name': remote_name
            })
        else:
            self.load_json_view(
                {'error': "A remote by that name already exists."})
示例#19
0
    def save(self, request):
        nerve.users.require_group('admin')

        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        path = request.get_slug()
        if not path:
            raise nerve.ControllerError("You must provide a valid object name")

        print(path)
        print(request.args)

        obj = nerve.get_object(path)
        config = obj.get_config_info().validate(request.args)
        obj.update_config_data(config)

        nerve.save_config()
        self.load_json_view({'notice': "Saved successfully"})
示例#20
0
    def dialog(self, request):
        #nerve.users.require_group('admin')

        (slug, _, idnum) = request.get_slug().partition('/')
        if idnum != '':
            try:
                idnum = int(idnum)
            except:
                raise nerve.ControllerError("invalid id in request: " +
                                            str(idnum))

            if slug not in [
                    'edituser', 'editgroup', 'deleteuser', 'deletegroup'
            ]:
                raise nerve.ControllerError("invalid operation in request: " +
                                            str(slug))

        data = {}
        data['idnum'] = idnum
        self.load_html_view(
            'nerve/base/views/users/{0}.blk.pyhtml'.format(slug), data)
示例#21
0
    def create(self, request):
        nerve.users.require_group('admin')

        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        path = request.get_slug()
        if not path:
            raise nerve.ControllerError("You must provide a valid object name")
        (dirname, _, name) = path.rpartition('/')
        typeinfo = request.arg('__type__')

        if not dirname or not nerve.has_object(dirname):
            raise nerve.ControllerError(
                "The directory you've specified is invalid.")
        if not name:
            raise nerve.ControllerError("You must provide a valid name.")
        if nerve.has_object(dirname + '/' + name):
            raise nerve.ControllerError(
                "An object of that name already exists.")
        if not typeinfo:
            raise nerve.ControllerError("You must select a type.")

        defaults = nerve.ObjectNode.get_class_config_info(typeinfo)
        config = defaults.validate(request.args)

        obj = nerve.ObjectNode.make_object(typeinfo, config)
        nerve.set_object(dirname + '/' + name, obj)
        nerve.save_config()
        self.load_json_view({'notice': "Object created"})
示例#22
0
    def edit(self, request):
        nerve.users.require_group('admin')

        path = request.get_slug()
        if not path:
            raise nerve.ControllerError("You must provide a valid object name")

        obj = nerve.get_object(path)
        if not obj:
            raise nerve.ControllerError("Object not found: " + path)

        form = FormView(obj.get_config_info(),
                        obj.get_config_data(),
                        '/config/save/' + path,
                        submitback=True)

        if request.arg('dialog'):
            self.set_view(form)
        else:
            self.load_template_view(None, None, request)
            self.template_add_to_section('jsfiles', '/assets/js/formview.js')
            self.template_add_to_section('content', form)
示例#23
0
    def modify_tags(self, request):
        medialib = nerve.get_object(self.get_setting('device'))

        if not request.arg('media[]'):
            raise nerve.ControllerError("'media[]' field must be set")

        if not request.arg('tags'):
            raise nerve.ControllerError("'tags' field must be set")
        tags = nerve.medialib.MediaLibDevice.split_tags(request.arg('tags'))

        media = medialib.get_media_queries(request.arg('media[]'))

        for media_item in media:
            for tag in tags:
                if tag[0] != '!':
                    medialib.add_tag(media_item['id'], tag)
                else:
                    medialib.remove_tag(media_item['id'], tag[1:])

        if len(media) > 0:
            self.load_json_view({ 'notice': str(len(media)) + " track(s) tags modified" })
        else:
            self.load_json_view({ 'error': "No tags were modified" })
示例#24
0
    def save_names(self, request):
        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        codelist = request.arg('codelist')
        if not codelist:
            raise nerve.ControllerError(
                "You must provide the 'codelist' argument.")

        errors = []
        irremote = nerve.get_object('/devices/irremote')
        for (code, remote_name, button_name) in codelist:
            if code:
                result = irremote.set_button_name(code, remote_name,
                                                  button_name)
                if result:
                    errors.append("Button name " + remote_name + ":" +
                                  button_name +
                                  " is already assigned to code " + result)
        if len(errors) > 0:
            self.load_json_view({'error': '<br/>\n'.join(errors)})
        else:
            self.load_json_view({'notice': 'Changes have been saved'})
示例#25
0
    def get_recent_codes(self, request):
        irremote = nerve.get_object('/devices/irremote')

        try:
            last_update = float(request.args['last_update'])
        except:
            raise nerve.ControllerError(
                "You must provide the 'last_update' argument as a float."
            ) from None

        data = {}
        data['remotelist'] = irremote.get_remote_names()
        data['codelist'] = irremote.get_recent_codes(last_update, wait=60)

        self.load_html_view('nerve/irremote/views/coderows.blk.pyhtml', data)
示例#26
0
    def add(self, request):
        nerve.users.require_group('admin')

        path = request.get_slug()
        if not path:
            raise nerve.ControllerError("You must provide a valid object name")

        #self.set_view(FormView(nerve.types.ConfigType.get_type('object'), { '__type__': request.arg('type') }))

        form = FormView(nerve.types.ConfigType.get_type('object'),
                        None,
                        '/config/create/' + path + '/new',
                        submitname="Create",
                        submitback=True)

        if request.arg('dialog'):
            self.set_view(form)
        else:
            self.load_template_view(None, None, request)
            self.template_add_to_section('jsfiles', '/assets/js/formview.js')
            self.template_add_to_section('content', form)
示例#27
0
    def edit_action(self, request):
        code = request.get_slug()
        if not code:
            raise nerve.ControllerError("You must provide a IR code")

        path = '/devices/irremote/' + code
        try:
            obj = nerve.get_object(path)
        except AttributeError:
            obj = nerve.ObjectNode.make_object("asyncs/PyCodeAsyncTask", {})

        #self.set_view(nerve.base.FormView(obj.get_config_info(), obj.get_config_data(), '/config/save' + path, submitback=True))
        #self.load_template_view(None, None, request)
        #self.template_add_to_section('jsfiles', '/assets/js/formview.js')
        #self.template_add_to_section('content', nerve.base.FormView(obj.get_config_info(), obj.get_config_data(), '/irremote/save_action/' + code, submitback=True))
        self.set_view(
            nerve.base.FormView(
                obj.get_config_info(),
                obj.get_config_data(),
                '/irremote/save_action/' + code,
                textbefore="<h5>Event for {0}</h5>".format(code)))
示例#28
0
    def login(self, request):
        redirect = request.arg('redirect', '')
        if redirect and (redirect[0] != '/' or '/..' in redirect):
            redirect = ''

        if request.reqtype == "GET":
            data = {'redirect': redirect}
            self.load_template_view('nerve/base/views/users/login.blk.pyhtml',
                                    data)
            return

        if request.reqtype != "POST":
            raise nerve.ControllerError("Unexpected request type: " +
                                        request.reqtype)

        try:
            with nerve.users.login(request.arg('username'),
                                   request.arg('password')):
                # TODO this should store a randomized token instead
                self.session['username'] = nerve.users.thread_owner()
                self.redirect_to(redirect if redirect else '/home')
        except nerve.users.UserLoginError:
            self.load_json_view({'notice': "Invalid username or password"})
示例#29
0
    def editpage(self, request):
        data = {}
        data['pagename'] = request.next_segment(default='')

        if request.segments_left() > 0:
            raise nerve.ControllerError("Too many path segments given")
        if data['pagename'] and not self.model.page_exists(data['pagename']):
            raise nerve.NotFoundError("Page doesn't exist: " +
                                      data['pagename'])

        data['sections'] = PageView.get_config_info()
        data['pagedata'] = self.model.get_page_data(
            data['pagename']) if data['pagename'] else None

        data['sections'].add_setting('originalname',
                                     "",
                                     default=data['pagename'],
                                     datatype='hidden',
                                     weight=-11)
        data['sections'].add_setting('pagename',
                                     "Page Name",
                                     default=data['pagename'],
                                     weight=-10)

        #self.load_template_view('nerve/pages/views/editor/editpage.blk.pyhtml', data, request)
        self.load_template_view(None, data, request)
        #self.template_add_to_section('sidebar', self.make_html_view('nerve/pages/views/editor/sidebar.blk.pyhtml', data))
        self.template_add_to_section(
            'content',
            nerve.base.FormView(data['sections'],
                                data['pagedata'],
                                formid='page-editor',
                                action='/pages/savepage',
                                title="Edit Page"))
        self.template_add_to_section('jsfiles', '/assets/js/formview.js')
        self.template_add_to_section('jsfiles', '/pages/assets/js/pages.js')
        self.template_add_to_section('cssfiles', '/pages/assets/css/pages.css')
示例#30
0
 def connect(self, request):
     if request.reqtype != 'CONNECT':
         raise nerve.ControllerError(
             "expected CONNECT request type; received " + request.reqtype)
     self.handle_connection(request)