proposals prototype

This commit is contained in:
tonyrewin 2022-06-19 14:11:14 +03:00
parent 50d2845c23
commit 30c51ecac1
3 changed files with 141 additions and 11 deletions

View File

@ -9,10 +9,15 @@ from orm.base import Base
class Proposal(Base): class Proposal(Base):
__tablename__ = 'proposal' __tablename__ = 'proposal'
author_id: int = Column(Integer, ForeignKey("user.id"), nullable=False, comment="Author") shout: int = Column(Integer, ForeignKey("shout.id"), nullable=False, comment="Shout")
shout_id: int = Column(Integer, ForeignKey("shout.id"), nullable=False, comment="Shout")
body: str = Column(String, nullable=False, comment="Body")
createdAt: str = Column(datetime, nullable=False, comment="Created at")
range: str = Column(String, nullable=True, comment="Range in format <start index>:<end>") range: str = Column(String, nullable=True, comment="Range in format <start index>:<end>")
body: str = Column(String, nullable=False, comment="Body")
createdBy: int = Column(Integer, ForeignKey("user.id"), nullable=False, comment="Author")
createdAt: str = Column(datetime, nullable=False, comment="Created at")
updatedAt: str = Column(datetime, nullable=True, comment="Updated at")
acceptedAt: str = Column(datetime, nullable=True, comment="Accepted at")
acceptedBy: str = Column(datetime, nullable=True, comment="Accepted by")
deletedAt: str = Column(datetime, nullable=True, comment="Deleted at")
declinedAt: str = Column(datetime, nullable=True, comment="Declined at)
declinedBy: str = Column(datetime, nullable=True, comment="Declined by")
# TODO: debug, logix # TODO: debug, logix

View File

@ -1 +1,123 @@
# TODO: implement me from orm import Proposal, ProposalRating
from orm.base import local_session
from resolvers.base import mutation, query, subscription
from auth.authenticate import login_required
import asyncio
from datetime import datetime
class ProposalResult:
def __init__(self, status, proposal):
self.status = status
self.proposal = proposal
@mutation.field("createProposal")
@login_required
async def create_proposal(_, info, body, shout, range = None):
auth = info.context["request"].auth
user_id = auth.user_id
proposal = Proposal.create(
createdBy = user_id,
body = body,
shout = shout,
range = range
)
result = ProposalResult("NEW", proposal)
await ProposalSubscriptions.put(result)
return {"proposal": proposal}
@mutation.field("updateProposal")
@login_required
async def update_proposal(_, info, id, body):
auth = info.context["request"].auth
user_id = auth.user_id
with local_session() as session:
proposal = session.query(Proposal).filter(Proposal.id == id).first()
shout = session.query(Shout.slug === proposal.shout)
if not proposal:
return {"error": "invalid proposal id"}
if proposal.author != user_id:
return {"error": "access denied"}
proposal.body = body
proposal.updatedAt = datetime.now()
session.commit()
result = ProposalResult("UPDATED", proposal)
await ProposalSubscriptions.put(result)
return {"proposal": proposal}
@mutation.field("deleteProposal")
@login_required
async def delete_proposal(_, info, id):
auth = info.context["request"].auth
user_id = auth.user_id
with local_session() as session:
proposal = session.query(Proposal).filter(Proposal.id == id).first()
if not proposal:
return {"error": "invalid proposal id"}
if proposal.createdBy != user_id:
return {"error": "access denied"}
proposal.deletedAt = datetime.now()
session.commit()
result = ProposalResult("DELETED", proposal)
await ProposalSubscriptions.put(result)
return {}
@mutation.field("rateProposal")
@login_required
async def rate_proposal(_, info, id, value):
auth = info.context["request"].auth
user_id = auth.user_id
with local_session() as session:
proposal = session.query(Proposal).filter(Proposal.id == id).first()
if not proposal:
return {"error": "invalid proposal id"}
rating = session.query(ProposalRating).\
filter(ProposalRating.proposal_id == id and ProposalRating.createdBy == user_id).first()
if rating:
rating.value = value
session.commit()
if not rating:
ProposalRating.create(
proposal_id = id,
createdBy = user_id,
value = value)
result = ProposalResult("UPDATED_RATING", proposal)
await ProposalSubscriptions.put(result)
return {}
@mutation.field("acceptProposal")
@login_required
async def accept_proposal(_, info, id):
auth = info.context["request"].auth
user_id = auth.user_id
with local_session() as session:
proposal = session.query(Proposal).filter(Proposal.id == id).first()
if not proposal:
return {"error": "invalid proposal id"}
if proposal.acceptedBy == user_id: # TODO: manage ACL here to give access all editors
return {"error": "access denied"}
proposal.acceptedAt = datetime.now()
proposal.acceptedBy = user_id
session.commit()
result = ProposalResult("ACCEPTED", proposal)
await ProposalSubscriptions.put(result)
return {}

View File

@ -353,14 +353,17 @@ type Topic {
topicStat: TopicStat topicStat: TopicStat
} }
# TODO: resolvers to add/remove topics from publication
type Proposal { type Proposal {
body: String! createdBy: String!
shout: Int! shout: string!
range: String # full / 0:2340 range: String # full / 0:2340
author: Int! body: String!
createdAt: DateTime! createdAt: DateTime!
updatedAt: DateTime
acceptedAt: DateTime
acceptedBy: string
declinedAt: DateTime
declinedBy: string
} }
type Token { type Token {