def add(self, group_id=None): group_ids = [] if group_id: group_ids = [group_id] form = ResourceAddForm(group_ids=group_ids) form.group_ids.choices = [(g.id, g.label) for g in groups.list()] return render('resource/add.html', {'form': form })
def test_list(self): gs = groups.list() # Postgres is sorting case-insensitive here. This # probably is db-specific, so we may need a better assertion. gnames = [g.name for g in gs] print gnames print sorted(gnames, key=unicode.lower) self.assertEquals(sorted(gnames, key=unicode.lower), gnames)
def process_merge(self, **kwargs): form = MergeForm(request_params()) group_tuples = [(g.id, g.name) for g in groups.list()] form.from_group_id.choices = [(0, '[From Group]')] + group_tuples form.to_group_id.choices = [(0, '[To Group]')] + group_tuples if form.validate(): log.info("Passed validation, somehow.") (moved_resources, from_group, to_group) = groups.merge(form.from_group_id.data, form.to_group_id.data) for r in moved_resources: auditlog.log(auditlog.CODE_CONTENT_MOD, target=r, attributes_modified=['group_id']) auditlog.log(auditlog.CODE_CONTENT_DEL, target=from_group) raise cherrypy.HTTPRedirect('/group/view/{0}'.format(to_group.id)) else: return render("group/merge.html", {'form': form})
def process_add(self, **kwargs): form = ResourceAddForm(request_params()) form.group_ids.choices = [(g.id, g.label) for g in groups.list()] if form.validate(): resource = resources.create(name=form.name.data, group_ids=form.group_ids.data, addr=form.addr.data, description=form.description.data, notes=form.notes_decrypted.data, tags=form.tags.data) # XXX: process auditlog.log(auditlog.CODE_CONTENT_ADD, target=resource) notify_entity_activity(resource, 'created') raise cherrypy.HTTPRedirect('/resource/view/{0}'.format(resource.id)) else: return render('resource/add.html', {'form': form })
def export(self, group_id=None, **kwargs): form = ExportForm(request_params(), group_id=group_id) form.group_id.choices = [(g.id, g.name) for g in groups.list()] exporter_choices = [('yaml', 'YAML (GPG/PGP-encrypted)')] if config['export.keepass.enabled']: if not os.path.exists(config['export.keepass.exe_path']): log.error("KeePass export enabled, but specified converter script does not exist: {0}".format(config.get('export.keepass.exe_path'))) else: exporter_choices.append(('kdb', 'KeePass 1.x')) form.format.choices = exporter_choices if cherrypy.request.method == 'POST': if form.validate(): group = groups.get(form.group_id.data) if form.format.data == 'yaml': exporter = GpgYamlExporter(use_tags=False, passphrase=form.passphrase.data, resource_filters=[model.GroupResource.group_id==group.id]) # @UndefinedVariable encrypted_stream = BytesIO() exporter.export(stream=encrypted_stream) encrypted_stream.seek(0) # Just to ensure it's rewound return serve_fileobj(encrypted_stream, content_type='application/pgp-encrypted', disposition='attachment', name='group-{0}-export.pgp'.format(re.sub('[^\w\-\.]', '_', group.name))) elif form.format.data == 'kdb': exporter = KeepassExporter(passphrase=form.passphrase.data, resource_filters=[model.GroupResource.group_id==group.id]) # @UndefinedVariable encrypted_stream = BytesIO() exporter.export(stream=encrypted_stream) encrypted_stream.seek(0) # Just to ensure it's rewound return serve_fileobj(encrypted_stream, content_type='application/x-keepass-database', disposition='attachment', name='group-{0}-export.kdb'.format(re.sub('[^\w\-\.]', '_', group.name))) else: # I don't think we can get here in normal business. raise RuntimeError("Unhandled format specified: {0}".format(form.format.data)) else: # does not validate return render("group/export.html", {'form': form}) else: # request method is GET return render("group/export.html", {'form': form})
def process_edit(self, **kwargs): form = ResourceEditForm(request_params()) form.group_ids.choices = [(g.id, g.label) for g in groups.list()] if form.validate(): (resource, modified) = resources.modify(form.resource_id.data, name=form.name.data, addr=form.addr.data, group_ids=form.group_ids.data, notes=form.notes_decrypted.data, description=form.description.data, tags=form.tags.data) # XXX: process auditlog.log(auditlog.CODE_CONTENT_MOD, target=resource, attributes_modified=modified) notify_entity_activity(resource, 'updated') raise cherrypy.HTTPRedirect('/resource/view/{0}'.format(resource.id)) else: log.warning("Form validation failed.") log.warning(form.errors) return render('resource/edit.html', {'form': form})
def render(filename, data=None): """ Convenience method to render a template. """ from ensconce import acl if data is None: data = {} data['title_prefix'] = config.get('ui.title_prefix') data['operator_info'] = operator_info() env = Environment(loader=PackageLoader('ensconce', 'templates'), autoescape=True, finalize=lambda x: '' if x is None else x) env.globals['pop_notifications'] = pop_notifications # Expose the ACL module so that there can be some checking in the templates # (to avoid showing buttons that won't be clickable) env.globals['acl'] = acl try: env.globals['app_version'] = pkg_resources.get_distribution("ensconce").version except: log.exception("Error determining software version.") env.globals['app_version'] = '?.?' # Add an escape filter for when we need to embed values in JS code. env.filters['escapejs'] = escapejs if operator_info().user_id: # They are logged in, so add the quick-group-nav form. form = QuickGroupForm() # Do not initialize we/ request params, since that could be confusing. form.group_id.choices = [(0, '[Jump to Group]')] + [(g.id, g.name) for g in groups.list()] env.globals['quickgroupform'] = form return env.get_template(filename).render(data)
def list(self): return render('group/list.html', {'groups': groups.list()})
def merge(self, group_id=None): form = MergeForm(from_group_id=group_id) group_tuples = [(g.id, g.name) for g in groups.list()] form.from_group_id.choices = [(0, '[From Group]')] + group_tuples form.to_group_id.choices = [(0, '[To Group]')] + group_tuples return render("group/merge.html", {'form': form})
def listGroups(self): return [g.to_dict() for g in groups.list()]
def edit(self, resource_id): resource = resources.get(resource_id) log.debug("Resource matched: {0!r}".format(resource)) form = ResourceEditForm(request_params(), obj=resource, resource_id=resource_id, group_ids=[g.id for g in resource.groups]) form.group_ids.choices = [(g.id, g.label) for g in groups.list()] return render('resource/edit.html', {'form': form})