Add created field to backend.user

This commit is contained in:
allegroai 2022-09-29 19:29:36 +03:00
parent 04e7076628
commit 238a47a197
10 changed files with 65 additions and 14 deletions

View File

@ -38,6 +38,7 @@ class GetAllRequest(Base):
class GetNextTaskRequest(QueueRequest):
queue = StringField(required=True)
get_task_info = BoolField(default=False)
task = StringField()
class DeleteRequest(QueueRequest):

View File

@ -1,3 +1,5 @@
from datetime import datetime
from apiserver.apierrors import errors
from apiserver.apimodels.users import CreateRequest
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"):
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)
@staticmethod

View File

@ -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.model import DbModelMixin
@ -20,3 +20,4 @@ class User(DbModelMixin, Document):
given_name = StringField(user_set_allowed=True)
avatar = StringField()
preferences = DynamicField(default="", exclude_by_default=True)
created = DateTimeField()

View File

@ -1,8 +1,10 @@
import importlib.util
from datetime import datetime
from inspect import signature
from logging import Logger
from pathlib import Path
import pymongo.database
from mongoengine.connection import get_db
from packaging.version import Version, parse
@ -80,8 +82,15 @@ def _apply_migrations(log: Logger):
if not func:
continue
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}()")
func(get_db(alias))
func(get_db(alias), **kwargs)
except Exception:
log.exception(f"Failed applying {script}:{func_name}()")
raise ValueError(

View File

@ -53,6 +53,7 @@ def _ensure_backend_user(user_id: str, company_id: str, user_name: str):
name=user_name,
given_name=given_name,
family_name=family_name,
created=datetime.utcnow(),
).save()
return user_id

View 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]}}
)

View File

@ -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 {
"2.4" {

View File

@ -157,11 +157,13 @@ def add_task(call: APICall, company_id, req_model: TaskRequest):
@endpoint("queues.get_next_task", request_data_model=GetNextTaskRequest)
def get_next_task(call: APICall, company_id, req_model: GetNextTaskRequest):
entry = queue_bll.get_next_task(company_id=company_id, queue_id=req_model.queue)
def get_next_task(call: APICall, company_id, request: GetNextTaskRequest):
entry = queue_bll.get_next_task(
company_id=company_id, queue_id=request.queue, task_id=request.task
)
if entry:
data = {"entry": entry.to_proper_dict()}
if req_model.get_task_info:
if request.get_task_info:
task = Task.objects(id=entry.task).first()
if task:
data["task_info"] = {"company": task.company, "user": task.user}

View File

@ -12,7 +12,7 @@ from apiserver.bll.project import ProjectBLL
from apiserver.bll.user import UserBLL
from apiserver.config_repo import config
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.user import User
from apiserver.database.utils import parse_from_call
@ -114,12 +114,6 @@ def get_current_user(call: APICall, company_id, _):
user = res[0]
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 = {
"user": user,
"getting_started": config.get("apiserver.getting_started_info", None),

View File

@ -91,7 +91,6 @@ class TestQueues(TestService):
self.assertEqual(res.task.status, "queued")
self.api.queues.delete(queue=queue, force=True)
self.api.tasks.dequeue(task=task)
res = self.api.tasks.get_by_id(task=task)
self.assertEqual(res.task.status, "created")