def _set_defaults(self): """ Set any default values for widgets. Also load settings from the existing campaign if one was specified. """ calendar = self.gobjects['calendar_campaign_expiration'] default_day = datetime.datetime.today() + datetime.timedelta(days=31) gui_utilities.gtk_calendar_set_pydate(calendar, default_day) if self.is_new_campaign: return campaign = self.application.get_graphql_campaign() # set entries self.gobjects['entry_campaign_name'].set_text(campaign['name']) self.gobjects['entry_validation_regex_username'].set_text( campaign['credentialRegexUsername'] or '') self.gobjects['entry_validation_regex_password'].set_text( campaign['credentialRegexPassword'] or '') self.gobjects['entry_validation_regex_mfa_token'].set_text( campaign['credentialRegexMfaToken'] or '') if campaign['description'] is not None: self.gobjects['entry_campaign_description'].set_text( campaign['description']) if campaign['campaignType'] is not None: combobox = self.gobjects['combobox_campaign_type'] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search( model, campaign['campaignType']['id'], column=0) if model_iter is not None: combobox.set_active_iter(model_iter) self.gobjects['checkbutton_alert_subscribe'].set_property( 'active', self.application.rpc('campaign/alerts/is_subscribed', self.campaign_id)) self.gobjects['checkbutton_reject_after_credentials'].set_property( 'active', bool(campaign['maxCredentials'])) if campaign['company'] is not None: self.gobjects['radiobutton_company_existing'].set_active(True) combobox = self.gobjects['combobox_company_existing'] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search( model, campaign['company']['id'], column=0) if model_iter is not None: combobox.set_active_iter(model_iter) if campaign['expiration'] is not None: expiration = utilities.datetime_utc_to_local( campaign['expiration']) self.gobjects['checkbutton_expire_campaign'].set_active(True) self._expiration_time.time = expiration.time() gui_utilities.gtk_calendar_set_pydate( self.gobjects['calendar_campaign_expiration'], expiration.date())
def change_cwd(self, new_dir): """ Changes current working directory to given parameter. :param str new_dir: The directory to change the CWD to. :return: The absolute path of the new working directory if it was changed. :rtype: str """ if not self.path_mod.isabs(new_dir): new_dir = self.get_abspath(new_dir) if new_dir == self.cwd: return logger.debug("{} is trying to change current working directory to {}".format(self.location, new_dir)) try: self._chdir(new_dir) except OSError: logger.warning("user does not have permissions to read {}".format(new_dir)) gui_utilities.show_dialog_error( 'Plugin Error', self.application.get_active_window(), "You do not have permissions to access {}.".format(new_dir) ) return self._tv_model.clear() try: self.load_dirs(new_dir) except OSError: logger.warning("user does not have permissions to read {}".format(new_dir)) if self.cwd: self.load_dirs(self.cwd) gui_utilities.show_dialog_error( 'Plugin Error', self.application.get_active_window(), "You do not have permissions to access {}.".format(new_dir) ) else: logger.warning(self.location + " has no current working directory, using the root directory") self.default_directory = self.root_directory self.change_cwd(self.default_directory) return self.cwd = new_dir # clear and rebuild the model self._wdcb_model.clear() self._wdcb_model.append((self.root_directory,)) if self.default_directory != self.root_directory: self._wdcb_model.append((self.default_directory,)) if new_dir not in self.wd_history and gui_utilities.gtk_list_store_search(self._wdcb_model, new_dir) is None: self.wd_history.appendleft(new_dir) for directory in self.wd_history: self._wdcb_model.append((directory,)) active_iter = gui_utilities.gtk_list_store_search(self._wdcb_model, new_dir) self.wdcb_dropdown.set_active_iter(active_iter) return new_dir
def _set_defaults(self): """ Set any default values for widgets. Also load settings from the existing campaign if one was specified. """ calendar = self.gobjects['calendar_campaign_expiration'] default_day = datetime.datetime.today() + datetime.timedelta(days=31) gui_utilities.gtk_calendar_set_pydate(calendar, default_day) if self.campaign_id is None: return campaign = self.application.rpc.remote_table_row('campaigns', self.campaign_id, cache=True, refresh=True) self.gobjects['entry_campaign_name'].set_text(campaign.name) if campaign.description is not None: self.gobjects['entry_campaign_description'].set_text( campaign.description) if campaign.campaign_type_id is not None: combobox = self.gobjects['combobox_campaign_type'] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search( model, campaign.campaign_type_id, column=0) if model_iter is not None: combobox.set_active_iter(model_iter) self.gobjects['checkbutton_alert_subscribe'].set_property( 'active', self.application.rpc('campaign/alerts/is_subscribed', self.campaign_id)) self.gobjects['checkbutton_reject_after_credentials'].set_property( 'active', campaign.reject_after_credentials) if campaign.company_id is not None: self.gobjects['radiobutton_company_existing'].set_active(True) combobox = self.gobjects['combobox_company_existing'] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search( model, campaign.company_id, column=0) if model_iter is not None: combobox.set_active_iter(model_iter) if campaign.expiration is not None: expiration = utilities.datetime_utc_to_local(campaign.expiration) self.gobjects['checkbutton_expire_campaign'].set_active(True) gui_utilities.gtk_calendar_set_pydate( self.gobjects['calendar_campaign_expiration'], expiration) self.gobjects['spinbutton_campaign_expiration_hour'].set_value( expiration.hour) self.gobjects['spinbutton_campaign_expiration_minute'].set_value( expiration.minute)
def test_gtk_list_store_search(self): store = make_test_list_store() result = gui_utilities.gtk_list_store_search(store, 'row0 col0', 0) self.assertIsInstance(result, Gtk.TreeIter) self.assertEqual(store.get_path(result).to_string(), '0') result = gui_utilities.gtk_list_store_search(store, 'row1 col1', 1) self.assertIsInstance(result, Gtk.TreeIter) self.assertEqual(store.get_path(result).to_string(), '1') result = gui_utilities.gtk_list_store_search(store, 'fake', 0) self.assertIsNone(result)
def signal_server_event_db(self, _, event_type, rows): get_node = lambda id: self.rpc.graphql(self.node_query, {'id': str(id)})['db']['node'] for row in rows: if str(row.campaign_id) != self.config['campaign_id']: continue model = self.gobjects['treeview_campaign'].get_model() for case in utilities.switch(event_type): if case('inserted'): row_data = self.format_node_data(get_node(row.id)) row_data = list(map(self.format_cell_data, row_data)) row_data.insert(0, str(row.id)) gui_utilities.glib_idle_add_wait(model.append, row_data) ti = gui_utilities.gtk_list_store_search(model, str(row.id)) if ti is None: self.logger.warning( "received server db event: {0} for non-existent row {1}:{2}" .format(event_type, self.table_name, str(row.id))) break if case('deleted'): model.remove(ti) break if case('updated'): row_data = self.format_node_data(get_node(row.id)) for idx, cell_data in enumerate(row_data, 1): model[ti][idx] = self.format_cell_data(cell_data) break
def _get_company_new_id(self): name = self.gobjects['entry_company_name'].get_text() name = name.strip() # check if this company name already exists in the model model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, name, column=1) if model_iter is not None: return model.get_value(model_iter, 0) # check if this company name already exists remotely remote_company = self._get_graphql_company(name) if remote_company: return remote_company['id'] company_id = self.application.rpc( 'db/table/insert', 'companies', ('name', 'description', 'industry_id', 'url_main', 'url_email', 'url_remote_access'), ( name, self.get_entry_value('company_description'), self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries'), self.get_entry_value('company_url_main'), self.get_entry_value('company_url_email'), self.get_entry_value('company_url_remote_access') ) ) self.gobjects['radiobutton_company_existing'].set_active(True) return company_id
def _get_company_info(self, company_id): company = self.application.rpc.graphql( """\ query getCompany($id: String!) { db { company(id: $id) { id description name industryId urlMain urlEmail urlRemoteAccess } } }""", {'id': company_id})['db']['company'] combobox = self.gobjects['combobox_company_industry'] if company['industryId'] is None: combobox.set_active_iter(None) combobox.get_child().set_text('') else: combobox.set_active_iter( gui_utilities.gtk_list_store_search(combobox.get_model(), company['industryId'])) self.gobjects['entry_company_name'].set_text(company['name']) self.gobjects['entry_company_description'].set_text( company['description'] or '') self.gobjects['entry_company_url_main'].set_text(company['urlMain'] or '') self.gobjects['entry_company_url_email'].set_text(company['urlEmail'] or '') self.gobjects['entry_company_url_remote_access'].set_text( company['urlRemoteAccess'] or '')
def _get_company_new_id(self): name = self.gobjects['entry_company_new_name'].get_text() name = name.strip() # check if this company name already exists in the model model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, name, column=1) if model_iter is not None: return model.get_value(model_iter, 0) # check if this company name already exists remotely remote_companies = list( self.application.rpc.remote_table('companies', query_filter={'name': name})) if len(remote_companies): return remote_companies[0].id description = self.gobjects['entry_company_new_description'].get_text() description = description.strip() if description == '': description = None industry_id = self._get_tag_from_combobox( self.gobjects['combobox_company_industry'], 'industries') company_id = self.application.rpc( 'db/table/insert', 'companies', ('name', 'description', 'industry_id'), (name, description, industry_id)) self.gobjects['radiobutton_company_existing'].set_active(True) return company_id
def __init__(self, *args, **kwargs): super(CompanyEditorDialog, self).__init__(*args, **kwargs) self._company_info_changed = False self._last_company_id = None self._set_comboboxes() self.gobjects['combobox_company_industry'].connect( 'changed', self.signal_editable_changed) self.gobjects['entry_company_industry'].connect( 'changed', self.signal_editable_changed) self.gobjects['entry_company_name'].connect( 'changed', self.signal_editable_changed) self.gobjects['entry_company_description'].connect( 'changed', self.signal_editable_changed) self.gobjects['entry_company_url_main'].connect( 'changed', self.signal_editable_changed) self.gobjects['entry_company_url_email'].connect( 'changed', self.signal_editable_changed) self.gobjects['entry_company_url_remote_access'].connect( 'changed', self.signal_editable_changed) campaign = self.application.rpc.graphql_find_file( 'get_campaign.graphql', id=self.config['campaign_id'])['db']['campaign'] if campaign['company'] is not None: combobox = self.gobjects['combobox_company_existing'] combobox.set_active_iter( gui_utilities.gtk_list_store_search( combobox.get_model(), str(campaign['company']['id']))) self._get_company_info(campaign['company']['id'])
def _get_company_new_id(self): name = self.gobjects['entry_company_name'].get_text() name = name.strip() # check if this company name already exists in the model model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, name, column=1) if model_iter is not None: return model.get_value(model_iter, 0) # check if this company name already exists remotely remote_companies = list(self.application.rpc.remote_table('companies', query_filter={'name': name})) if len(remote_companies): return remote_companies[0].id company_id = self.application.rpc( 'db/table/insert', 'companies', ('name', 'description', 'industry_id', 'url_main', 'url_email', 'url_remote_access'), ( name, self.get_entry_value('company_description'), self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries'), self.get_entry_value('company_url_main'), self.get_entry_value('company_url_email'), self.get_entry_value('company_url_remote_access') ) ) self.gobjects['radiobutton_company_existing'].set_active(True) return company_id
def _get_company_info(self, company_id): company = self.application.rpc.graphql("""\ query getCompany($id: String!) { db { company(id: $id) { id description name industryId urlMain urlEmail urlRemoteAccess } } }""", {'id': company_id})['db']['company'] combobox = self.gobjects['combobox_company_industry'] if company['industryId'] is None: combobox.set_active_iter(None) combobox.get_child().set_text('') else: combobox.set_active_iter(gui_utilities.gtk_list_store_search(combobox.get_model(), company['industryId'])) self.gobjects['entry_company_name'].set_text(company['name']) self.gobjects['entry_company_description'].set_text(company['description'] or '') self.gobjects['entry_company_url_main'].set_text(company['urlMain'] or '') self.gobjects['entry_company_url_email'].set_text(company['urlEmail'] or '') self.gobjects['entry_company_url_remote_access'].set_text(company['urlRemoteAccess'] or '')
def signal_server_event_db(self, _, event_type, rows): for row in rows: if str(row.campaign_id) != self.config['campaign_id']: continue if event_type == 'deleted': ti = gui_utilities.gtk_list_store_search( self._tv_model, str(row.id)) if ti is None: self.logger.warning( "received server db event: deleted for non-existent row {0}:{1}" .format(self.table_name, str(row.id))) else: gui_utilities.glib_idle_add_wait(self._tv_model.remove, ti) elif event_type == 'inserted': self.rpc.async_graphql( self.node_query, query_vars={'id': str(row.id)}, on_success=self.__async_rpc_cb_server_event_db_inserted, when_idle=True) elif event_type == 'updated': self.rpc.async_graphql( self.node_query, query_vars={'id': str(row.id)}, on_success=self.__async_rpc_cb_server_event_db_updated, when_idle=True)
def _highlight_campaign(self, campaign_name): treeview = self.gobjects['treeview_campaigns'] model = treeview.get_model() model_iter = gui_utilities.gtk_list_store_search(model, campaign_name, column=_ModelNamedRow._fields.index('name')) if model_iter: treeview.set_cursor(model.get_path(model_iter), None, False) return True return False
def _highlight_campaign(self, campaign_name): treeview = self.gobjects['treeview_campaigns'] model = treeview.get_model() model_iter = gui_utilities.gtk_list_store_search(model, campaign_name, column=1) if model_iter: treeview.set_cursor(model.get_path(model_iter), None, False) return True return False
def _set_defaults(self): """ Set any default values for widgets. Also load settings from the existing campaign if one was specified. """ calendar = self.gobjects['calendar_campaign_expiration'] default_day = datetime.datetime.today() + datetime.timedelta(days=31) gui_utilities.gtk_calendar_set_pydate(calendar, default_day) if self.campaign_id is None: return campaign = self.application.get_graphql_campaign() # set entries self.gobjects['entry_campaign_name'].set_text(campaign['name']) self.gobjects['entry_validation_regex_username'].set_text(campaign['credentialRegexUsername'] or '') self.gobjects['entry_validation_regex_password'].set_text(campaign['credentialRegexPassword'] or '') self.gobjects['entry_validation_regex_mfa_token'].set_text(campaign['credentialRegexMfaToken'] or '') if campaign['description'] is not None: self.gobjects['entry_campaign_description'].set_text(campaign['description']) if campaign['campaignType'] is not None: combobox = self.gobjects['combobox_campaign_type'] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search(model, campaign['campaignType']['id'], column=0) if model_iter is not None: combobox.set_active_iter(model_iter) self.gobjects['checkbutton_alert_subscribe'].set_property('active', self.application.rpc('campaign/alerts/is_subscribed', self.campaign_id)) self.gobjects['checkbutton_reject_after_credentials'].set_property('active', bool(campaign['maxCredentials'])) if campaign['company'] is not None: self.gobjects['radiobutton_company_existing'].set_active(True) combobox = self.gobjects['combobox_company_existing'] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search(model, campaign['company']['id'], column=0) if model_iter is not None: combobox.set_active_iter(model_iter) if campaign['expiration'] is not None: expiration = utilities.datetime_utc_to_local(campaign['expiration']) self.gobjects['checkbutton_expire_campaign'].set_active(True) self._expiration_time.time = expiration.time() gui_utilities.gtk_calendar_set_pydate(self.gobjects['calendar_campaign_expiration'], expiration.date())
def _set_defaults(self): """ Set any default values for widgets. Also load settings from the existing campaign if one was specified. """ calendar = self.gobjects["calendar_campaign_expiration"] default_day = datetime.datetime.today() + datetime.timedelta(days=31) gui_utilities.gtk_calendar_set_pydate(calendar, default_day) if self.campaign_id is None: return campaign = self.application.rpc.remote_table_row("campaigns", self.campaign_id, cache=True, refresh=True) self.gobjects["entry_campaign_name"].set_text(campaign.name) if campaign.description is not None: self.gobjects["entry_campaign_description"].set_text(campaign.description) if campaign.campaign_type_id is not None: combobox = self.gobjects["combobox_campaign_type"] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search(model, campaign.campaign_type_id, column=0) if model_iter is not None: combobox.set_active_iter(model_iter) self.gobjects["checkbutton_alert_subscribe"].set_property( "active", self.application.rpc("campaign/alerts/is_subscribed", self.campaign_id) ) self.gobjects["checkbutton_reject_after_credentials"].set_property("active", campaign.reject_after_credentials) if campaign.company_id is not None: self.gobjects["radiobutton_company_existing"].set_active(True) combobox = self.gobjects["combobox_company_existing"] model = combobox.get_model() model_iter = gui_utilities.gtk_list_store_search(model, campaign.company_id, column=0) if model_iter is not None: combobox.set_active_iter(model_iter) if campaign.expiration is not None: expiration = utilities.datetime_utc_to_local(campaign.expiration) self.gobjects["checkbutton_expire_campaign"].set_active(True) gui_utilities.gtk_calendar_set_pydate(self.gobjects["calendar_campaign_expiration"], expiration) self.gobjects["spinbutton_campaign_expiration_hour"].set_value(expiration.hour) self.gobjects["spinbutton_campaign_expiration_minute"].set_value(expiration.minute)
def signal_assistant_prepare(self, _, page): page_title = self.assistant.get_page_title(page) if page_title == 'Company': combobox = self.gobjects['combobox_company_existing'] model = combobox.get_model() company_name = self.gobjects['entry_company_new_name'].get_text() if company_name: model_iter = gui_utilities.gtk_list_store_search(model, company_name, column=1) if model_iter is not None: combobox.set_active_iter(model_iter) self.gobjects['radiobutton_company_existing'].set_active(True)
def signal_assistant_prepare(self, _, page): page_title = self.assistant.get_page_title(page) if page_title == 'Company': combobox = self.gobjects['combobox_company_existing'] model = combobox.get_model() company_name = self.get_entry_value('company_name') if company_name: model_iter = gui_utilities.gtk_list_store_search(model, company_name, column=1) if model_iter is not None: combobox.set_active_iter(model_iter) self.gobjects['radiobutton_company_existing'].set_active(True)
def _get_tag_from_combobox(self, combobox, db_table): model = combobox.get_model() model_iter = combobox.get_active_iter() if model_iter is None: campaign_type = combobox.get_child().get_text() if not campaign_type: return model_iter = gui_utilities.gtk_list_store_search(model, campaign_type, column=1) if model_iter is None: return self.application.rpc('db/table/insert', db_table, 'name', campaign_type) return model.get_value(model_iter, 0)
def _configure_settings_dashboard(self): if not graphs.has_matplotlib: self.gtk_builder_get('frame_dashboard').set_sensitive(False) return graph_providers = Gtk.ListStore(str, str) for graph in graphs.get_graphs(): graph = graphs.get_graph(graph) graph_providers.append([graph.name_human, graph.name]) for dash_position in ['top_left', 'top_right', 'bottom']: combobox = self.gtk_builder_get('combobox_dashboard_' + dash_position) combobox.set_model(graph_providers) ti = gui_utilities.gtk_list_store_search(graph_providers, self.config.get('dashboard.' + dash_position), column=1) combobox.set_active_iter(ti)
def _get_company_info(self, company_id): company = self.application.rpc.remote_table_row('companies', company_id) combobox = self.gobjects['combobox_company_industry'] if company.industry_id is None: combobox.set_active_iter(None) combobox.get_child().set_text('') else: combobox.set_active_iter(gui_utilities.gtk_list_store_search(combobox.get_model(), company.industry_id)) self.gobjects['entry_company_name'].set_text(company.name) self.gobjects['entry_company_description'].set_text(company.description or '') self.gobjects['entry_company_url_main'].set_text(company.url_main or '') self.gobjects['entry_company_url_email'].set_text(company.url_email or '') self.gobjects['entry_company_url_remote_access'].set_text(company.url_remote_access or '')
def __async_rpc_cb_populate_url_scheme_combobox(self, addresses): addresses = sorted(addresses, key=lambda address: address['port']) combobox_url_scheme = self.gobjects['combobox_url_scheme'] model = combobox_url_scheme.get_model() for address in addresses: if address['ssl']: scheme_name = 'https' description = '' if address['port'] == 443 else 'port: ' + str( address['port']) else: scheme_name = 'http' description = '' if address['port'] == 80 else 'port: ' + str( address['port']) # use the scheme and port to make a row UID model.append( _ModelURLScheme(id=scheme_name + '/' + str(address['port']), name=scheme_name, description=description, port=address['port'])) if gui_utilities.gtk_list_store_search(model, 'https/443'): combobox_url_scheme.set_active_id('https/443') elif gui_utilities.gtk_list_store_search(model, 'http/80'): combobox_url_scheme.set_active_id('http/80')
def interact(self): self.dialog.show_all() self.set_status('Waiting') if not web_cloner.has_webkit2: gui_utilities.show_dialog_error('WebKit2GTK+ Is Unavailable', self.dialog, 'The WebKit2GTK+ package is not available.') self.dialog.destroy() return while self.dialog.run() == Gtk.ResponseType.APPLY: target_url = self.entry_target.get_text() if not target_url: gui_utilities.show_dialog_error('Missing Information', self.dialog, 'Please set the target URL.') self.set_status('Missing Information') continue dest_dir = self.entry_directory.get_text() if not dest_dir: gui_utilities.show_dialog_error('Missing Information', self.dialog, 'Please set the destination directory.') self.set_status('Missing Information') continue if not os.access(dest_dir, os.W_OK): gui_utilities.show_dialog_error('Invalid Directory', self.dialog, 'Can not write to the specified directory.') self.set_status('Invalid Directory') continue self.objects_save_to_config() self.set_status('Cloning', spinner_active=True) cloner = web_cloner.WebPageCloner(target_url, dest_dir) signal_id = self.button_cancel.connect('clicked', lambda _: cloner.stop_cloning()) original_label = self.button_cancel.get_label() self.button_cancel.set_label('Cancel') cloner.wait() self.button_cancel.set_label(original_label) self.button_cancel.disconnect(signal_id) if cloner.load_failed: self.set_status('Failed') gui_utilities.show_dialog_error('Operation Failed', self.dialog, 'The web page clone operation failed.') continue for resource in cloner.cloned_resources.values(): if gui_utilities.gtk_list_store_search(self.resources, resource.resource, column=0): continue self.resources.append(_ModelNamedRow( path=resource.resource, mime_type=resource.mime_type or 'N/A', size=resource.size )) self.set_status('Done') gui_utilities.gtk_sync() if len(self.resources) and gui_utilities.show_dialog_yes_no('Transfer Cloned Pages', self.dialog, 'Would you like to start the SFTP client\nto upload the cloned pages?'): self.application.emit('sftp-client-start') self.dialog.destroy()
def _get_company_existing_id(self): combobox = self.gobjects['combobox_company_existing'] model = combobox.get_model() model_iter = combobox.get_active_iter() if model is None: return if model_iter is None: text = combobox.get_child().get_text().strip() if text: model_iter = gui_utilities.gtk_list_store_search(model, text, column=1) if model_iter is None: return None return model.get_value(model_iter, 0)
def _set_company_info(self, company_id): company_name = self.get_entry_value('company_name') company_description = self.get_entry_value('company_description') self.application.rpc.remote_table_row_set('companies', company_id, { 'name': company_name, 'description': company_description, 'industry_id': self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries'), 'url_main': self.get_entry_value('company_url_main'), 'url_email': self.get_entry_value('company_url_email'), 'url_remote_access': self.get_entry_value('company_url_remote_access') }) model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, company_id) model[model_iter][1] = company_name model[model_iter][2] = company_description
def _set_company_info(self, company_id): campaign = self.application.rpc.remote_table_row('campaigns', self.config['campaign_id']) company = self.application.rpc.remote_table_row('companies', company_id) company.name = self.get_entry_value('company_name') company.description = self.get_entry_value('company_description') company.industry_id = self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries') company.url_main = self.get_entry_value('company_url_main') company.url_email = self.get_entry_value('company_url_email') company.url_remote_access = self.get_entry_value('company_url_remote_access') company.commit() model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, company_id) model[model_iter][1] = company.name model[model_iter][2] = company.description if campaign.company_id == company.id: self.application.emit('campaign-changed', campaign.id)
def __async_rpc_cb_server_event_db_updated(self, results): node = results['db']['node'] if node is None: self.logger.warning( 'received server db event: updated but could not fetch the remote data' ) return node_id = str(node['id']) ti = gui_utilities.gtk_list_store_search(self._tv_model, node_id) if ti is None: self.logger.warning( "received server db event: updated for non-existent row {0}:{1}" .format(self.table_name, node_id)) return row_data = tuple(self.format_node_data(node)) for idx, cell_data in enumerate(row_data, 1): self._tv_model[ti][idx] = cell_data
def __init__(self, *args, **kwargs): super(CompanyEditorDialog, self).__init__(*args, **kwargs) self._company_info_changed = False self._last_company_id = None self._set_comboboxes() self.gobjects['combobox_company_industry'].connect('changed', self.signal_editable_changed) self.gobjects['entry_company_industry'].connect('changed', self.signal_editable_changed) self.gobjects['entry_company_name'].connect('changed', self.signal_editable_changed) self.gobjects['entry_company_description'].connect('changed', self.signal_editable_changed) self.gobjects['entry_company_url_main'].connect('changed', self.signal_editable_changed) self.gobjects['entry_company_url_email'].connect('changed', self.signal_editable_changed) self.gobjects['entry_company_url_remote_access'].connect('changed', self.signal_editable_changed) campaign = self.application.rpc.graphql_find_file('get_campaign.graphql', id=self.config['campaign_id'])['db']['campaign'] if campaign['company'] is not None: combobox = self.gobjects['combobox_company_existing'] combobox.set_active_iter(gui_utilities.gtk_list_store_search(combobox.get_model(), str(campaign['company']['id']))) self._get_company_info(campaign['company']['id'])
def signal_combobox_changed_set_url_information(self, _): for label in ('info_title', 'info_authors', 'info_created', 'info_description'): self.gobjects['label_url_' + label].set_text('') hostname = gui_utilities.gtk_combobox_get_entry_text( self.gobjects['combobox_url_hostname']) if not hostname: return combobox_url_path = self.gobjects['combobox_url_path'] path = gui_utilities.gtk_combobox_get_active_cell(combobox_url_path, column=1) if path is None: model = combobox_url_path.get_model() text = utilities.make_webrelpath( gui_utilities.gtk_combobox_get_entry_text(combobox_url_path)) row_iter = gui_utilities.gtk_list_store_search(model, text) if row_iter: path = model[row_iter][1] gui_utilities.gtk_widget_destroy_children( self.gobjects['listbox_url_info_classifiers']) gui_utilities.gtk_widget_destroy_children( self.gobjects['listbox_url_info_references']) cached_result = self._cache_site_template.get((hostname, path)) if cached_result: self.__async_rpc_cb_populate_url_info(hostname, path, cached_result) return self.application.rpc.async_graphql( """ query getSiteTemplate($hostname: String, $path: String) { siteTemplate(hostname: $hostname, path: $path) { created path metadata { title authors description referenceUrls classifiers pages } } } """, query_vars={ 'hostname': hostname, 'path': path }, on_success=self.__async_rpc_cb_populate_url_info, cb_args=(hostname, path), when_idle=True)
def _set_company_info(self, company_id): campaign = self.application.rpc.remote_table_row( 'campaigns', self.config['campaign_id']) company = self.application.rpc.remote_table_row( 'companies', company_id) company.name = self.get_entry_value('company_name') company.description = self.get_entry_value('company_description') company.industry_id = self._get_tag_from_combobox( self.gobjects['combobox_company_industry'], 'industries') company.url_main = self.get_entry_value('company_url_main') company.url_email = self.get_entry_value('company_url_email') company.url_remote_access = self.get_entry_value( 'company_url_remote_access') company.commit() model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, company_id) model[model_iter][1] = company.name model[model_iter][2] = company.description if campaign.company_id == company.id: self.application.emit('campaign-changed', campaign.id)
def signal_server_event_db(self, _, event_type, rows): get_node = lambda id: self.rpc.graphql(self.node_query, {'id': str(id)})['db']['node'] for row in rows: if str(row.campaign_id) != self.config['campaign_id']: continue for case in utilities.switch(event_type): if case('inserted'): row_data = (str(row.id),) + tuple(self.format_node_data(get_node(row.id))) gui_utilities.glib_idle_add_wait(self._tv_model.append, row_data) ti = gui_utilities.gtk_list_store_search(self._tv_model, str(row.id)) if ti is None: self.logger.warning("received server db event: {0} for non-existent row {1}:{2}".format(event_type, self.table_name, str(row.id))) break if case('deleted'): self._tv_model.remove(ti) break if case('updated'): row_data = self.format_node_data(get_node(row.id)) for idx, cell_data in enumerate(row_data, 1): self._tv_model[ti][idx] = cell_data break
def _get_company_info(self, company_id): company = self.application.rpc.remote_table_row( 'companies', company_id) combobox = self.gobjects['combobox_company_industry'] if company.industry_id is None: combobox.set_active_iter(None) combobox.get_child().set_text('') else: combobox.set_active_iter( gui_utilities.gtk_list_store_search(combobox.get_model(), company.industry_id)) self.gobjects['entry_company_name'].set_text(company.name) self.gobjects['entry_company_description'].set_text(company.description or '') self.gobjects['entry_company_url_main'].set_text(company.url_main or '') self.gobjects['entry_company_url_email'].set_text(company.url_email or '') self.gobjects['entry_company_url_remote_access'].set_text( company.url_remote_access or '')
def _get_company_new_id(self): name = self.gobjects["entry_company_new_name"].get_text() name = name.strip() # check if this company name already exists in the model model = self.gobjects["combobox_company_existing"].get_model() model_iter = gui_utilities.gtk_list_store_search(model, name, column=1) if model_iter is not None: return model.get_value(model_iter, 0) # check if this company name already exists remotely remote_companies = list(self.application.rpc.remote_table("companies", query_filter={"name": name})) if len(remote_companies): return remote_companies[0].id description = self.gobjects["entry_company_new_description"].get_text() description = description.strip() if description == "": description = None industry_id = self._get_tag_from_combobox(self.gobjects["combobox_company_industry"], "industries") company_id = self.application.rpc( "db/table/insert", "companies", ("name", "description", "industry_id"), (name, description, industry_id) ) self.gobjects["radiobutton_company_existing"].set_active(True) return company_id
def _set_company_info(self, company_id): company_name = self.get_entry_value('company_name') company_description = self.get_entry_value('company_description') self.application.rpc.remote_table_row_set( 'companies', company_id, { 'name': company_name, 'description': company_description, 'industry_id': self._get_tag_from_combobox( self.gobjects['combobox_company_industry'], 'industries'), 'url_main': self.get_entry_value('company_url_main'), 'url_email': self.get_entry_value('company_url_email'), 'url_remote_access': self.get_entry_value('company_url_remote_access') }) model = self.gobjects['combobox_company_existing'].get_model() model_iter = gui_utilities.gtk_list_store_search(model, company_id) model[model_iter][1] = company_name model[model_iter][2] = company_description
def interact(self): self.dialog.show_all() self.set_status('Waiting') if not web_cloner.has_webkit2: gui_utilities.show_dialog_error( 'WebKit2GTK+ Is Unavailable', self.dialog, 'The WebKit2GTK+ package is not available.') self.dialog.destroy() return while self.dialog.run() == Gtk.ResponseType.APPLY: target_url = self.entry_target.get_text() if not target_url: gui_utilities.show_dialog_error('Missing Information', self.dialog, 'Please set the target URL.') self.set_status('Missing Information') continue dest_dir = self.entry_directory.get_text() if not dest_dir: gui_utilities.show_dialog_error( 'Missing Information', self.dialog, 'Please set the destination directory.') self.set_status('Missing Information') continue if not os.access(dest_dir, os.W_OK): gui_utilities.show_dialog_error( 'Invalid Directory', self.dialog, 'Can not write to the specified directory.') self.set_status('Invalid Directory') continue self.objects_save_to_config() self.set_status('Cloning', spinner_active=True) cloner = web_cloner.WebPageCloner(target_url, dest_dir) signal_id = self.button_cancel.connect( 'clicked', lambda _: cloner.stop_cloning()) original_label = self.button_cancel.get_label() self.button_cancel.set_label('Cancel') cloner.wait() self.button_cancel.set_label(original_label) self.button_cancel.disconnect(signal_id) if cloner.load_failed: self.set_status('Failed') gui_utilities.show_dialog_error( 'Operation Failed', self.dialog, 'The web page clone operation failed.') continue for resource in cloner.cloned_resources.values(): if gui_utilities.gtk_list_store_search(self.resources, resource.resource, column=0): continue self.resources.append( _ModelNamedRow(path=resource.resource, mime_type=resource.mime_type or 'N/A', size=resource.size)) self.set_status('Done') gui_utilities.gtk_sync() if len(self.resources) and gui_utilities.show_dialog_yes_no( 'Transfer Cloned Pages', self.dialog, 'Would you like to start the SFTP client\nto upload the cloned pages?' ): self.application.emit('sftp-client-start') self.dialog.destroy()
def change_cwd(self, new_dir): """ Changes current working directory to given parameter. :param str new_dir: The directory to change the CWD to. :return: The absolute path of the new working directory if it was changed. :rtype: str """ if not self.path_mod.isabs(new_dir): new_dir = self.get_abspath(new_dir) if new_dir == self.cwd: return logger.debug( "{} is trying to change current working directory to {}".format( self.location, new_dir)) try: self._chdir(new_dir) except OSError: logger.warning( "user does not have permissions to read {}".format(new_dir)) gui_utilities.show_dialog_error( 'Plugin Error', self.application.get_active_window(), "You do not have permissions to access {}.".format(new_dir)) return self._tv_model.clear() try: self.load_dirs(new_dir) except OSError: logger.warning( "user does not have permissions to read {}".format(new_dir)) if self.cwd: self.load_dirs(self.cwd) gui_utilities.show_dialog_error( 'Plugin Error', self.application.get_active_window(), "You do not have permissions to access {}.".format( new_dir)) else: logger.warning( self.location + " has no current working directory, using the root directory" ) self.default_directory = self.root_directory self.change_cwd(self.default_directory) return self.cwd = new_dir # clear and rebuild the model self._wdcb_model.clear() self._wdcb_model.append((self.root_directory, )) if self.default_directory != self.root_directory: self._wdcb_model.append((self.default_directory, )) if new_dir not in self.wd_history and gui_utilities.gtk_list_store_search( self._wdcb_model, new_dir) is None: self.wd_history.appendleft(new_dir) for directory in self.wd_history: self._wdcb_model.append((directory, )) active_iter = gui_utilities.gtk_list_store_search( self._wdcb_model, new_dir) self.wdcb_dropdown.set_active_iter(active_iter) return new_dir