Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ui Feature: Global search #1832

Open
wants to merge 132 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
660faa7
working search field, no functionality
relativisticelectron Jul 10, 2022
89ddef2
working data structure
relativisticelectron Jul 10, 2022
44d4571
rough but working....
relativisticelectron Jul 10, 2022
9c64aa1
color reset works
relativisticelectron Jul 10, 2022
19dd23f
working solution for visibility based on url
relativisticelectron Jul 10, 2022
27245c7
extened to recieve
relativisticelectron Jul 10, 2022
5b300c6
partial address search
relativisticelectron Jul 10, 2022
13030a3
working tx search
relativisticelectron Jul 10, 2022
f1fcc61
working tx filter
relativisticelectron Jul 11, 2022
e49523f
bugfix
relativisticelectron Jul 11, 2022
fd06496
change and recieve sub highlighting works
relativisticelectron Jul 11, 2022
6699990
unsigned psbt search works
relativisticelectron Jul 11, 2022
263b3fd
changed to POST and device key search working
relativisticelectron Jul 11, 2022
487c249
fixed persistent color
relativisticelectron Jul 11, 2022
d5705f2
utxo search
relativisticelectron Jul 11, 2022
56bd036
lower case comparision and better keys highlighting
relativisticelectron Jul 11, 2022
c4ac959
corrected tx list call
relativisticelectron Jul 11, 2022
f051ab0
styling
relativisticelectron Jul 11, 2022
4cdc69e
styling
relativisticelectron Jul 11, 2022
176f81b
added search for wallet names
relativisticelectron Jul 11, 2022
893091f
better styling
relativisticelectron Jul 11, 2022
6458fcc
fix for strip
relativisticelectron Jul 11, 2022
3367005
working search delay to avoid lagging while rappidly typing
relativisticelectron Jul 11, 2022
391a5cf
doc
relativisticelectron Jul 11, 2022
52b121b
pytest fix
relativisticelectron Jul 12, 2022
5a72501
moved search bar to sidebar
relativisticelectron Jul 12, 2022
387f8e1
fix
relativisticelectron Jul 12, 2022
2017ffc
bugfix
relativisticelectron Jul 12, 2022
663e47a
title added
relativisticelectron Jul 12, 2022
4efe607
Merge remote-tracking branch 'cryptoadvance/master' into 20220710_search
relativisticelectron Jul 14, 2022
c903da4
moved robust_json_dumps
relativisticelectron Jul 15, 2022
f1c763a
Merge remote-tracking branch 'cryptoadvance/master' into 20220710_search
relativisticelectron Jul 15, 2022
284fd74
Merge branch 'master' into 20220710_search
relativisticelectron Aug 1, 2022
55d1378
added notes for dropdown
relativisticelectron Aug 1, 2022
008baab
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Aug 2, 2022
ca44d2e
working template and class
relativisticelectron Aug 2, 2022
9792e7a
better
relativisticelectron Aug 2, 2022
b2c2a0d
add title
relativisticelectron Aug 2, 2022
c5d9a26
better
relativisticelectron Aug 2, 2022
0c1bf86
working endpoints for utxo
relativisticelectron Aug 2, 2022
0dbad31
working for change addresses
relativisticelectron Aug 2, 2022
7f002ec
slow...
relativisticelectron Aug 2, 2022
a45d90a
fast
relativisticelectron Aug 2, 2022
d6358f5
optimized
relativisticelectron Aug 2, 2022
5da31fd
working fully
relativisticelectron Aug 2, 2022
46dfb0d
refactor
relativisticelectron Aug 2, 2022
28fbd05
better
relativisticelectron Aug 2, 2022
e853d04
clickable div
relativisticelectron Aug 2, 2022
3aff57d
better hiding
relativisticelectron Aug 2, 2022
7ab7ae8
fix for emptying the search field fast
relativisticelectron Aug 2, 2022
19a6fc4
many optimizations and UI improvements
relativisticelectron Aug 3, 2022
b690ce9
better formatting
relativisticelectron Aug 3, 2022
24b49ec
formatting and result limiting
relativisticelectron Aug 3, 2022
071a1c5
user awareness
relativisticelectron Aug 3, 2022
2e608fd
added force option
relativisticelectron Aug 3, 2022
0b42f76
better title
relativisticelectron Aug 3, 2022
2b98bf6
restructuring to mnake the search results less convoluted
relativisticelectron Aug 3, 2022
3e2e514
cleanup
relativisticelectron Aug 3, 2022
631b529
added endpoints to test
relativisticelectron Aug 3, 2022
cfc7d7e
cleanup
relativisticelectron Aug 3, 2022
be9d3b3
better highlighting
relativisticelectron Aug 3, 2022
0c1c2ae
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Aug 3, 2022
a029c62
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Aug 9, 2022
b6d2bb3
more compact recursive search in structure
relativisticelectron Aug 9, 2022
0b075b1
doc
relativisticelectron Aug 9, 2022
ed61c92
added endpoint class
relativisticelectron Aug 10, 2022
fba238c
post request doesn't reload page
relativisticelectron Aug 10, 2022
b74c8dd
working endpoint
relativisticelectron Aug 10, 2022
a3746e1
doc
relativisticelectron Aug 10, 2022
9b09b57
Merge branch '20220810_try_with_endpoints' into 20220801_search_list
relativisticelectron Aug 10, 2022
1790401
remove print
relativisticelectron Aug 10, 2022
8fe1ec2
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Aug 10, 2022
51dfbf3
added generators
relativisticelectron Aug 10, 2022
0d040d6
fixed bug with javascript loop var
relativisticelectron Aug 10, 2022
63967b2
simplified recursion massively, and made more robust
relativisticelectron Aug 10, 2022
1730e39
fix bug and simplified html-tree
relativisticelectron Aug 10, 2022
89e182d
removed ids, and added automatic list reloading
relativisticelectron Aug 10, 2022
729d97a
better text
relativisticelectron Aug 10, 2022
44317cd
changed max_number_of_main_results back to 100
relativisticelectron Aug 10, 2022
8472813
enabled opening of address details
relativisticelectron Aug 10, 2022
def2c56
enabled utxo details
relativisticelectron Aug 10, 2022
9ec1835
moved search functionality into its own class
relativisticelectron Aug 11, 2022
95e45ff
refactoring
relativisticelectron Aug 11, 2022
ffd341f
translations and ESC
relativisticelectron Aug 11, 2022
ebd627c
translations and typo
relativisticelectron Aug 11, 2022
b87b4dd
regex escape
relativisticelectron Aug 11, 2022
ca56139
fix
relativisticelectron Aug 11, 2022
ca68895
doc
relativisticelectron Aug 11, 2022
af14e40
reset lots of file changes back to master
relativisticelectron Aug 11, 2022
dd8b00b
doc
relativisticelectron Aug 11, 2022
e8c6eab
reverted helpers to master
relativisticelectron Aug 11, 2022
41c2907
refactor better names
relativisticelectron Aug 11, 2022
5c4fa46
include hide_sensitive_info by removing all sensitive parts from the …
relativisticelectron Aug 11, 2022
0712c4c
doc
relativisticelectron Aug 11, 2022
c9f820f
moved ESC event listener to document
relativisticelectron Aug 13, 2022
7dbf358
refactoring and replaced title_key by function
relativisticelectron Aug 14, 2022
57b045a
label for address search instead of address
relativisticelectron Aug 14, 2022
9727c33
avoid duplicate results
relativisticelectron Aug 14, 2022
52c7820
doc
relativisticelectron Aug 14, 2022
8b4ca0f
moved wallet_manager, device_manager to init
relativisticelectron Aug 14, 2022
ad5d5d7
add pytest
relativisticelectron Aug 14, 2022
7b8ddc0
better pytest
relativisticelectron Aug 14, 2022
d297e1a
added amount search and address search
relativisticelectron Aug 14, 2022
a41d6d7
test devices
relativisticelectron Aug 14, 2022
12da9c4
added wallet name search
relativisticelectron Aug 14, 2022
89bfe18
eliminate useless info in json
relativisticelectron Aug 14, 2022
ed42292
added cypress tests and included name and alias for wallets and devices
relativisticelectron Aug 15, 2022
8ee9189
improved Recieved Info
relativisticelectron Aug 15, 2022
e2965d0
cypress test works
relativisticelectron Aug 15, 2022
9417fd1
improved the timeoutids
relativisticelectron Aug 15, 2022
b00962a
fix pytest
relativisticelectron Aug 15, 2022
7c86e44
the wallet_manager and device_manager are not always the same instanc…
relativisticelectron Aug 15, 2022
3502dd2
undo deletion
relativisticelectron Aug 15, 2022
fb774db
undo info
relativisticelectron Aug 15, 2022
28c5963
added locale datetime search
relativisticelectron Aug 17, 2022
87cab6e
allow also timestamp search
relativisticelectron Aug 17, 2022
43db93d
add language_code also for devices, even though it is not yet needed
relativisticelectron Aug 17, 2022
d72a179
rename and bugfix
relativisticelectron Aug 17, 2022
a70f762
added cancel button for the search field
relativisticelectron Aug 17, 2022
8161942
doc
relativisticelectron Aug 17, 2022
e132b78
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Aug 17, 2022
664119e
Merge branch 'master' into 20220801_search_list
relativisticelectron Aug 25, 2022
ebbd0cf
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Sep 25, 2022
6970a05
Merge branch 'master' into 20220801_search_list
k9ert Sep 27, 2022
6f95891
Merge remote-tracking branch 'cryptoadvance/master' into 20220801_sea…
relativisticelectron Oct 2, 2022
493b43b
global search service (blank)
relativisticelectron Oct 2, 2022
52edd2b
undo some changes
relativisticelectron Oct 2, 2022
e87e64a
cleanup
relativisticelectron Oct 2, 2022
3e6e753
bugfix
relativisticelectron Oct 2, 2022
db9c92c
bugfix
relativisticelectron Oct 4, 2022
cf7d8be
fix pytest
relativisticelectron Oct 4, 2022
2515bbc
Merge branch 'master' into 20220801_search_list
k9ert Oct 13, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cypress.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"spec_qr_signing.js",
"spec_balances_amounts.js",
"spec_wallet_send.js",
"spec_global_search.js",
"spec_wallet_utxo.js",
"spec_plugins.js",
"spec_elm_single_segwit_wallet.js",
Expand Down
34 changes: 34 additions & 0 deletions cypress/integration/spec_global_search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
describe('Do global searches', () => {
before(() => {
Cypress.config('includeShadowDom', true)
})

// Keeps the session cookie alive, Cypress by default clears all cookies before each test
beforeEach(() => {
cy.viewport(1200,660)
cy.visit('/')
Cypress.Cookies.preserveOnce('session')
})

it('Search', () => {
cy.addHotDevice("Hot Device 1","bitcoin")
cy.addWallet('Test Hot Wallet 1', 'segwit', 'funded', 'btc', 'singlesig', 'Hot Device 1')
cy.selectWallet("Test Hot Wallet 1")

// check the #0 Receive address is found
cy.get('#global-search-input').clear()
cy.get('#global-search-input').type("bcrt1", {force:true})
cy.get('#global-search-dropdown-content', { timeout: 3000 }).should('be.visible')
cy.get('#global-search-dropdown-content').contains('Address #0', { matchCase: false })

// check varias names and alias'
var searchTerms = ['Address #0', 'Change #10', 'Test Hot Wallet 1', 'Test_Hot_Wallet_1', "Hot Device 1", "Hot_Device_1"];
for (var i in searchTerms){
cy.get('#global-search-input').clear()
cy.get('#global-search-input').type(searchTerms[i], {force:true})
cy.get('#global-search-dropdown-content', { timeout: 3000 }).should('be.visible')
cy.get('#global-search-dropdown-content').contains(searchTerms[i], { matchCase: false })
}

})
})
1 change: 1 addition & 0 deletions src/cryptoadvance/specter/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ class BaseConfig(object):
"cryptoadvance.specterext.devhelp.service",
"cryptoadvance.specterext.exfund.service",
"cryptoadvance.specterext.faucet.service",
"cryptoadvance.specterext.globalsearch.service",
]

