Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def post(self, project_id, document_id):
obj = self.get_json()
document = self.get_document(project_id, document_id)
if obj:
if 'name' in obj:
document.name = obj['name']
if 'description' in obj:
document.description = obj['description']
cmd = database.Command.document_add(
self.current_user,
document,
)
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(document.project_id, cmd)
self.send_json({'id': document.id})
def post(self, project_id):
obj = self.get_json()
project = self.get_project(project_id)
tag = database.Tag(project=project,
path=obj['path'], description=obj['description'])
try:
self.db.add(tag)
self.db.flush() # Need to flush to get tag.id
except IntegrityError:
self.db.rollback()
self.set_status(409)
return self.finish()
cmd = database.Command.tag_add(
self.current_user,
tag,
)
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(project.id, cmd)
self.send_json({'id': tag.id})
assert isinstance(project_id, int)
return cls(
user_login=user_login,
project_id=project_id,
payload={'type': 'member_remove', # keep in sync above
'member': member_login}
)
Project.last_event = column_property(
select(
[Command.id]
).where(
Command.project_id == Project.id
).order_by(
Command.id.desc()
).limit(1)
.as_scalar()
)
class Highlight(Base):
__tablename__ = 'highlights'
id = Column(Integer, primary_key=True)
document_id = Column(Integer, ForeignKey('documents.id',
ondelete='CASCADE'),
nullable=False, index=True)
document = relationship('Document', back_populates='highlights')
start_offset = Column(Integer, nullable=False)
end_offset = Column(Integer, nullable=False)
snippet = Column(Text, nullable=False)
return self.send_json({'error': "Unauthorized"})
try:
obj = self.get_json()
validate.tag_path(obj['path'])
validate.tag_description(obj['description'])
tag = database.Tag(project=project,
path=obj['path'],
description=obj['description'])
try:
self.db.add(tag)
self.db.flush() # Need to flush to get tag.id
except IntegrityError:
self.db.rollback()
self.set_status(409)
return self.finish()
cmd = database.Command.tag_add(
self.current_user,
tag,
)
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(project.id, cmd)
return self.send_json({'id': tag.id})
except validate.InvalidFormat as e:
logger.info("Error validating TagAdd: %r", e)
self.set_status(e.status_code, e.reason)
return self.send_json({'error': e.message})
def delete(self, project_id, tag_id):
project = self.get_project(project_id)
tag = self.db.query(database.Tag).get(int(tag_id))
if tag.project_id != project.id:
raise HTTPError(404)
self.db.delete(tag)
cmd = database.Command.tag_delete(
self.current_user,
project.id,
tag.id,
)
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(project.id, cmd)
self.set_status(204)
self.finish()
def post(self, project_id):
project, privileges = self.get_project(project_id)
if not privileges.can_edit_project_meta():
self.set_status(403)
return self.send_json({'error': "Unauthorized"})
try:
obj = self.get_json()
validate.project_name(obj['name'])
project.name = obj['name']
validate.project_description(obj['description'])
project.description = obj['description']
logger.info("Updated project: %r %r",
project.name, project.description)
cmd = database.Command.project_meta(
self.current_user,
project.id,
obj['name'],
obj['description'],
)
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(project.id, cmd)
return self.send_json({})
except validate.InvalidFormat as e:
logger.info("Error validating ProjectMeta: %r", e)
self.set_status(e.status_code, e.reason)
return self.send_json({'error': e.message})
document, privileges = self.get_document(project_id, document_id)
if not privileges.can_delete_highlight():
self.set_status(403)
return self.send_json({'error': "Unauthorized"})
hl = self.db.query(database.Highlight).get(int(highlight_id))
if hl is None or hl.document_id != document.id:
self.set_status(404)
return self.send_json({'error': "No such highlight"})
old_tags = list(
self.db.query(database.HighlightTag)
.filter(database.HighlightTag.highlight == hl)
.all()
)
old_tags = [hl_tag.tag_id for hl_tag in old_tags]
self.db.delete(hl)
cmd = database.Command.highlight_delete(
self.current_user,
document,
hl.id,
)
cmd.tag_count_changes = {tag: -1 for tag in old_tags}
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(document.project_id, cmd)
self.set_status(204)
return self.finish()
self.db.query(database.HighlightTag)
.filter(database.HighlightTag.tag_id == tag_src.id)
.filter(database.HighlightTag.highlight_id.in_(
highlights_in_dest
))
).delete(synchronize_session=False)
# Update tags that are in tag_src to be in tag_dest
self.db.execute(
database.HighlightTag.__table__.update()
.where(database.HighlightTag.tag_id == tag_src.id)
.values(tag_id=tag_dest.id)
)
# Delete tag_src
self.db.delete(tag_src)
cmd = database.Command.tag_merge(
self.current_user,
project.id,
tag_src.id,
tag_dest.id,
)
self.db.add(cmd)
self.db.commit()
self.db.refresh(cmd)
self.application.notify_project(project.id, cmd)
return self.send_json({'id': tag_dest.id})
async def get(self, project_id):
ProjectEvents.polling_clients.add(self.request.remote_ip)
tornado.log.access_log.info(
"started %s %s (%s)",
self.request.method,
self.request.uri,
self.request.remote_ip,
)
from_id = int(self.get_query_argument('from'))
project, _ = self.get_project(project_id)
self.project_id = int(project_id)
# Check for immediate update
cmd = (
self.db.query(database.Command)
.filter(database.Command.id > from_id)
.filter(database.Command.project_id == project.id)
.limit(1)
).one_or_none()
# Wait for an event
if cmd is None:
self.wait_future = Future()
self.application.observe_project(project.id, self.wait_future)
self.db.expire_all()
# Close DB connection to not overflow the connection pool
self.close_db_connection()
try:
cmd = await self.wait_future
self.db.query(database.ProjectMember)
.filter(database.ProjectMember.project_id == project.id)
).all()
members = {member.user_login: member for member in members}
# Go over the JSON patch and update
obj = self.get_json()
commands = []
for login, user in obj.items():
login = validate.user_login(login)
if login == self.current_user:
logger.warning("User tried to change own privileges")
continue
if not user and login in members:
self.db.delete(members[login])
cmd = database.Command.member_remove(
self.current_user, project.id,
login,
)
self.db.add(cmd)
commands.append(cmd)
else:
try:
privileges = database.Privileges[user['privileges']]
except KeyError:
self.set_status(400)
return self.send_json({'error': "Invalid privileges %r" %
user.get('privileges')})
if login in members:
members[login].privileges = privileges
else:
self.db.add(