String replacement for block explorer URL (#384)

use string replace to build block explorer url
This commit is contained in:
AMStrix 2019-03-14 23:16:38 -05:00 committed by William O'Beirne
parent 314879e316
commit c41d74c0fa
8 changed files with 21 additions and 15 deletions

View File

@ -29,8 +29,8 @@ BLOCKCHAIN_REST_API_URL="http://localhost:5051"
BLOCKCHAIN_API_SECRET="ef0b48e41f78d3ae85b1379b386f1bca" BLOCKCHAIN_API_SECRET="ef0b48e41f78d3ae85b1379b386f1bca"
# Blockchain explorer to link to. Top for mainnet, bottom for testnet. # Blockchain explorer to link to. Top for mainnet, bottom for testnet.
# EXPLORER_URL="https://explorer.zcha.in/" # EXPLORER_URL="https://chain.so/tx/ZEC/<txid>"
EXPLORER_URL="https://testnet.zcha.in/" EXPLORER_URL="https://chain.so/tx/ZECTEST/<txid>"
# Amount for staking a proposal in ZEC # Amount for staking a proposal in ZEC
PROPOSAL_STAKING_AMOUNT=0.025 PROPOSAL_STAKING_AMOUNT=0.025

View File

@ -24,7 +24,6 @@ from grant.proposal.models import (
admin_proposal_contributions_schema, admin_proposal_contributions_schema,
) )
from grant.rfp.models import RFP, admin_rfp_schema, admin_rfps_schema from grant.rfp.models import RFP, admin_rfp_schema, admin_rfps_schema
from grant.settings import EXPLORER_URL
from grant.user.models import User, UserSettings, admin_users_schema, admin_user_schema from grant.user.models import User, UserSettings, admin_users_schema, admin_user_schema
from grant.utils import pagination from grant.utils import pagination
from grant.utils.enums import Category from grant.utils.enums import Category
@ -36,7 +35,7 @@ from grant.utils.enums import (
MilestoneStage, MilestoneStage,
RFPStatus, RFPStatus,
) )
from grant.utils.misc import make_url from grant.utils.misc import make_url, make_explore_url
from .example_emails import example_email_args from .example_emails import example_email_args
blueprint = Blueprint('admin', __name__, url_prefix='/api/v1/admin') blueprint = Blueprint('admin', __name__, url_prefix='/api/v1/admin')
@ -434,7 +433,7 @@ def paid_milestone_payout_request(id, mid, tx_id):
'proposal': proposal, 'proposal': proposal,
'milestone': ms, 'milestone': ms,
'amount': amount, 'amount': amount,
'tx_explorer_url': f'{EXPLORER_URL}transactions/{tx_id}', 'tx_explorer_url': make_explore_url(tx_id),
'proposal_milestones_url': make_url(f'/proposals/{proposal.id}?tab=milestones'), 'proposal_milestones_url': make_url(f'/proposals/{proposal.id}?tab=milestones'),
}) })
return proposal_schema.dump(proposal), 200 return proposal_schema.dump(proposal), 200

View File