# This is just a placeholder in order to be aware that you cannot set this
Expand Down
29 changes: 28 additions & 1 deletion src/cryptoadvance/specter/server_endpoints/wallets.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,9 +386,17 @@ def wallet(wallet_alias):
@wallets_endpoint.route("/wallet/<wallet_alias>/history/", methods=["GET", "POST"])
@login_required
def history(wallet_alias):
return history_tx_list_type(wallet_alias, "txlist")


@wallets_endpoint.route(
"/wallet/<wallet_alias>/history/<tx_list_type>/", methods=["GET", "POST"]
)
@login_required
def history_tx_list_type(wallet_alias, tx_list_type):
wallet = app.specter.wallet_manager.get_by_alias(wallet_alias)
tx_list_type = "txlist"

txid_to_show_on_load = None
if request.method == "POST":
action = request.form["action"]
if action == "freezeutxo":
Expand All @@ -400,6 +408,8 @@ def history(wallet_alias):
wallet.abandontransaction(txid)
except SpecterError as e:
flash(str(e), "error")
elif action == "show_tx_on_load":
txid_to_show_on_load = request.form["txid"]

# update balances in the wallet
app.specter.check_blockheight()
Expand All @@ -411,6 +421,7 @@ def history(wallet_alias):
wallet_alias=wallet_alias,
wallet=wallet,
tx_list_type=tx_list_type,
txid_to_show_on_load=txid_to_show_on_load,
specter=app.specter,
rand=rand,
services=app.specter.service_manager.services,
Expand Down Expand Up @@ -738,11 +749,25 @@ def import_psbt(wallet_alias):
@wallets_endpoint.route("/wallet/<wallet_alias>/addresses/", methods=["GET"])
@login_required
def addresses(wallet_alias):
return addresses_with_type(wallet_alias, "receive")


