mirror of
https://github.com/clearml/clearml-server
synced 2025-06-26 23:15:47 +00:00
Add created field to backend.user
This commit is contained in:
parent
04e7076628
commit
238a47a197
@ -38,6 +38,7 @@ class GetAllRequest(Base):
|
|||||||
class GetNextTaskRequest(QueueRequest):
|
class GetNextTaskRequest(QueueRequest):
|
||||||
queue = StringField(required=True)
|
queue = StringField(required=True)
|
||||||
get_task_info = BoolField(default=False)
|
get_task_info = BoolField(default=False)
|
||||||
|
task = StringField()
|
||||||
|
|
||||||
|
|
||||||
class DeleteRequest(QueueRequest):
|
class DeleteRequest(QueueRequest):
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
|
||||||
from apiserver.apierrors import errors
|
from apiserver.apierrors import errors
|
||||||
from apiserver.apimodels.users import CreateRequest
|
from apiserver.apimodels.users import CreateRequest
|
||||||
from apiserver.database.errors import translate_errors_context
|
from apiserver.database.errors import translate_errors_context
|
||||||
@ -12,7 +14,7 @@ class UserBLL:
|
|||||||
if user_id and User.objects(id=user_id).only("id"):
|
if user_id and User.objects(id=user_id).only("id"):
|
||||||
raise errors.bad_request.UserIdExists(id=user_id)
|
raise errors.bad_request.UserIdExists(id=user_id)
|
||||||
|
|
||||||
user = User(**request.to_struct())
|
user = User(**request.to_struct(), created=datetime.utcnow())
|
||||||
user.save(force_insert=True)
|
user.save(force_insert=True)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from mongoengine import Document, StringField, DynamicField
|
from mongoengine import Document, StringField, DynamicField, DateTimeField
|
||||||
|
|
||||||
from apiserver.database import Database, strict
|
from apiserver.database import Database, strict
|
||||||
from apiserver.database.model import DbModelMixin
|
from apiserver.database.model import DbModelMixin
|
||||||
@ -20,3 +20,4 @@ class User(DbModelMixin, Document):
|
|||||||
given_name = StringField(user_set_allowed=True)
|
given_name = StringField(user_set_allowed=True)
|
||||||
avatar = StringField()
|
avatar = StringField()
|
||||||
preferences = DynamicField(default="", exclude_by_default=True)
|
preferences = DynamicField(default="", exclude_by_default=True)
|
||||||
|
created = DateTimeField()
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import importlib.util
|
import importlib.util
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from inspect import signature
|
||||||
from logging import Logger
|
from logging import Logger
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pymongo.database
|
||||||
from mongoengine.connection import get_db
|
from mongoengine.connection import get_db
|
||||||
from packaging.version import Version, parse
|
from packaging.version import Version, parse
|
||||||
|
|
||||||
@ -80,8 +82,15 @@ def _apply_migrations(log: Logger):
|
|||||||
if not func:
|
if not func:
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
|
sig = signature(func)
|
||||||
|
kwargs = {}
|
||||||
|
if len(sig.parameters) == 2:
|
||||||
|
name, param = list(sig.parameters.items())[-1]
|
||||||
|
key = name.replace("_", "-")
|
||||||
|
if issubclass(param.annotation, pymongo.database.Database) and key in dbs:
|
||||||
|
kwargs[name] = get_db(key)
|
||||||
log.info(f"Applying {script.stem}/{func_name}()")
|
log.info(f"Applying {script.stem}/{func_name}()")
|
||||||
func(get_db(alias))
|
func(get_db(alias), **kwargs)
|
||||||
except Exception:
|
except Exception:
|
||||||
log.exception(f"Failed applying {script}:{func_name}()")
|
log.exception(f"Failed applying {script}:{func_name}()")
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
|
@ -53,6 +53,7 @@ def _ensure_backend_user(user_id: str, company_id: str, user_name: str):
|
|||||||
name=user_name,
|
name=user_name,
|
||||||
given_name=given_name,
|
given_name=given_name,
|
||||||
family_name=family_name,
|
family_name=family_name,
|
||||||
|
created=datetime.utcnow(),
|
||||||
).save()
|
).save()
|
||||||
|
|
||||||
return user_id
|
return user_id
|
||||||
|
15
apiserver/mongo/migrations/1_7_0.py
Normal file
15
apiserver/mongo/migrations/1_7_0.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from pymongo.collection import Collection
|
||||||
|
from pymongo.database import Database
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_backend(db: Database, auth_db: Database):
|
||||||
|
users: Collection = db["user"]
|
||||||
|
auth_users: Collection = auth_db["user"]
|
||||||
|
created_field = "created"
|
||||||
|
for doc in users.find({created_field: {"$exists": False}}):
|
||||||
|
auth_user = auth_users.find_one({"_id": doc["_id"]}, projection=[created_field])
|
||||||
|
if not auth_user or created_field not in auth_user:
|
||||||
|
continue
|
||||||
|
users.update_one(
|
||||||
|
{"_id": doc["_id"]}, {"$set": {created_field: auth_user[created_field]}}
|
||||||
|
)
|
@ -463,6 +463,33 @@ get_next_task {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"2.14": ${get_next_task."2.4"} {
|
||||||
|
request.properties.get_task_info {
|
||||||
|
description: "If set then additional task info is returned"
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
response.properties.task_info {
|
||||||
|
description: "Info about the returned task. Returned only if get_task_info is set to True"
|
||||||
|
type: object
|
||||||
|
properties {
|
||||||
|
company {
|
||||||
|
description: Task company ID
|
||||||
|
type: string
|
||||||
|
}
|
||||||
|
user {
|
||||||
|
description: ID of the user who created the task
|
||||||
|
type: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"999.0": ${get_next_task."2.14"} {
|
||||||
|
request.properties.task {
|
||||||
|
description: Task company ID
|
||||||
|
type: string
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
remove_task {
|
remove_task {
|
||||||
"2.4" {
|
"2.4" {
|
||||||
|
@ -157,11 +157,13 @@ def add_task(call: APICall, company_id, req_model: TaskRequest):
|
|||||||
|
|
||||||
|
|
||||||
@endpoint("queues.get_next_task", request_data_model=GetNextTaskRequest)
|
@endpoint("queues.get_next_task", request_data_model=GetNextTaskRequest)
|
||||||
def get_next_task(call: APICall, company_id, req_model: GetNextTaskRequest):
|
def get_next_task(call: APICall, company_id, request: GetNextTaskRequest):
|
||||||
entry = queue_bll.get_next_task(company_id=company_id, queue_id=req_model.queue)
|
entry = queue_bll.get_next_task(
|
||||||
|
company_id=company_id, queue_id=request.queue, task_id=request.task
|
||||||
|
)
|
||||||
if entry:
|
if entry:
|
||||||
data = {"entry": entry.to_proper_dict()}
|
data = {"entry": entry.to_proper_dict()}
|
||||||
if req_model.get_task_info:
|
if request.get_task_info:
|
||||||
task = Task.objects(id=entry.task).first()
|
task = Task.objects(id=entry.task).first()
|
||||||
if task:
|
if task:
|
||||||
data["task_info"] = {"company": task.company, "user": task.user}
|
data["task_info"] = {"company": task.company, "user": task.user}
|
||||||
|
@ -12,7 +12,7 @@ from apiserver.bll.project import ProjectBLL
|
|||||||
from apiserver.bll.user import UserBLL
|
from apiserver.bll.user import UserBLL
|
||||||
from apiserver.config_repo import config
|
from apiserver.config_repo import config
|
||||||
from apiserver.database.errors import translate_errors_context
|
from apiserver.database.errors import translate_errors_context
|
||||||
from apiserver.database.model.auth import Role, User as AuthUser
|
from apiserver.database.model.auth import Role
|
||||||
from apiserver.database.model.company import Company
|
from apiserver.database.model.company import Company
|
||||||
from apiserver.database.model.user import User
|
from apiserver.database.model.user import User
|
||||||
from apiserver.database.utils import parse_from_call
|
from apiserver.database.utils import parse_from_call
|
||||||
@ -114,12 +114,6 @@ def get_current_user(call: APICall, company_id, _):
|
|||||||
user = res[0]
|
user = res[0]
|
||||||
user["role"] = call.identity.role
|
user["role"] = call.identity.role
|
||||||
|
|
||||||
auth_user: AuthUser = AuthUser.objects(id=user_id, company=company_id).first()
|
|
||||||
if not auth_user:
|
|
||||||
raise errors.bad_request.InvalidUser("failed loading user")
|
|
||||||
|
|
||||||
user["created"] = auth_user.created
|
|
||||||
|
|
||||||
resp = {
|
resp = {
|
||||||
"user": user,
|
"user": user,
|
||||||
"getting_started": config.get("apiserver.getting_started_info", None),
|
"getting_started": config.get("apiserver.getting_started_info", None),
|
||||||
|
@ -91,7 +91,6 @@ class TestQueues(TestService):
|
|||||||
self.assertEqual(res.task.status, "queued")
|
self.assertEqual(res.task.status, "queued")
|
||||||
|
|
||||||
self.api.queues.delete(queue=queue, force=True)
|
self.api.queues.delete(queue=queue, force=True)
|
||||||
self.api.tasks.dequeue(task=task)
|
|
||||||
res = self.api.tasks.get_by_id(task=task)
|
res = self.api.tasks.get_by_id(task=task)
|
||||||
self.assertEqual(res.task.status, "created")
|
self.assertEqual(res.task.status, "created")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user