Ejemplo n.º 1
0
def update_rfp(rfp_id, title, brief, content, category, bounty, matching, date_closes, status):
    rfp = RFP.query.filter(RFP.id == rfp_id).first()
    if not rfp:
        return {"message": "No RFP matching that id"}, 404

    # Update fields
    rfp.title = title
    rfp.brief = brief
    rfp.content = content
    rfp.category = category
    rfp.matching = matching
    rfp.bounty = bounty
    rfp.date_closes = datetime.fromtimestamp(date_closes) if date_closes else None

    # Update timestamps if status changed
    if rfp.status != status:
        if status == RFPStatus.LIVE and not rfp.date_opened:
            rfp.date_opened = datetime.now()
        if status == RFPStatus.CLOSED:
            rfp.date_closed = datetime.now()
        rfp.status = status

    admin.admin_log("RFP_UPDATE", f"Updated RFP {rfp.id} ({rfp.title})")
    db.session.add(rfp)
    db.session.commit()
    return admin_rfp_schema.dump(rfp)
Ejemplo n.º 2
0
def paid_milestone_payout_request(id, mid):
    proposal = Proposal.query.filter_by(id=id).first()
    if not proposal:
        return {"message": "No proposal matching id"}, 404
    if not proposal.status == ProposalStatus.LIVE:
        return {"message": "Proposal is not live"}, 400
    for ms in proposal.milestones:
        if ms.id == int(mid):
            ms.mark_paid()
            admin.admin_log("MILESTONE_PAID", f"Paid milestone #{ms.index + 1} ({ms.title}) for proposal {proposal.id} ({proposal.title})")
            db.session.add(ms)
            db.session.flush()
            # check if this is the final ms, and update proposal.stage
            num_paid = reduce(lambda a, x: a + (1 if x.stage == MilestoneStage.PAID else 0), proposal.milestones, 0)
            if num_paid == len(proposal.milestones):
                proposal.stage = ProposalStage.COMPLETED  # WIP -> COMPLETED
                db.session.add(proposal)
                db.session.flush()
            db.session.commit()
            # email TEAM that payout request was PAID
            for member in proposal.team:
                send_email(member.email_address, 'milestone_paid', {
                    'proposal': proposal,
                    'milestone': ms,
                    'amount': ms.payout_amount,
                    'proposal_milestones_url': make_url(f'/proposals/{proposal.id}?tab=milestones'),
                })
            # email FOLLOWERS that milestone was accepted
            proposal.send_follower_email('followed_proposal_milestone', email_args={'milestone':ms}, url_suffix='?tab=milestones')
            return proposal_schema.dump(proposal), 200

    return {"message": "No milestone matching id"}, 404
Ejemplo n.º 3
0
def delete_tag(tag_id):
    tag = tag_models.Tag.query.get(tag_id)
    if not tag:
        return {"message": "No Tag matching that id"}, 404
    tag.delete()
    admin.admin_log("TAG_DELETE", f"Deleted tag '{tag.text}'")
    db.session.commit()
    return {"message": "ok"}, 200
Ejemplo n.º 4
0
def delete_rfw(rfw_id):
    rfw = rfw_models.RFW.query.get(rfw_id)
    if not rfw:
        return {"message": "No RFW matching that id"}, 404
    rfw.delete()
    admin.admin_log("RFW_DELETE", f"Deleted RFW {rfw.id} ({rfw.title})")
    db.session.commit()
    return {"message": "ok"}, 200
Ejemplo n.º 5
0
def update_rfw(rfw_id, **kwargs):
    rfw = rfw_models.RFW.query.get(rfw_id)
    if not rfw:
        return {"message": "No RFW matching that id"}, 404
    rfw.update(**kwargs)
    admin.admin_log("RFW_UPDATE", f"Updated RFW {rfw.id} ({rfw.title})")
    db.session.commit()
    return rfw_models.rfw_schemas.single_admin.dump(rfw)
Ejemplo n.º 6
0
def delete_user(user_id):
    user = User.query.filter(User.id == user_id).first()
    if not user:
        return {"message": "No user matching that id"}, 404

    db.session.delete(user)
    admin.admin_log("USER_DELETE", f"Deleted user {user.id} ({user.display_name})")
    db.session.commit()
    return {"message": "ok"}, 200
Ejemplo n.º 7
0
def delete_rfp(rfp_id):
    rfp = RFP.query.filter(RFP.id == rfp_id).first()
    if not rfp:
        return {"message": "No RFP matching that id"}, 404

    admin.admin_log("RFP_DELETE", f"Deleted RFP {rfp.id} ({rfp.title})")
    db.session.delete(rfp)
    db.session.commit()
    return {"message": "ok"}, 200
Ejemplo n.º 8
0
def create_rfp(date_closes, **kwargs):
    rfp = RFP(
        **kwargs,
        date_closes=datetime.fromtimestamp(date_closes) if date_closes else None,
    )
    admin.admin_log("RFP_CREATE", f"Created RFP {rfp.id} ({rfp.title})")
    db.session.add(rfp)
    db.session.commit()
    return admin_rfp_schema.dump(rfp), 200