@wallets_endpoint.route(
"/wallet/<wallet_alias>/addresses/<address_type>/", methods=["GET", "POST"]
)
@login_required
def addresses_with_type(wallet_alias, address_type):
"""Show informations about cached addresses (wallet._addresses) of the <wallet_alias>.
It updates balances in the wallet before renderization in order to show updated UTXO and
balance of each address."""
wallet = app.specter.wallet_manager.get_by_alias(wallet_alias)

address_json_to_show_on_load = None
if request.method == "POST":
action = request.form["action"]
if action == "show_address_on_load":
address_json_to_show_on_load = request.form["address_dict"]

# update balances in the wallet
app.specter.check_blockheight()
wallet.update_balance()
Expand All @@ -755,6 +780,8 @@ def addresses(wallet_alias):
specter=app.specter,
rand=rand,
services=app.specter.service_manager.services,
address_type=address_type,
address_json_to_show_on_load=address_json_to_show_on_load,
)


Expand Down
1 change: 1 addition & 0 deletions src/cryptoadvance/specter/server_endpoints/wallets_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from ..server_endpoints.filters import assetlabel
from ..specter_error import SpecterError, handle_exception
from ..util.base43 import b43_decode
from ..util.common import robust_json_dumps
from ..util.descriptor import Descriptor
from ..util.fee_estimation import FeeEstimationResultEncoder, get_fees
from ..util.mnemonic import generate_mnemonic
Expand Down
43 changes: 42 additions & 1 deletion src/cryptoadvance/specter/static/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,51 @@ async function send_request(url, method_str, csrf_token, formData) {
}

