From 7f065b41638d06cb580e48944e10baa33e467b68 Mon Sep 17 00:00:00 2001 From: Daniel Ternyak Date: Mon, 1 Feb 2021 19:32:12 -0600 Subject: [PATCH] setup 'FUNDING BY ZOMG' --- .github/workflows/node.js.yml | 32 +++ .github/workflows/python-app.yml | 32 +++ admin/src/components/ProposalDetail/index.tsx | 208 +++++++++--------- admin/src/store.ts | 24 ++ admin/src/types.ts | 1 + backend/grant/admin/views.py | 20 +- backend/grant/proposal/models.py | 56 +++-- backend/migrations/versions/91b16dc2fd74_.py | 28 +++ frontend/client/api/constants.ts | 4 +- .../components/Profile/ProfileProposal.tsx | 27 ++- .../Proposal/CampaignBlock/index.tsx | 10 +- .../Proposals/ProposalCard/index.tsx | 7 +- frontend/client/static/images/zomg-logo.png | Bin 0 -> 57722 bytes frontend/client/static/images/zomg-logo.svg | 64 ++++++ frontend/types/proposal.ts | 1 + 15 files changed, 372 insertions(+), 142 deletions(-) create mode 100644 .github/workflows/node.js.yml create mode 100644 .github/workflows/python-app.yml create mode 100644 backend/migrations/versions/91b16dc2fd74_.py create mode 100644 frontend/client/static/images/zomg-logo.png create mode 100644 frontend/client/static/images/zomg-logo.svg diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 00000000..64f82163 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,32 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: + - develop + - master + pull_request: + branches: + - develop + - master + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cd frontend && yarn && && yarn run lint && yarn run tsc diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 00000000..99f9547a --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,32 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Python application + +on: + push: + branches: + - develop + - master + pull_request: + branches: + - develop + - master + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + cd backend && pip install -r requirements/dev.txt + - name: Test with flask test + run: | + cd backend && cp .env.example .env && flask test diff --git a/admin/src/components/ProposalDetail/index.tsx b/admin/src/components/ProposalDetail/index.tsx index 80065bf9..389adbfe 100644 --- a/admin/src/components/ProposalDetail/index.tsx +++ b/admin/src/components/ProposalDetail/index.tsx @@ -2,27 +2,11 @@ import React from 'react'; import BN from 'bn.js'; import { view } from 'react-easy-state'; import { RouteComponentProps, withRouter } from 'react-router'; -import { - Alert, - Button, - Card, - Col, - Collapse, - Input, - message, - Popconfirm, - Row, - Tag, -} from 'antd'; +import { Alert, Button, Card, Col, Collapse, Input, message, Popconfirm, Row, Switch, Tag } from 'antd'; import TextArea from 'antd/lib/input/TextArea'; import store from 'src/store'; import { formatDateSeconds, formatDurationSeconds } from 'util/time'; -import { - MILESTONE_STAGE, - PROPOSAL_ARBITER_STATUS, - PROPOSAL_STAGE, - PROPOSAL_STATUS, -} from 'src/types'; +import { MILESTONE_STAGE, PROPOSAL_ARBITER_STATUS, PROPOSAL_STAGE, PROPOSAL_STATUS } from 'src/types'; import { Link } from 'react-router-dom'; import Back from 'components/Back'; import Markdown from 'components/Markdown'; @@ -30,6 +14,7 @@ import ArbiterControl from 'components/ArbiterControl'; import { fromZat, toZat } from 'src/util/units'; import FeedbackModal from '../FeedbackModal'; import { formatUsd } from 'util/formatters'; + import './index.less'; type Props = RouteComponentProps; @@ -58,6 +43,8 @@ class ProposalDetailNaked extends React.Component { return 'loading proposal...'; } + console.log(p.fundedByZomg); + const needsArbiter = PROPOSAL_ARBITER_STATUS.MISSING === p.arbiter.status && p.status === PROPOSAL_STATUS.LIVE && @@ -94,9 +81,9 @@ class ProposalDetailNaked extends React.Component {
Please review this proposal and render your judgment.
@@ -346,8 +333,8 @@ class ProposalDetailNaked extends React.Component { p.changesRequestedDiscussion && ( @@ -360,10 +347,10 @@ class ProposalDetailNaked extends React.Component { Mark Request as Resolved @@ -381,8 +368,8 @@ class ProposalDetailNaked extends React.Component { {!p.kycApproved ? ( @@ -390,10 +377,10 @@ class ProposalDetailNaked extends React.Component { with payouts. this.handleApproveKYC()} > KYC Approved @@ -404,8 +391,8 @@ class ProposalDetailNaked extends React.Component { ) : ( An arbiter is required to review milestone payout requests. @@ -422,8 +409,8 @@ class ProposalDetailNaked extends React.Component { p.status === PROPOSAL_STATUS.LIVE && ( @@ -469,9 +456,9 @@ class ProposalDetailNaked extends React.Component { return ( @@ -487,9 +474,9 @@ class ProposalDetailNaked extends React.Component { {' '} {p.payoutAddress} this.setState({ paidTxId: e.target.value })} onSearch={this.handlePaidMilestone} /> @@ -503,7 +490,7 @@ class ProposalDetailNaked extends React.Component { p.isFailed && ( { ); const renderDeetItem = (name: string, val: any) => ( - + {name} {val} ); - console.log(p); - + // @ts-ignore return ( - - + + {p.title} {/* MAIN */} @@ -550,22 +536,22 @@ class ProposalDetailNaked extends React.Component { {renderMilestoneAccepted()} {renderFailed()} - + {p.brief} - + - + {p.milestones.map((milestone, i) => ( {milestone.title + ' '} {milestone.immediatePayout && ( - Immediate Payout + Immediate Payout )} > } @@ -590,7 +576,7 @@ class ProposalDetailNaked extends React.Component { ))} - + {JSON.stringify(p, null, 4)} @@ -599,26 +585,38 @@ class ProposalDetailNaked extends React.Component { {/* RIGHT SIDE */} {p.isVersionTwo && - !p.acceptedWithFunding && - p.stage === PROPOSAL_STAGE.WIP && ( - - )} + !p.acceptedWithFunding && + p.stage === PROPOSAL_STAGE.WIP && ( + + )} {/* ACTIONS */} - + {renderCancelControl()} {renderArbiterControl()} + + { + p.acceptedWithFunding && + + + + } + {shouldShowChangeToAcceptedWithFunding && - renderChangeToAcceptedWithFundingControl()} + renderChangeToAcceptedWithFundingControl()} {/* DETAILS */} - + {renderDeetItem('id', p.proposalId)} {renderDeetItem('created', formatDateSeconds(p.dateCreated))} {renderDeetItem( @@ -630,10 +628,10 @@ class ProposalDetailNaked extends React.Component { formatDurationSeconds(p.deadlineDuration), )} {p.datePublished && - renderDeetItem( - '(deadline)', - formatDateSeconds(p.datePublished + p.deadlineDuration), - )} + renderDeetItem( + '(deadline)', + formatDateSeconds(p.datePublished + p.deadlineDuration), + )} {renderDeetItem('isFailed', JSON.stringify(p.isFailed))} {renderDeetItem('status', p.status)} {renderDeetItem('stage', p.stage)} @@ -662,14 +660,14 @@ class ProposalDetailNaked extends React.Component { >, )} {p.rfp && - renderDeetItem( - 'rfp', - {p.rfp.title}, - )} + renderDeetItem( + 'rfp', + {p.rfp.title}, + )} {/* TEAM */} - + {p.team.map(t => ( {t.displayName} @@ -783,6 +781,10 @@ class ProposalDetailNaked extends React.Component { await store.markMilestonePaid(pid, mid, this.state.paidTxId); message.success('Marked milestone paid.'); }; + + private handleSwitchFunder = async (checkValue: boolean) => { + store.switchProposalFunder(checkValue); + }; } const ProposalDetail = withRouter(view(ProposalDetailNaked)); diff --git a/admin/src/store.ts b/admin/src/store.ts index fc9a9818..489e3ae2 100644 --- a/admin/src/store.ts +++ b/admin/src/store.ts @@ -142,6 +142,11 @@ async function approveDiscussion( return data; } +async function switchProposalFunder(id: number, fundedByZomg: boolean) { + const { data } = await api.put(`/admin/proposals/${id}/adjust-funder`, {fundedByZomg}); + return data; +} + async function approveProposalKYC(id: number) { const { data } = await api.put(`/admin/proposals/${id}/approve-kyc`); return data; @@ -351,6 +356,7 @@ const app = store({ proposalDetailMarkingChangesAsResolved: false, proposalDetailAcceptingProposal: false, proposalDetailApprovingKyc: false, + proposalDetailSwitchingFunder: false, proposalDetailMarkingMilestonePaid: false, proposalDetailCanceling: false, proposalDetailUpdating: false, @@ -695,6 +701,24 @@ const app = store({ } }, + async switchProposalFunder(fundedByZomg: boolean) { + if (!app.proposalDetail) { + const m = 'store.acceptProposal(): Expected proposalDetail to be populated!'; + app.generalError.push(m); + console.error(m); + return; + } + app.proposalDetailSwitchingFunder = true; + try { + const { proposalId } = app.proposalDetail; + const res = await switchProposalFunder(proposalId, fundedByZomg); + app.updateProposalInStore(res); + } catch (e) { + handleApiError(e); + } + app.proposalDetailSwitchingFunder = false; + }, + async approveProposalKYC() { if (!app.proposalDetail) { const m = 'store.acceptProposal(): Expected proposalDetail to be populated!'; diff --git a/admin/src/types.ts b/admin/src/types.ts index 2aae7174..77669b33 100644 --- a/admin/src/types.ts +++ b/admin/src/types.ts @@ -124,6 +124,7 @@ export interface Proposal { changesRequestedDiscussion: boolean | null; changesRequestedDiscussionReason: string | null; kycApproved: null | boolean; + fundedByZomg: boolean; } export interface Comment { id: number; diff --git a/backend/grant/admin/views.py b/backend/grant/admin/views.py index b394062b..21545ec7 100644 --- a/backend/grant/admin/views.py +++ b/backend/grant/admin/views.py @@ -4,7 +4,7 @@ from functools import reduce from flask import Blueprint, request from marshmallow import fields, validate -from sqlalchemy import func, or_, text +from sqlalchemy import func, text import grant.utils.admin as admin import grant.utils.auth as auth @@ -25,7 +25,7 @@ from grant.proposal.models import ( admin_proposal_contributions_schema, ) from grant.rfp.models import RFP, admin_rfp_schema, admin_rfps_schema -from grant.user.models import User, UserSettings, admin_users_schema, admin_user_schema +from grant.user.models import User, admin_users_schema, admin_user_schema from grant.utils import pagination from grant.utils.enums import ( ProposalStatus, @@ -390,6 +390,22 @@ def approve_proposal_kyc(id): return proposal_schema.dump(proposal) +@blueprint.route('/proposals//adjust-funder', methods=['PUT']) +@body({ + "fundedByZomg": fields.Bool(required=True), +}) +@admin.admin_auth_required +def adjust_funder(id, funded_by_zomg): + proposal = Proposal.query.get(id) + if not proposal: + return {"message": "No proposal found."}, 404 + + proposal.funded_by_zomg = funded_by_zomg + db.session.add(proposal) + db.session.commit() + return proposal_schema.dump(proposal) + + @blueprint.route('/proposals//accept', methods=['PUT']) @body({ "isAccepted": fields.Bool(required=True), diff --git a/backend/grant/proposal/models.py b/backend/grant/proposal/models.py index 59e3ff70..b49e2b94 100644 --- a/backend/grant/proposal/models.py +++ b/backend/grant/proposal/models.py @@ -1,8 +1,8 @@ import datetime import json -from typing import Optional from decimal import Decimal, ROUND_DOWN from functools import reduce +from typing import Optional from marshmallow import post_dump from sqlalchemy import func, or_, select, ForeignKey @@ -10,15 +10,14 @@ from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import column_property from grant.comment.models import Comment -from grant.milestone.models import Milestone from grant.email.send import send_email from grant.extensions import ma, db +from grant.milestone.models import Milestone from grant.settings import PROPOSAL_STAKING_AMOUNT, PROPOSAL_TARGET_MAX from grant.task.jobs import ContributionExpired from grant.utils.enums import ( ProposalStatus, ProposalStage, - Category, ContributionStatus, ProposalArbiterStatus, MilestoneStage, @@ -332,7 +331,8 @@ class ProposalRevision(db.Model): if old_proposal.title != new_proposal.title: proposal_changes.append({"type": ProposalChange.PROPOSAL_EDIT_TITLE}) - milestone_changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, new_proposal.milestones) + milestone_changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, + new_proposal.milestones) return proposal_changes + milestone_changes @@ -392,6 +392,7 @@ class Proposal(db.Model): date_published = db.Column(db.DateTime) reject_reason = db.Column(db.String()) kyc_approved = db.Column(db.Boolean(), nullable=True, default=False) + funded_by_zomg = db.Column(db.Boolean(), nullable=True, default=False) accepted_with_funding = db.Column(db.Boolean(), nullable=True) changes_requested_discussion = db.Column(db.Boolean(), nullable=True) @@ -422,21 +423,23 @@ class Proposal(db.Model): ) followers_count = column_property( select([func.count(proposal_follower.c.proposal_id)]) - .where(proposal_follower.c.proposal_id == id) - .correlate_except(proposal_follower) + .where(proposal_follower.c.proposal_id == id) + .correlate_except(proposal_follower) ) likes = db.relationship( "User", secondary=proposal_liker, back_populates="liked_proposals" ) likes_count = column_property( select([func.count(proposal_liker.c.proposal_id)]) - .where(proposal_liker.c.proposal_id == id) - .correlate_except(proposal_liker) + .where(proposal_liker.c.proposal_id == id) + .correlate_except(proposal_liker) ) live_draft_parent_id = db.Column(db.Integer, ForeignKey('proposal.id')) - live_draft = db.relationship("Proposal", uselist=False, backref=db.backref('live_draft_parent', remote_side=[id], uselist=False)) + live_draft = db.relationship("Proposal", uselist=False, + backref=db.backref('live_draft_parent', remote_side=[id], uselist=False)) - revisions = db.relationship(ProposalRevision, foreign_keys=[ProposalRevision.proposal_id], lazy=True, cascade="all, delete-orphan") + revisions = db.relationship(ProposalRevision, foreign_keys=[ProposalRevision.proposal_id], lazy=True, + cascade="all, delete-orphan") def __init__( self, @@ -527,7 +530,7 @@ class Proposal(db.Model): # Validate payout address if not is_z_address_valid(self.payout_address): raise ValidationException("Payout address is not a valid z address") - + # Validate tip jar address if self.tip_jar_address and not is_z_address_valid(self.tip_jar_address): raise ValidationException("Tip address is not a valid z address") @@ -535,7 +538,6 @@ class Proposal(db.Model): # Then run through regular validation Proposal.simple_validate(vars(self)) - def validate_milestone_days(self): for milestone in self.milestones: if milestone.immediate_payout: @@ -612,11 +614,11 @@ class Proposal(db.Model): self.rfp_opt_in = opt_in def create_contribution( - self, - amount, - user_id: int = None, - staking: bool = False, - private: bool = True, + self, + amount, + user_id: int = None, + staking: bool = False, + private: bool = True, ): contribution = ProposalContribution( proposal_id=self.id, @@ -923,8 +925,8 @@ class Proposal(db.Model): return False res = ( db.session.query(proposal_follower) - .filter_by(user_id=authed.id, proposal_id=self.id) - .count() + .filter_by(user_id=authed.id, proposal_id=self.id) + .count() ) if res: return True @@ -939,8 +941,8 @@ class Proposal(db.Model): return False res = ( db.session.query(proposal_liker) - .filter_by(user_id=authed.id, proposal_id=self.id) - .count() + .filter_by(user_id=authed.id, proposal_id=self.id) + .count() ) if res: return True @@ -1099,7 +1101,8 @@ class ProposalSchema(ma.Schema): "changes_requested_discussion", "changes_requested_discussion_reason", "live_draft_id", - "kyc_approved" + "kyc_approved", + "funded_by_zomg" ) date_created = ma.Method("get_date_created") @@ -1109,6 +1112,7 @@ class ProposalSchema(ma.Schema): is_version_two = ma.Method("get_is_version_two") tip_jar_view_key = ma.Method("get_tip_jar_view_key") live_draft_id = ma.Method("get_live_draft_id") + funded_by_zomg = ma.Method("get_funded_by_zomg") updates = ma.Nested("ProposalUpdateSchema", many=True) team = ma.Nested("UserSchema", many=True) @@ -1118,6 +1122,14 @@ class ProposalSchema(ma.Schema): rfp = ma.Nested("RFPSchema", exclude=["accepted_proposals"]) arbiter = ma.Nested("ProposalArbiterSchema", exclude=["proposal"]) + def get_funded_by_zomg(self, obj): + if obj.funded_by_zomg is None: + return False + elif obj.funded_by_zomg is False: + return False + else: + return True + def get_proposal_id(self, obj): return obj.id diff --git a/backend/migrations/versions/91b16dc2fd74_.py b/backend/migrations/versions/91b16dc2fd74_.py new file mode 100644 index 00000000..7d44efd7 --- /dev/null +++ b/backend/migrations/versions/91b16dc2fd74_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 91b16dc2fd74 +Revises: d03c91f3038d +Create Date: 2021-02-01 17:00:23.721765 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '91b16dc2fd74' +down_revision = 'd03c91f3038d' +branch_labels = None +depends_on = None + + +def upgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.add_column('proposal', sa.Column('funded_by_zomg', sa.Boolean(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.drop_column('proposal', 'funded_by_zomg') + # ### end Alembic commands ### diff --git a/frontend/client/api/constants.ts b/frontend/client/api/constants.ts index 77d60521..19d88af9 100644 --- a/frontend/client/api/constants.ts +++ b/frontend/client/api/constants.ts @@ -86,11 +86,11 @@ export const STAGE_UI: { [key in PROPOSAL_FILTERS]: StageUI } = { color: '#8e44ad', }, ACCEPTED_WITH_FUNDING: { - label: 'Funded by ZF', + label: 'Funded', color: '#8e44ad', }, ACCEPTED_WITHOUT_FUNDING: { - label: 'Not Funded by ZF', + label: 'Not Funded', color: '#8e44ad', }, WIP: { diff --git a/frontend/client/components/Profile/ProfileProposal.tsx b/frontend/client/components/Profile/ProfileProposal.tsx index 853cbfe4..49947dd3 100644 --- a/frontend/client/components/Profile/ProfileProposal.tsx +++ b/frontend/client/components/Profile/ProfileProposal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Link } from 'react-router-dom'; -import { UserProposal, STATUS } from 'types'; +import { STATUS, UserProposal } from 'types'; import './ProfileProposal.less'; import UserRow from 'components/UserRow'; import UnitDisplay from 'components/UnitDisplay'; @@ -23,7 +23,8 @@ export default class Profile extends React.Component { isVersionTwo, acceptedWithFunding, status, - changesRequestedDiscussionReason + changesRequestedDiscussionReason, + fundedByZomg, } = this.props.proposal; // pulled from `variables.less` @@ -31,18 +32,24 @@ export default class Profile extends React.Component { const secondaryColor = '#2D2A26'; const isOpenForDiscussion = status === STATUS.DISCUSSION; - const discussionColor = changesRequestedDiscussionReason ? 'red' : infoColor - const discussionTag = changesRequestedDiscussionReason ? 'Changes Requested' : 'Open for Public Review' + const discussionColor = changesRequestedDiscussionReason ? 'red' : infoColor; + const discussionTag = changesRequestedDiscussionReason + ? 'Changes Requested' + : 'Open for Public Review'; - let tagColor = infoColor - let tagMessage = 'Open for Contributions' + let tagColor = infoColor; + let tagMessage = 'Open for Contributions'; if (acceptedWithFunding) { - tagColor = secondaryColor - tagMessage = 'Funded by ZF' + tagColor = secondaryColor; + if (!fundedByZomg) { + tagMessage = 'Funded by ZF'; + } else { + tagMessage = 'Funded by ZOMG'; + } } else if (isOpenForDiscussion) { - tagColor = discussionColor - tagMessage = discussionTag + tagColor = discussionColor; + tagMessage = discussionTag; } return ( diff --git a/frontend/client/components/Proposal/CampaignBlock/index.tsx b/frontend/client/components/Proposal/CampaignBlock/index.tsx index 78c0b7f5..59bede65 100644 --- a/frontend/client/components/Proposal/CampaignBlock/index.tsx +++ b/frontend/client/components/Proposal/CampaignBlock/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; import moment from 'moment'; -import { Icon, Popover, Tooltip, Alert } from 'antd'; +import { Alert, Icon, Popover, Tooltip } from 'antd'; import { Proposal, STATUS } from 'types'; import classnames from 'classnames'; import { connect } from 'react-redux'; @@ -12,6 +12,8 @@ import Loader from 'components/Loader'; import { PROPOSAL_STAGE } from 'api/constants'; import { formatUsd } from 'utils/formatters'; import ZFGrantsLogo from 'static/images/logo-name-light.svg'; +import ZomgLogo from 'static/images/zomg-logo.png'; + import './style.less'; interface OwnProps { @@ -134,7 +136,11 @@ export class ProposalCampaignBlock extends React.Component { isAcceptedWithFunding && ( Funded through - + {proposal.fundedByZomg ? ( + + ) : ( + + )} )} diff --git a/frontend/client/components/Proposals/ProposalCard/index.tsx b/frontend/client/components/Proposals/ProposalCard/index.tsx index c965b021..ce427158 100644 --- a/frontend/client/components/Proposals/ProposalCard/index.tsx +++ b/frontend/client/components/Proposals/ProposalCard/index.tsx @@ -29,6 +29,7 @@ export class ProposalCard extends React.Component { percentFunded, acceptedWithFunding, status, + fundedByZomg, } = this.props; // pulled from `variables.less` @@ -46,7 +47,11 @@ export class ProposalCard extends React.Component { if (isVersionTwo && status === STATUS.LIVE) { if (acceptedWithFunding) { tagColor = secondaryColor; - tagMessage = 'Funded by ZF'; + if (!fundedByZomg) { + tagMessage = 'Funded by ZF'; + } else { + tagMessage = 'Funded by ZOMG'; + } } else { tagColor = infoColor; tagMessage = 'Not Funded'; diff --git a/frontend/client/static/images/zomg-logo.png b/frontend/client/static/images/zomg-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..512d55136dd98379d568134cb6df1c9a127f2130 GIT binary patch literal 57722 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
@@ -360,10 +347,10 @@ class ProposalDetailNaked extends React.Component { Mark Request as Resolved @@ -381,8 +368,8 @@ class ProposalDetailNaked extends React.Component { {!p.kycApproved ? ( @@ -390,10 +377,10 @@ class ProposalDetailNaked extends React.Component { with payouts. this.handleApproveKYC()} > KYC Approved @@ -404,8 +391,8 @@ class ProposalDetailNaked extends React.Component { ) : ( An arbiter is required to review milestone payout requests. @@ -422,8 +409,8 @@ class ProposalDetailNaked extends React.Component { p.status === PROPOSAL_STATUS.LIVE && ( @@ -469,9 +456,9 @@ class ProposalDetailNaked extends React.Component { return ( @@ -487,9 +474,9 @@ class ProposalDetailNaked extends React.Component { {' '} {p.payoutAddress} this.setState({ paidTxId: e.target.value })} onSearch={this.handlePaidMilestone} /> @@ -503,7 +490,7 @@ class ProposalDetailNaked extends React.Component { p.isFailed && ( { ); const renderDeetItem = (name: string, val: any) => ( - + {name} {val} ); - console.log(p); - + // @ts-ignore return ( - - + + {p.title} {/* MAIN */} @@ -550,22 +536,22 @@ class ProposalDetailNaked extends React.Component { {renderMilestoneAccepted()} {renderFailed()} - + {p.brief} - + - + {p.milestones.map((milestone, i) => ( {milestone.title + ' '} {milestone.immediatePayout && ( - Immediate Payout + Immediate Payout )} > } @@ -590,7 +576,7 @@ class ProposalDetailNaked extends React.Component { ))} - + {JSON.stringify(p, null, 4)} @@ -599,26 +585,38 @@ class ProposalDetailNaked extends React.Component { {/* RIGHT SIDE */} {p.isVersionTwo && - !p.acceptedWithFunding && - p.stage === PROPOSAL_STAGE.WIP && ( - - )} + !p.acceptedWithFunding && + p.stage === PROPOSAL_STAGE.WIP && ( + + )} {/* ACTIONS */} - + {renderCancelControl()} {renderArbiterControl()} + + { + p.acceptedWithFunding && + + + + } + {shouldShowChangeToAcceptedWithFunding && - renderChangeToAcceptedWithFundingControl()} + renderChangeToAcceptedWithFundingControl()} {/* DETAILS */} - + {renderDeetItem('id', p.proposalId)} {renderDeetItem('created', formatDateSeconds(p.dateCreated))} {renderDeetItem( @@ -630,10 +628,10 @@ class ProposalDetailNaked extends React.Component { formatDurationSeconds(p.deadlineDuration), )} {p.datePublished && - renderDeetItem( - '(deadline)', - formatDateSeconds(p.datePublished + p.deadlineDuration), - )} + renderDeetItem( + '(deadline)', + formatDateSeconds(p.datePublished + p.deadlineDuration), + )} {renderDeetItem('isFailed', JSON.stringify(p.isFailed))} {renderDeetItem('status', p.status)} {renderDeetItem('stage', p.stage)} @@ -662,14 +660,14 @@ class ProposalDetailNaked extends React.Component { >, )} {p.rfp && - renderDeetItem( - 'rfp', - {p.rfp.title}, - )} + renderDeetItem( + 'rfp', + {p.rfp.title}, + )} {/* TEAM */} - + {p.team.map(t => ( {t.displayName} @@ -783,6 +781,10 @@ class ProposalDetailNaked extends React.Component { await store.markMilestonePaid(pid, mid, this.state.paidTxId); message.success('Marked milestone paid.'); }; + + private handleSwitchFunder = async (checkValue: boolean) => { + store.switchProposalFunder(checkValue); + }; } const ProposalDetail = withRouter(view(ProposalDetailNaked)); diff --git a/admin/src/store.ts b/admin/src/store.ts index fc9a9818..489e3ae2 100644 --- a/admin/src/store.ts +++ b/admin/src/store.ts @@ -142,6 +142,11 @@ async function approveDiscussion( return data; } +async function switchProposalFunder(id: number, fundedByZomg: boolean) { + const { data } = await api.put(`/admin/proposals/${id}/adjust-funder`, {fundedByZomg}); + return data; +} + async function approveProposalKYC(id: number) { const { data } = await api.put(`/admin/proposals/${id}/approve-kyc`); return data; @@ -351,6 +356,7 @@ const app = store({ proposalDetailMarkingChangesAsResolved: false, proposalDetailAcceptingProposal: false, proposalDetailApprovingKyc: false, + proposalDetailSwitchingFunder: false, proposalDetailMarkingMilestonePaid: false, proposalDetailCanceling: false, proposalDetailUpdating: false, @@ -695,6 +701,24 @@ const app = store({ } }, + async switchProposalFunder(fundedByZomg: boolean) { + if (!app.proposalDetail) { + const m = 'store.acceptProposal(): Expected proposalDetail to be populated!'; + app.generalError.push(m); + console.error(m); + return; + } + app.proposalDetailSwitchingFunder = true; + try { + const { proposalId } = app.proposalDetail; + const res = await switchProposalFunder(proposalId, fundedByZomg); + app.updateProposalInStore(res); + } catch (e) { + handleApiError(e); + } + app.proposalDetailSwitchingFunder = false; + }, + async approveProposalKYC() { if (!app.proposalDetail) { const m = 'store.acceptProposal(): Expected proposalDetail to be populated!'; diff --git a/admin/src/types.ts b/admin/src/types.ts index 2aae7174..77669b33 100644 --- a/admin/src/types.ts +++ b/admin/src/types.ts @@ -124,6 +124,7 @@ export interface Proposal { changesRequestedDiscussion: boolean | null; changesRequestedDiscussionReason: string | null; kycApproved: null | boolean; + fundedByZomg: boolean; } export interface Comment { id: number; diff --git a/backend/grant/admin/views.py b/backend/grant/admin/views.py index b394062b..21545ec7 100644 --- a/backend/grant/admin/views.py +++ b/backend/grant/admin/views.py @@ -4,7 +4,7 @@ from functools import reduce from flask import Blueprint, request from marshmallow import fields, validate -from sqlalchemy import func, or_, text +from sqlalchemy import func, text import grant.utils.admin as admin import grant.utils.auth as auth @@ -25,7 +25,7 @@ from grant.proposal.models import ( admin_proposal_contributions_schema, ) from grant.rfp.models import RFP, admin_rfp_schema, admin_rfps_schema -from grant.user.models import User, UserSettings, admin_users_schema, admin_user_schema +from grant.user.models import User, admin_users_schema, admin_user_schema from grant.utils import pagination from grant.utils.enums import ( ProposalStatus, @@ -390,6 +390,22 @@ def approve_proposal_kyc(id): return proposal_schema.dump(proposal) +@blueprint.route('/proposals//adjust-funder', methods=['PUT']) +@body({ + "fundedByZomg": fields.Bool(required=True), +}) +@admin.admin_auth_required +def adjust_funder(id, funded_by_zomg): + proposal = Proposal.query.get(id) + if not proposal: + return {"message": "No proposal found."}, 404 + + proposal.funded_by_zomg = funded_by_zomg + db.session.add(proposal) + db.session.commit() + return proposal_schema.dump(proposal) + + @blueprint.route('/proposals//accept', methods=['PUT']) @body({ "isAccepted": fields.Bool(required=True), diff --git a/backend/grant/proposal/models.py b/backend/grant/proposal/models.py index 59e3ff70..b49e2b94 100644 --- a/backend/grant/proposal/models.py +++ b/backend/grant/proposal/models.py @@ -1,8 +1,8 @@ import datetime import json -from typing import Optional from decimal import Decimal, ROUND_DOWN from functools import reduce +from typing import Optional from marshmallow import post_dump from sqlalchemy import func, or_, select, ForeignKey @@ -10,15 +10,14 @@ from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import column_property from grant.comment.models import Comment -from grant.milestone.models import Milestone from grant.email.send import send_email from grant.extensions import ma, db +from grant.milestone.models import Milestone from grant.settings import PROPOSAL_STAKING_AMOUNT, PROPOSAL_TARGET_MAX from grant.task.jobs import ContributionExpired from grant.utils.enums import ( ProposalStatus, ProposalStage, - Category, ContributionStatus, ProposalArbiterStatus, MilestoneStage, @@ -332,7 +331,8 @@ class ProposalRevision(db.Model): if old_proposal.title != new_proposal.title: proposal_changes.append({"type": ProposalChange.PROPOSAL_EDIT_TITLE}) - milestone_changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, new_proposal.milestones) + milestone_changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, + new_proposal.milestones) return proposal_changes + milestone_changes @@ -392,6 +392,7 @@ class Proposal(db.Model): date_published = db.Column(db.DateTime) reject_reason = db.Column(db.String()) kyc_approved = db.Column(db.Boolean(), nullable=True, default=False) + funded_by_zomg = db.Column(db.Boolean(), nullable=True, default=False) accepted_with_funding = db.Column(db.Boolean(), nullable=True) changes_requested_discussion = db.Column(db.Boolean(), nullable=True) @@ -422,21 +423,23 @@ class Proposal(db.Model): ) followers_count = column_property( select([func.count(proposal_follower.c.proposal_id)]) - .where(proposal_follower.c.proposal_id == id) - .correlate_except(proposal_follower) + .where(proposal_follower.c.proposal_id == id) + .correlate_except(proposal_follower) ) likes = db.relationship( "User", secondary=proposal_liker, back_populates="liked_proposals" ) likes_count = column_property( select([func.count(proposal_liker.c.proposal_id)]) - .where(proposal_liker.c.proposal_id == id) - .correlate_except(proposal_liker) + .where(proposal_liker.c.proposal_id == id) + .correlate_except(proposal_liker) ) live_draft_parent_id = db.Column(db.Integer, ForeignKey('proposal.id')) - live_draft = db.relationship("Proposal", uselist=False, backref=db.backref('live_draft_parent', remote_side=[id], uselist=False)) + live_draft = db.relationship("Proposal", uselist=False, + backref=db.backref('live_draft_parent', remote_side=[id], uselist=False)) - revisions = db.relationship(ProposalRevision, foreign_keys=[ProposalRevision.proposal_id], lazy=True, cascade="all, delete-orphan") + revisions = db.relationship(ProposalRevision, foreign_keys=[ProposalRevision.proposal_id], lazy=True, + cascade="all, delete-orphan") def __init__( self, @@ -527,7 +530,7 @@ class Proposal(db.Model): # Validate payout address if not is_z_address_valid(self.payout_address): raise ValidationException("Payout address is not a valid z address") - + # Validate tip jar address if self.tip_jar_address and not is_z_address_valid(self.tip_jar_address): raise ValidationException("Tip address is not a valid z address") @@ -535,7 +538,6 @@ class Proposal(db.Model): # Then run through regular validation Proposal.simple_validate(vars(self)) - def validate_milestone_days(self): for milestone in self.milestones: if milestone.immediate_payout: @@ -612,11 +614,11 @@ class Proposal(db.Model): self.rfp_opt_in = opt_in def create_contribution( - self, - amount, - user_id: int = None, - staking: bool = False, - private: bool = True, + self, + amount, + user_id: int = None, + staking: bool = False, + private: bool = True, ): contribution = ProposalContribution( proposal_id=self.id, @@ -923,8 +925,8 @@ class Proposal(db.Model): return False res = ( db.session.query(proposal_follower) - .filter_by(user_id=authed.id, proposal_id=self.id) - .count() + .filter_by(user_id=authed.id, proposal_id=self.id) + .count() ) if res: return True @@ -939,8 +941,8 @@ class Proposal(db.Model): return False res = ( db.session.query(proposal_liker) - .filter_by(user_id=authed.id, proposal_id=self.id) - .count() + .filter_by(user_id=authed.id, proposal_id=self.id) + .count() ) if res: return True @@ -1099,7 +1101,8 @@ class ProposalSchema(ma.Schema): "changes_requested_discussion", "changes_requested_discussion_reason", "live_draft_id", - "kyc_approved" + "kyc_approved", + "funded_by_zomg" ) date_created = ma.Method("get_date_created") @@ -1109,6 +1112,7 @@ class ProposalSchema(ma.Schema): is_version_two = ma.Method("get_is_version_two") tip_jar_view_key = ma.Method("get_tip_jar_view_key") live_draft_id = ma.Method("get_live_draft_id") + funded_by_zomg = ma.Method("get_funded_by_zomg") updates = ma.Nested("ProposalUpdateSchema", many=True) team = ma.Nested("UserSchema", many=True) @@ -1118,6 +1122,14 @@ class ProposalSchema(ma.Schema): rfp = ma.Nested("RFPSchema", exclude=["accepted_proposals"]) arbiter = ma.Nested("ProposalArbiterSchema", exclude=["proposal"]) + def get_funded_by_zomg(self, obj): + if obj.funded_by_zomg is None: + return False + elif obj.funded_by_zomg is False: + return False + else: + return True + def get_proposal_id(self, obj): return obj.id diff --git a/backend/migrations/versions/91b16dc2fd74_.py b/backend/migrations/versions/91b16dc2fd74_.py new file mode 100644 index 00000000..7d44efd7 --- /dev/null +++ b/backend/migrations/versions/91b16dc2fd74_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 91b16dc2fd74 +Revises: d03c91f3038d +Create Date: 2021-02-01 17:00:23.721765 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '91b16dc2fd74' +down_revision = 'd03c91f3038d' +branch_labels = None +depends_on = None + + +def upgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.add_column('proposal', sa.Column('funded_by_zomg', sa.Boolean(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.drop_column('proposal', 'funded_by_zomg') + # ### end Alembic commands ### diff --git a/frontend/client/api/constants.ts b/frontend/client/api/constants.ts index 77d60521..19d88af9 100644 --- a/frontend/client/api/constants.ts +++ b/frontend/client/api/constants.ts @@ -86,11 +86,11 @@ export const STAGE_UI: { [key in PROPOSAL_FILTERS]: StageUI } = { color: '#8e44ad', }, ACCEPTED_WITH_FUNDING: { - label: 'Funded by ZF', + label: 'Funded', color: '#8e44ad', }, ACCEPTED_WITHOUT_FUNDING: { - label: 'Not Funded by ZF', + label: 'Not Funded', color: '#8e44ad', }, WIP: { diff --git a/frontend/client/components/Profile/ProfileProposal.tsx b/frontend/client/components/Profile/ProfileProposal.tsx index 853cbfe4..49947dd3 100644 --- a/frontend/client/components/Profile/ProfileProposal.tsx +++ b/frontend/client/components/Profile/ProfileProposal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Link } from 'react-router-dom'; -import { UserProposal, STATUS } from 'types'; +import { STATUS, UserProposal } from 'types'; import './ProfileProposal.less'; import UserRow from 'components/UserRow'; import UnitDisplay from 'components/UnitDisplay'; @@ -23,7 +23,8 @@ export default class Profile extends React.Component { isVersionTwo, acceptedWithFunding, status, - changesRequestedDiscussionReason + changesRequestedDiscussionReason, + fundedByZomg, } = this.props.proposal; // pulled from `variables.less` @@ -31,18 +32,24 @@ export default class Profile extends React.Component { const secondaryColor = '#2D2A26'; const isOpenForDiscussion = status === STATUS.DISCUSSION; - const discussionColor = changesRequestedDiscussionReason ? 'red' : infoColor - const discussionTag = changesRequestedDiscussionReason ? 'Changes Requested' : 'Open for Public Review' + const discussionColor = changesRequestedDiscussionReason ? 'red' : infoColor; + const discussionTag = changesRequestedDiscussionReason + ? 'Changes Requested' + : 'Open for Public Review'; - let tagColor = infoColor - let tagMessage = 'Open for Contributions' + let tagColor = infoColor; + let tagMessage = 'Open for Contributions'; if (acceptedWithFunding) { - tagColor = secondaryColor - tagMessage = 'Funded by ZF' + tagColor = secondaryColor; + if (!fundedByZomg) { + tagMessage = 'Funded by ZF'; + } else { + tagMessage = 'Funded by ZOMG'; + } } else if (isOpenForDiscussion) { - tagColor = discussionColor - tagMessage = discussionTag + tagColor = discussionColor; + tagMessage = discussionTag; } return ( diff --git a/frontend/client/components/Proposal/CampaignBlock/index.tsx b/frontend/client/components/Proposal/CampaignBlock/index.tsx index 78c0b7f5..59bede65 100644 --- a/frontend/client/components/Proposal/CampaignBlock/index.tsx +++ b/frontend/client/components/Proposal/CampaignBlock/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; import moment from 'moment'; -import { Icon, Popover, Tooltip, Alert } from 'antd'; +import { Alert, Icon, Popover, Tooltip } from 'antd'; import { Proposal, STATUS } from 'types'; import classnames from 'classnames'; import { connect } from 'react-redux'; @@ -12,6 +12,8 @@ import Loader from 'components/Loader'; import { PROPOSAL_STAGE } from 'api/constants'; import { formatUsd } from 'utils/formatters'; import ZFGrantsLogo from 'static/images/logo-name-light.svg'; +import ZomgLogo from 'static/images/zomg-logo.png'; + import './style.less'; interface OwnProps { @@ -134,7 +136,11 @@ export class ProposalCampaignBlock extends React.Component { isAcceptedWithFunding && ( Funded through - + {proposal.fundedByZomg ? ( + + ) : ( + + )} )} diff --git a/frontend/client/components/Proposals/ProposalCard/index.tsx b/frontend/client/components/Proposals/ProposalCard/index.tsx index c965b021..ce427158 100644 --- a/frontend/client/components/Proposals/ProposalCard/index.tsx +++ b/frontend/client/components/Proposals/ProposalCard/index.tsx @@ -29,6 +29,7 @@ export class ProposalCard extends React.Component { percentFunded, acceptedWithFunding, status, + fundedByZomg, } = this.props; // pulled from `variables.less` @@ -46,7 +47,11 @@ export class ProposalCard extends React.Component { if (isVersionTwo && status === STATUS.LIVE) { if (acceptedWithFunding) { tagColor = secondaryColor; - tagMessage = 'Funded by ZF'; + if (!fundedByZomg) { + tagMessage = 'Funded by ZF'; + } else { + tagMessage = 'Funded by ZOMG'; + } } else { tagColor = infoColor; tagMessage = 'Not Funded'; diff --git a/frontend/client/static/images/zomg-logo.png b/frontend/client/static/images/zomg-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..512d55136dd98379d568134cb6df1c9a127f2130 GIT binary patch literal 57722 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
@@ -390,10 +377,10 @@ class ProposalDetailNaked extends React.Component { with payouts.
An arbiter is required to review milestone payout requests.
@@ -469,9 +456,9 @@ class ProposalDetailNaked extends React.Component { return ( @@ -487,9 +474,9 @@ class ProposalDetailNaked extends React.Component {
{p.payoutAddress}
{JSON.stringify(p, null, 4)}
<73!}egARY;K=2`ixS9jqNJkfQ` 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