Ejemplo n.º 9
0
def delete_history(history_event_id):
    history_event = HistoryEvent.query.get(history_event_id)
    if not history_event:
        return {"message": "No history event matching that id"}, 404

    db.session.delete(history_event)
    admin.admin_log("HISTORY_DELETE", f"Deleted history event {history_event.id} ({history_event.title})")
    db.session.commit()
    return {"message": "ok"}, 200
Ejemplo n.º 10
0
def cancel_proposal(id):
    proposal = Proposal.query.filter_by(id=id).first()
    if not proposal:
        return {"message": "No proposal found."}, 404

    proposal.cancel()
    admin.admin_log("PROPOSAL_CANCEL", f"Canceled proposal {proposal.id} ({proposal.title})")
    db.session.add(proposal)
    db.session.commit()
    return proposal_schema.dump(proposal)
Ejemplo n.º 11
0
def approve_proposal(id, is_approve, reject_reason=None):
    proposal = Proposal.query.filter_by(id=id).first()
    if proposal:
        proposal.approve_pending(is_approve, reject_reason)
        if is_approve:
            admin.admin_log("PROPOSAL_APPROVE", f"Approved proposal {proposal.id} ({proposal.title})")
        else:
            admin.admin_log("PROPOSAL_REJECT", f"Rejected proposal {proposal.id} ({proposal.title}) for reason '{reject_reason}'")
        db.session.commit()
        return proposal_schema.dump(proposal)

    return {"message": "No proposal found."}, 404
Ejemplo n.º 12
0
def accept_milestone_payout_request(proposal_id, milestone_id):
    proposal = Proposal.query.filter_by(id=proposal_id).first()
    if not proposal:
        return {"message": "No proposal matching id"}, 404
    for ms in proposal.milestones:
        if ms.id == int(milestone_id):
            ms.accept_request()
            admin.admin_log("MILESTONE_APPROVE", f"Approved milestone #{ms.index + 1} ({ms.title}) for proposal {proposal.id} ({proposal.title})")
            db.session.commit()
            # NOTE - no notification here, do it on PAID
            return proposal_schema.dump(proposal), 200

    return {"message": "No milestone matching id"}, 404
Ejemplo n.º 13
0
def edit_comment(comment_id, hidden, reported):
    comment = Comment.query.filter(Comment.id == comment_id).first()
    if not comment:
        return {"message": "No comment matching that id"}, 404

    if hidden is not None:
        comment.hide(hidden)
        if hidden:
            admin.admin_log("COMMENT_HIDE", f"Hid comment {comment.id} from {comment.author.id} ({comment.author.display_name})")
        else:
            admin.admin_log("COMMENT_UNHIDE", f"Unhid comment {comment.id} from {comment.author.id} ({comment.author.display_name})")

    if reported is not None:
        comment.report(reported)

    db.session.commit()
    return admin_comment_schema.dump(comment)
Ejemplo n.º 14
0
def create_history(date, user_id, proposal_id, **kwargs):
    if user_id and not User.query.get(user_id):
        return {"message": "Invalid user ID"}, 400

    if proposal_id and not Proposal.query.get(proposal_id):
        return {"message": "Invalid proposal ID"}, 400

    history_event = HistoryEvent(
        **kwargs,
        user_id=user_id,
        proposal_id=proposal_id,
        date=datetime.fromtimestamp(date) if date else None,
    )
    db.session.add(history_event)
    admin.admin_log("HISTORY_CREATE", f"Created history event {history_event.id} ({history_event.title})")
    db.session.commit()
    return history_event_schema.dump(history_event), 200
Ejemplo n.º 15
0
def reject_milestone_payout_request(proposal_id, milestone_id, reason):
    proposal = Proposal.query.filter_by(id=proposal_id).first()
    if not proposal:
        return {"message": "No proposal matching id"}, 404
    for ms in proposal.milestones:
        if ms.id == int(milestone_id):
            ms.reject_request(reason)
            admin.admin_log("MILESTONE_REJECT", f"Rejected milestone #{ms.index + 1} ({ms.title}) for proposal {proposal.id} ({proposal.title}) with reason '{reason}'")
            db.session.add(ms)
            db.session.commit()
            # email TEAM that payout request was rejected
            for member in proposal.team:
                send_email(member.email_address, 'milestone_reject', {
                    'proposal': proposal,
                    'admin_note': reason,
                    'proposal_milestones_url': make_url(f'/proposals/{proposal.id}?tab=milestones'),
                })
            return proposal_schema.dump(proposal), 200

    return {"message": "No milestone matching id"}, 404