const response = await fetch(url, d);
if(response.status != 200){
if(!response.ok){
showError(await response.text());
console.log(`Error while calling ${url} with ${method_str} ${formData}`)
return
}
return await response.json();
}



/**
* Takes a dictionary with string keys and string values, transferrs them into input fields in a form and submits this form
* @param {*} url : To which url should this form be submitted
* @param {*} csrf_token
* @param {*} formDataDict: Should be a dict with string keys and string values
*
* Example arguments:
* url = "/wallet/<wallet_alias>/history/<tx_list_type>/"
* formDataDict = {
"action": "txid_to_show_on_load",
"txid": tx_dict["txid"],
},
*/
async function submitForm(url, csrf_token, formDataDict) {
var form = document.createElement("form");
form.action = url;
form.type = "hidden";
form.method = "POST";
form.value = formDataDict["action"];

var input = document.createElement("input");
input.name = "csrf_token";
input.value = csrf_token;
form.appendChild(input);

// transfer all values from the formDataDict into input fields.
for (var key in formDataDict){
var input = document.createElement("input");
input.type = "hidden";
input.name = key;
input.value = formDataDict[key];
form.appendChild(input);
}


document.body.appendChild(form);
form.submit();
}
26 changes: 16 additions & 10 deletions src/cryptoadvance/specter/templates/includes/addresses-table.html
Original file line number Diff line number Diff line change
Expand Up @@ -241,19 +241,11 @@ <h1>{{ _("Export addresses to CSV") }}</h1>