@ -11,7 +11,7 @@ from grant.email.send import send_email
from grant.milestone.models import Milestone from grant.milestone.models import Milestone
from grant.parser import body, query, paginated_fields from grant.parser import body, query, paginated_fields
from grant.rfp.models import RFP from grant.rfp.models import RFP
from grant.settings import EXPLORER_URL, PROPOSAL_STAKING_AMOUNT from grant.settings import PROPOSAL_STAKING_AMOUNT
from grant.task.jobs import ProposalDeadline from grant.task.jobs import ProposalDeadline
from grant.user.models import User from grant.user.models import User
from grant.utils import pagination from grant.utils import pagination
@ -26,7 +26,7 @@ from grant.utils.auth import (
from grant.utils.enums import Category from grant.utils.enums import Category
from grant.utils.enums import ProposalStatus, ProposalStage, ContributionStatus from grant.utils.enums import ProposalStatus, ProposalStage, ContributionStatus
from grant.utils.exceptions import ValidationException from grant.utils.exceptions import ValidationException
from grant.utils.misc import is_email, make_url, from_zat from grant.utils.misc import is_email, make_url, from_zat, make_explore_url
from .models import ( from .models import (
Proposal, Proposal,
proposals_schema, proposals_schema,
@ -542,7 +542,7 @@ def post_contribution_confirmation(contribution_id, to, amount, txid):
send_email(contribution.user.email_address, 'staking_contribution_confirmed', { send_email(contribution.user.email_address, 'staking_contribution_confirmed', {
'contribution': contribution, 'contribution': contribution,
'proposal': contribution.proposal, 'proposal': contribution.proposal,
'tx_explorer_url': f'{EXPLORER_URL}transactions/{txid}', 'tx_explorer_url': make_explore_url(txid),
'fully_staked': contribution.proposal.is_staked, 'fully_staked': contribution.proposal.is_staked,
'stake_target': str(PROPOSAL_STAKING_AMOUNT.normalize()), 'stake_target': str(PROPOSAL_STAKING_AMOUNT.normalize()),
}) })
@ -553,7 +553,7 @@ def post_contribution_confirmation(contribution_id, to, amount, txid):
send_email(contribution.user.email_address, 'contribution_confirmed', { send_email(contribution.user.email_address, 'contribution_confirmed', {
'contribution': contribution, 'contribution': contribution,
'proposal': contribution.proposal, 'proposal': contribution.proposal,
'tx_explorer_url': f'{EXPLORER_URL}transactions/{txid}', 'tx_explorer_url': make_explore_url(txid),
}) })
# Send to the full proposal gang # Send to the full proposal gang

View File

@ -58,7 +58,7 @@ LINKEDIN_CLIENT_SECRET = env.str("LINKEDIN_CLIENT_SECRET")
BLOCKCHAIN_REST_API_URL = env.str("BLOCKCHAIN_REST_API_URL") BLOCKCHAIN_REST_API_URL = env.str("BLOCKCHAIN_REST_API_URL")
BLOCKCHAIN_API_SECRET = env.str("BLOCKCHAIN_API_SECRET") BLOCKCHAIN_API_SECRET = env.str("BLOCKCHAIN_API_SECRET")
EXPLORER_URL = env.str("EXPLORER_URL", default="https://explorer.zcha.in/") EXPLORER_URL = env.str("EXPLORER_URL", default="https://chain.so/tx/ZECTEST/<txid>")
PROPOSAL_STAKING_AMOUNT = Decimal(env.str("PROPOSAL_STAKING_AMOUNT")) PROPOSAL_STAKING_AMOUNT = Decimal(env.str("PROPOSAL_STAKING_AMOUNT"))

View File

@ -4,7 +4,7 @@ import re
import string import string
import time import time
from grant.settings import SITE_URL from grant.settings import SITE_URL, EXPLORER_URL
epoch = datetime.datetime.utcfromtimestamp(0) epoch = datetime.datetime.utcfromtimestamp(0)
RANDOM_CHARS = string.ascii_letters + string.digits RANDOM_CHARS = string.ascii_letters + string.digits
@ -37,6 +37,10 @@ def make_url(path: str):
return f'{SITE_URL}{path}' return f'{SITE_URL}{path}'
def make_explore_url(txid: str):
return EXPLORER_URL.replace('<txid>', txid)
def is_email(email: str): def is_email(email: str):
return bool(re.match(r"[^@]+@[^@]+\.[^@]+", email)) return bool(re.match(r"[^@]+@[^@]+\.[^@]+", email))

View File

@ -13,8 +13,8 @@ BACKEND_URL=http://localhost:5000
# SENTRY_RELEASE="optional, provides sentry logging with release info" # SENTRY_RELEASE="optional, provides sentry logging with release info"
# Blockchain explorer to link to. Top for mainnet, bottom for testnet. # Blockchain explorer to link to. Top for mainnet, bottom for testnet.
# EXPLORER_URL="https://explorer.zcha.in/" # EXPLORER_URL="https://chain.so/tx/ZEC/<txid>"
EXPLORER_URL="https://testnet.zcha.in/" EXPLORER_URL="https://chain.so/tx/ZECTEST/<txid>"
# Amount for staking a proposal in ZEC # Amount for staking a proposal in ZEC
PROPOSAL_STAKING_AMOUNT=0.025 PROPOSAL_STAKING_AMOUNT=0.025

View File

@ -87,5 +87,8 @@ export function formatZcashCLI(address: string, amount?: string | number, memo?:
} }
export function formatTxExplorerUrl(txid: string) { export function formatTxExplorerUrl(txid: string) {
return `${process.env.EXPLORER_URL}transactions/${txid}`; if (process.env.EXPLORER_URL) {
return process.env.EXPLORER_URL.replace('<txid>', txid);
}
throw new Error('EXPLORER_URL env variable needs to be set!');
} }

View File

@ -53,7 +53,7 @@ process.env.NODE_PATH = (process.env.NODE_PATH || '')
module.exports = () => { module.exports = () => {
const raw = { const raw = {
BACKEND_URL: process.env.BACKEND_URL || 'http://localhost:5000', BACKEND_URL: process.env.BACKEND_URL || 'http://localhost:5000',
EXPLORER_URL: process.env.EXPLORER_URL || 'https://explorer.zcha.in/', EXPLORER_URL: process.env.EXPLORER_URL || 'https://chain.so/tx/ZECTEST/<txid>',
NODE_ENV: process.env.NODE_ENV || 'development', NODE_ENV: process.env.NODE_ENV || 'development',
PORT: process.env.PORT || 3000, PORT: process.env.PORT || 3000,
PROPOSAL_STAKING_AMOUNT: process.env.PROPOSAL_STAKING_AMOUNT, PROPOSAL_STAKING_AMOUNT: process.env.PROPOSAL_STAKING_AMOUNT,