Ejemplo n.º 16
0
def update_rfw_milestone_claim_accept(rfw_id, ms_id, claim_id, is_accept, message=''):
    rfw = rfw_models.RFW.query.get(rfw_id)
    if not rfw:
        return {"message": "No RFW matching that id"}, 404
    if is_accept:
        rfw.accept_milestone_claim(ms_id, claim_id, message)
        admin.admin_log("CLAIM_ACCEPT", f"Accepted claim {claim_id} for RFW {rfw_id} with message '{message}'")
    else:
        rfw.reject_milestone_claim(ms_id, claim_id, message)
        admin.admin_log("CLAIM_REJECT", f"Rejected claim {claim_id} for RFW {rfw_id} with message '{message}'")
    # notify worker
    ms = rfw.get_milestone_by_id(ms_id)
    w = ms.get_claim_by_id(claim_id).worker
    send_email(w.user.email_address, 'work_milestone_accepted' if is_accept else 'work_milestone_rejected', {
        'rfw': rfw,
        'milestone': ms,
        'message': message,
        'rfw_url': make_url(f'/rfws/{rfw.id}'),
    })
    db.session.commit()
    return rfw_models.rfw_schemas.single_admin.dump(rfw)
Ejemplo n.º 17
0
def update_rfw_worker_accept(rfw_id, worker_id, is_accept, message=''):
    rfw = rfw_models.RFW.query.get(rfw_id)
    if not rfw:
        return {"message": "No RFW matching that id"}, 404
    w = rfw_models.RFWWorker.query.get(worker_id)
    if not w:
        return {"message": "No worker matching that id"}, 404
    if is_accept:
        rfw.accept_worker_by_id(worker_id, message)
        admin.admin_log("WORKER_ACCEPT", f"Accepted worker {worker_id} for RFW {rfw.id} with message '{message}'")
    else:
        rfw.reject_worker_by_id(worker_id, message)
        admin.admin_log("WORKER_REJECT", f"Rejected worker {worker_id} for RFW {rfw.id} with message '{message}'")
    # notify worker
    send_email(w.user.email_address, 'worker_approved' if is_accept else 'worker_rejected', {
        'rfw': rfw,
        'message': message,
        'rfw_url': make_url(f'/rfws/{rfw.id}'),
    })
    db.session.commit()
    return rfw_models.rfw_schemas.single_admin.dump(rfw)
Ejemplo n.º 18
0
def update_history(history_event_id, title, content, date, user_id, proposal_id):
    history_event = HistoryEvent.query.get(history_event_id)
    if not history_event:
        return {"message": "No history event matching that id"}, 404

    if user_id and not User.query.get(user_id):
        return {"message": "Invalid user ID"}, 400

    if proposal_id and not Proposal.query.get(proposal_id):
        return {"message": "Invalid proposal ID"}, 400

    # Update fields
    history_event.title = title
    history_event.content = content
    history_event.user_id = user_id
    history_event.proposal_id = proposal_id
    if date:
        history_event.date = datetime.fromtimestamp(date)

    db.session.add(history_event)
    admin.admin_log("HISTORY_EDIT", f"Edited history event {history_event.id} ({history_event.title})")
    db.session.commit()
    return history_event_schema.dump(history_event), 200
Ejemplo n.º 19
0
def post_2fa_enable(backup_codes, totp_secret, verify_code):
    admin.throw_on_2fa_not_allowed()
    admin.check_and_set_2fa_setup(backup_codes, totp_secret, verify_code)
    admin.admin_log("2FA_ENABLE", f"Enabled two factor authentication")
    db.session.commit()
    return make_2fa_state()
Ejemplo n.º 20
0
def edit_user(user_id, silenced, banned, banned_reason, is_admin):
    user = User.query.filter(User.id == user_id).first()
    if not user:
        return {"message": f"Could not find user with id {id}"}, 404

    if silenced is not None:
        user.set_silenced(silenced)
        if silenced:
            admin.admin_log("USER_SILENCE", f"Silenced user {user.id} ({user.display_name})")
        else:
            admin.admin_log("USER_UNSILENCE", f"Unsilenced user {user.id} ({user.display_name})")

    if banned is not None:
        if banned and not banned_reason:  # if banned true, provide reason
            return {"message": "Please include reason for banning"}, 417
        user.set_banned(banned, banned_reason)
        if banned:
            admin.admin_log("USER_BAN", f"Banned user {user.id} ({user.display_name}) for reason '{banned_reason}'")
        else:
            admin.admin_log("USER_UNBAN", f"Unbanned user {user.id} ({user.display_name})")

    if is_admin is not None:
        user.set_admin(is_admin)
        if is_admin:
            admin.admin_log("USER_ADMIN", f"Made user {user.id} ({user.display_name}) an admin")
        else:
            admin.admin_log("USER_ADMIN", f"Removed admin from user {user.id} ({user.display_name})")

    db.session.commit()
    return admin_user_schema.dump(user)
Ejemplo n.º 21
0
def upsert_tags(**kwargs):
    tag = tag_models.Tag.upsert(**kwargs)
    admin.admin_log("TAG_ADD", f"Added tag '{tag.text}'")
    db.session.commit()
    return tag_models.tag_schemas.single_admin.dump(tag)
Ejemplo n.º 22
0
def create_rfw(**kwargs):
    rfw = rfw_models.RFW.create(**kwargs)
    admin.admin_log("RFW_CREATE", f"Created RFW {rfw.id} ({rfw.title})")
    db.session.commit()
    return rfw_models.rfw_schemas.single_admin.dump(rfw), 200