// Setup tabs switching
this.receiveAddressesViewBtn.onclick = () => {
if (!this.receiveAddressesViewBtn.classList.contains("checked")) {
this.changeAddressesViewBtn.classList.remove("checked");
this.receiveAddressesViewBtn.classList.add("checked");
this.setAttribute("type", "receive");
}
this.setAttribute("type", "receive");
}

this.changeAddressesViewBtn.onclick = () => {
if (!this.changeAddressesViewBtn.classList.contains("checked")) {
this.receiveAddressesViewBtn.classList.remove("checked");
this.changeAddressesViewBtn.classList.add("checked");
this.setAttribute("type", "change");
}
this.setAttribute("type", "change");
}

// Init call id to avoid fetch returning after another one triggered
Expand Down Expand Up @@ -357,6 +349,19 @@ <h1>{{ _("Export addresses to CSV") }}</h1>
shadow.appendChild(clone);
}


updateCheckedButton () {
if (this.listType == "change") {
this.changeAddressesViewBtn.classList.add("checked");
this.receiveAddressesViewBtn.classList.remove("checked");
} else {
this.changeAddressesViewBtn.classList.remove("checked");
this.receiveAddressesViewBtn.classList.add("checked");
}
}



static get observedAttributes() {
return ['type', 'wallet', 'btc-unit', 'price', 'symbol', 'hide-sensitive-info'];
}
Expand Down Expand Up @@ -420,6 +425,7 @@ <h1>{{ _("Export addresses to CSV") }}</h1>
} else {
this.switchText.innerText = "";
}
this.updateCheckedButton();

