shout under organization

This commit is contained in:
knst-kotov 2021-08-08 12:23:12 +00:00
parent f37c1f4839
commit a146a8dd1d
3 changed files with 61 additions and 18 deletions

View File

@ -9,9 +9,17 @@ from orm.base import Base
class Shout(Base):
__tablename__ = 'shout'
id = None
slug: str = Column(String, primary_key=True)
org: str = Column(String, nullable=False)
author_id: str = Column(ForeignKey("user.id"), nullable=False, comment="Author")
body: str = Column(String, nullable=False, comment="Body")
createdAt: str = Column(DateTime, nullable=False, default = datetime.now, comment="Created at")
updatedAt: str = Column(DateTime, nullable=True, comment="Updated at")
replyTo: str = Column(ForeignKey("shout.slug"), nullable=True)
versionOf: str = Column(ForeignKey("shout.slug"), nullable=True)
tags: str = Column(String, nullable=True)
topics: str = Column(String, nullable=True)
# TODO: add all the fields

View File

@ -9,32 +9,49 @@ from settings import SHOUTS_REPO
import subprocess
import asyncio
from pathlib import Path
class GitTask:
queue = asyncio.Queue()
def __init__(self, shout_id, shout_body, username, user_email, comment):
self.shout_id = shout_id;
self.shout_body = shout_body;
def __init__(self, input, username, user_email, comment):
self.slug = input["slug"];
self.org = input["org"];
self.shout_body = input["body"];
self.username = username;
self.user_email = user_email;
self.comment = comment;
GitTask.queue.put_nowait(self)
def execute(self):
cmd = "cd %s; git checkout master" % (SHOUTS_REPO)
def init_repo(self):
repo_path = "%s/%s" % (SHOUTS_REPO, self.org)
Path(repo_path).mkdir()
cmd = "cd %s && git init && touch initial && git add initial && git commit -m 'init repo'" % (repo_path)
output = subprocess.check_output(cmd, shell=True)
print(output)
shout_filename = "shout%s.md" % (self.shout_id)
shout_full_filename = "%s/%s" % (SHOUTS_REPO, shout_filename)
def execute(self):
repo_path = "%s/%s" % (SHOUTS_REPO, self.org)
if not Path(repo_path).exists():
self.init_repo()
cmd = "cd %s && git checkout master" % (repo_path)
output = subprocess.check_output(cmd, shell=True)
print(output)
shout_filename = "%s.md" % (self.slug)
shout_full_filename = "%s/%s" % (repo_path, shout_filename)
with open(shout_full_filename, mode='w', encoding='utf-8') as shout_file:
shout_file.write(self.shout_body)
author = "%s <%s>" % (self.username, self.user_email)
cmd = "cd %s; git add %s; git commit -m '%s' --author='%s'" % \
(SHOUTS_REPO, shout_filename, self.comment, author)
cmd = "cd %s && git add %s && git commit -m '%s' --author='%s'" % \
(repo_path, shout_filename, self.comment, author)
output = subprocess.check_output(cmd, shell=True)
print(output)
@ -63,7 +80,7 @@ async def top_shouts(_, info):
@mutation.field("createShout")
@login_required
async def create_shout(_, info, body):
async def create_shout(_, info, input):
auth = info.context["request"].auth
user_id = auth.user_id
@ -71,16 +88,21 @@ async def create_shout(_, info, body):
user = session.query(User).filter(User.id == user_id).first()
new_shout = Shout.create(
slug = input["slug"],
org = input["org"],
author_id = user_id,
body = body
body = input["body"],
replyTo = input.get("replyTo"),
versionOf = input.get("versionOf"),
tags = input.get("tags"),
topics = input.get("topics")
)
task = GitTask(
new_shout.id,
body,
input,
user.username,
user.email,
"new shout %s" % (new_shout.id)
"new shout %s" % (new_shout.slug)
)
return {

View File

@ -22,6 +22,19 @@ type MessageResult {
message: Message
}
input ShoutInput {
org: String!
slug: String!
body: String!
replyTo: String # another shout
tags: [String] # actual values
topics: [String] # topic-slugs
title: String
versionOf: String
visibleForRoles: [String] # role ids are strings
visibleForUsers: [Int]
}
type ShoutResult {
error: String
shout: Shout
@ -45,9 +58,9 @@ type Mutation {
registerUser(email: String!, password: String!): SignInResult!
# shout
createShout(body: String!): ShoutResult!
deleteShout(shoutId: Int!): Result!
rateShout(shoutId: Int!, value: Int!): Result!
createShout(input: ShoutInput!): ShoutResult!
deleteShout(slug: String!): Result!
rateShout(slug: String!, value: Int!): Result!
# profile
# rateUser(value: Int!): ResultPayload!