// Prepare form data with all relevant parameters
var formData = new FormData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,17 @@
{% endif %}
btc-unit="{{ specter.unit }}"
hide-sensitive-info="{{ specter.hide_sensitive_info | lower }}"
type="receive"
wallet="{{ wallet.alias }}"></addresses-table>
type="{{ address_type }}"
wallet="{{ wallet.alias }}"
id="addresses-table-{{ wallet.alias }}"></addresses-table>
</div>
<div id="address-popup" class="hidden"></div>
<script type="text/javascript">
// enable that address details can be shown upon loading
if ("{{ address_json_to_show_on_load }}" != "None") {
addressTable = document.getElementById("addresses-table-{{ wallet.alias }}");
var addressData = {{ address_json_to_show_on_load|safe }};
showAddressData(addressData.amount, "", addressData, addressTable.wallet);
}
</script>
{% endblock %}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{% extends "wallet/components/wallet_tab.jinja" %}
{% set tab = 'history' %}
{% set tx_list_type = tx_list_type %}
{% block content %}
{% from 'wallet/history/components/total_wallet_balances.jinja' import total_wallet_balances %}
{{ total_wallet_balances(
Expand Down Expand Up @@ -27,9 +28,17 @@
blockhash="{{ specter.config.validate_merkle_proofs | lower }}"
type="{{ tx_list_type }}"
hide-sensitive-info="{{ specter.hide_sensitive_info | lower }}"
wallet="{{ wallet.alias }}">
wallet="{{ wallet.alias }}"
id="tx-table-{{ wallet.alias }}">
</tx-table>
</div>
<script type="text/javascript">
// enable that tx details can be shown upon loading
if ("{{ txid_to_show_on_load }}" != "None") {
txtable = document.getElementById("tx-table-{{ wallet.alias }}");
showTxData(txtable.btcUnit, txtable.price, txtable.symbol, '{{ txid_to_show_on_load }}', txtable.wallet)
}
</script>
{% endblock %}


4 changes: 4 additions & 0 deletions src/cryptoadvance/specter/wallet.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ def __init__(
):
self.save_to_file()

@property
def transactions(self):
return self._transactions

@property
def recv_descriptor(self):
return add_checksum(str(self.descriptor.branch(0)))
Expand Down
10 changes: 10 additions & 0 deletions src/cryptoadvance/specterext/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
__pycache__
.pytest_cache
*.pyc
.env
*.egg-info
.DS_Store
node_modules
btcd-conn.json
elmd-conn.json
prevent_mining
Empty file.
51 changes: 51 additions & 0 deletions src/cryptoadvance/specterext/globalsearch/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from cryptoadvance.specter.cli import entry_point
from cryptoadvance.specter.cli.cli_server import server
import logging
import click

logger = logging.getLogger(__name__)


@click.group()
def cli():
pass


@cli.command()
@click.pass_context
@click.option(
"--host",
default="127.0.0.1",
help="if you specify --host 0.0.0.0 then Globalsearch will be available in your local LAN.",
)
@click.option(
"--ssl/--no-ssl",
is_flag=True,
default=False,
help="By default SSL encryption will not be used. Use -ssl to create a self-signed certificate for SSL encryption.",
)
@click.option("--debug/--no-debug", default=None)
@click.option("--filelog/--no-filelog", default=True)
@click.option(
"--config",
default=None,
help="A class which sets reasonable default values.",
)
def start(ctx, host, ssl, debug, filelog, config):
if config == None:
config = "cryptoadvance.specterext.globalsearch.config.AppProductionConfig"
ctx.invoke(
server,
host=host,
ssl=ssl,
debug=debug,
filelog=filelog,
port=8080,
config=config,
)


entry_point.add_command(start)

if __name__ == "__main__":
entry_point()
17 changes: 17 additions & 0 deletions src/cryptoadvance/specterext/globalsearch/app_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""
Here you can put the Configuration of your Application
"""

import os
from cryptoadvance.specter.config import ProductionConfig as SpecterProductionConfig


class AppProductionConfig(SpecterProductionConfig):
"""The AppProductionConfig class can be used to user this extension as application"""

# Where should the User endup if he hits the root of that domain?
ROOT_URL_REDIRECT = "/spc/ext/globalsearch"
# I guess this is the only extension which should be available?
EXTENSION_LIST = ["cryptoadvance.specterext.globalsearch.service"]
# You might also want a different folder here
SPECTER_DATA_FOLDER = os.path.expanduser("~/.globalsearch")
15 changes: 15 additions & 0 deletions src/cryptoadvance/specterext/globalsearch/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""
Here Configuration of your Extension takes place
"""


class BaseConfig:
"""This is a extension-based Config which is used as Base"""

pass


class ProductionConfig(BaseConfig):
"""This is a extension-based Config for Production"""

pass
Loading