project item updated
This commit is contained in:
parent
0b3e0c299c
commit
73d41b8e10
|
|
@ -310,7 +310,6 @@ class DecisionBookDecisionBookItemsCreateEventMethods(MethodToEvent):
|
|||
service_id=related_service.id,
|
||||
build_living_space_id=project_leader.id,
|
||||
)
|
||||
|
||||
project_person = BuildDecisionBookProjectPerson.find_or_create(
|
||||
build_decision_book_project_id=book_project_created.id,
|
||||
build_decision_book_project_uu_id=str(book_project_created.uu_id),
|
||||
|
|
@ -318,8 +317,12 @@ class DecisionBookDecisionBookItemsCreateEventMethods(MethodToEvent):
|
|||
living_space_uu_id=str(project_leader.uu_id),
|
||||
)
|
||||
project_person.save_and_confirm()
|
||||
book_project_created.update(
|
||||
project_response_living_space_id=project_leader.id,
|
||||
project_response_living_space_uu_id=str(project_leader.uu_id),
|
||||
)
|
||||
book_project_created.save()
|
||||
return book_project_created
|
||||
|
||||
elif data_info_type.key == "BDT-S":
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
|
|
|
|||
|
|
@ -157,7 +157,6 @@ class ProjectDecisionBookUpdateEventMethods(MethodToEvent):
|
|||
message="Living space not found",
|
||||
data={},
|
||||
)
|
||||
|
||||
occupant_type = OccupantTypes.filter_by_one(
|
||||
occupant_category_type="PRJ",
|
||||
occupant_code="PRJ-LDR",
|
||||
|
|
@ -170,11 +169,10 @@ class ProjectDecisionBookUpdateEventMethods(MethodToEvent):
|
|||
message=f"{token_dict.selected_occupant.occupant_type_uu_id} occupant type is not allowed, only PRJ-LDR occupant type is allowed",
|
||||
data={},
|
||||
)
|
||||
|
||||
decision_book_project_person = BuildDecisionBookProjectPerson.filter_one(
|
||||
BuildDecisionBookProjects.build_decision_book_project_uu_id
|
||||
== data.get("build_decision_book_project_uu_id"),
|
||||
BuildDecisionBookProjects.living_space_id
|
||||
BuildDecisionBookProjectPerson.build_decision_book_project_uu_id
|
||||
== data.build_decision_book_project_uu_id,
|
||||
BuildDecisionBookProjectPerson.living_space_id
|
||||
== token_dict.selected_occupant.living_space_id,
|
||||
).data
|
||||
if not decision_book_project_person:
|
||||
|
|
@ -237,6 +235,7 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent):
|
|||
data={},
|
||||
)
|
||||
occupant_type = OccupantTypes.filter_by_one(
|
||||
system=True,
|
||||
occupant_category_type="PRJ",
|
||||
occupant_code="PRJ-LDR",
|
||||
id=living_space.occupant_type,
|
||||
|
|
@ -248,15 +247,14 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent):
|
|||
message=f"{token_dict.selected_occupant.occupant_type_uu_id} occupant type is not allowed, only PRJ-LDR occupant type is allowed",
|
||||
data={},
|
||||
)
|
||||
|
||||
decision_book_project_person = BuildDecisionBookProjectPerson.filter_one(
|
||||
BuildDecisionBookProjects.build_decision_book_project_uu_id
|
||||
== data.get("build_decision_book_project_uu_id"),
|
||||
BuildDecisionBookProjects.living_space_id
|
||||
BuildDecisionBookProjectPerson.build_decision_book_project_uu_id
|
||||
== data.build_decision_book_project_uu_id,
|
||||
BuildDecisionBookProjectPerson.living_space_id
|
||||
== token_dict.selected_occupant.living_space_id,
|
||||
).data
|
||||
if not decision_book_project_person:
|
||||
raise BuildDecisionBookProjects.raise_http_exception(
|
||||
raise BuildDecisionBookProjectPerson.raise_http_exception(
|
||||
status_code="HTTP_404_NOT_FOUND",
|
||||
error_case="NOT_FOUND",
|
||||
message="This project is not allowed for this occupant",
|
||||
|
|
@ -275,7 +273,6 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent):
|
|||
)
|
||||
data_dict = data.excluded_dump()
|
||||
data_dict["is_completed"] = True
|
||||
data_dict["status_id"] = 1 # is completed status
|
||||
|
||||
build_parts_list = BuildParts.filter_all(
|
||||
BuildParts.human_livable == True,
|
||||
|
|
@ -288,13 +285,12 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent):
|
|||
).data
|
||||
|
||||
book_payment_dict = dict(
|
||||
payment_plan_time_periods=str(),
|
||||
build_decision_book_item_id=decision_book_project_item.id,
|
||||
build_decision_book_item_uu_id=str(decision_book_project_item.uu_id),
|
||||
currency=decision_book_project.currency,
|
||||
)
|
||||
payment_type = ApiEnumDropdown.get_debit_search(search_debit="DT-D")
|
||||
for final_price in data.final_price_list:
|
||||
for final_price in data.final_price_list or []:
|
||||
for build_part_single in build_parts_list:
|
||||
local_date = BuildDecisionBookPayments.client_arrow.get(
|
||||
str(final_price["date"])
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ from api_validations.validations_request import (
|
|||
from api_events.events.abstract_class import MethodToEvent, ActionsSchema
|
||||
from api_objects.auth.token_objects import EmployeeTokenObject, OccupantTokenObject
|
||||
from api_validations.core_response import AlchemyJsonResponse
|
||||
from databases.sql_models.building.decision_book import BuildDecisionBookProjects
|
||||
|
||||
|
||||
class BuildDecisionBookProjectItemsListEventMethods(MethodToEvent):
|
||||
|
|
@ -47,17 +48,36 @@ class BuildDecisionBookProjectItemsCreateEventMethods(MethodToEvent):
|
|||
|
||||
@staticmethod
|
||||
def build_decision_book_project_items_create(
|
||||
requester: Union[EmployeeTokenObject, OccupantTokenObject],
|
||||
decision_book_project_items: InsertBuildDecisionBookProjectItems,
|
||||
token_dict: Union[EmployeeTokenObject, OccupantTokenObject],
|
||||
data: InsertBuildDecisionBookProjectItems,
|
||||
):
|
||||
response = BuildDecisionBookProjectItems.create_item(
|
||||
requester=requester,
|
||||
decision_book_project_items=decision_book_project_items,
|
||||
)
|
||||
return AlchemyJsonResponse(
|
||||
message="Build Decision Book Project Items Create",
|
||||
result=response,
|
||||
)
|
||||
if isinstance(token_dict, EmployeeTokenObject):
|
||||
raise BuildDecisionBookProjectItems.raise_http_exception(
|
||||
status_code="HTTP_403_FORBIDDEN",
|
||||
error_case="UNAUTHORIZED",
|
||||
message=f"No permission to create decision book project items",
|
||||
data={},
|
||||
)
|
||||
elif isinstance(token_dict, OccupantTokenObject):
|
||||
book_project = BuildDecisionBookProjects.filter_one(
|
||||
BuildDecisionBookProjects.uu_id == data.build_decision_book_project_uu_id,
|
||||
BuildDecisionBookProjects.project_response_living_space_id == token_dict.selected_occupant.living_space_id
|
||||
).data
|
||||
if not book_project:
|
||||
raise BuildDecisionBookProjectItems.raise_http_exception(
|
||||
status_code="HTTP_404_NOT_FOUND",
|
||||
error_case="NOT_FOUND",
|
||||
message=f"This user can not create project item for this project uu_id : {data.build_decision_book_project_uu_id}",
|
||||
data={},
|
||||
)
|
||||
data_dict = data.excluded_dump()
|
||||
data_dict["build_decision_book_project_id"] = book_project.id
|
||||
created_project_item = BuildDecisionBookProjectItems.find_or_create(**data_dict)
|
||||
created_project_item.save_and_confirm()
|
||||
return AlchemyJsonResponse(
|
||||
message="Build Decision Book Project Items Create",
|
||||
result=created_project_item.get_dict(),
|
||||
)
|
||||
|
||||
|
||||
class BuildDecisionBookProjectItemsUpdateEventMethods(MethodToEvent):
|
||||
|
|
|
|||
|
|
@ -77,8 +77,9 @@ class UpdateBuildDecisionBookProjects(PydanticBaseModel):
|
|||
|
||||
class ApprovalsBuildDecisionBookProjects(PydanticBaseModel):
|
||||
build_decision_book_project_uu_id: str
|
||||
final_price_list: list[dict] # {"date": "2021-01-01", "price": 1000}
|
||||
project_stop_date: str
|
||||
status_code: Optional[int] = None
|
||||
final_price_list: Optional[list[dict]] = None # {"date": "2021-01-01", "price": 1000}
|
||||
|
||||
|
||||
class InsertBuildDecisionBookProjectItemDebits(PydanticBaseModel):
|
||||
|
|
|
|||
|
|
@ -1018,7 +1018,6 @@ class BuildDecisionBookProjects(CrudCollection):
|
|||
project_start_date: Mapped[TIMESTAMP] = mapped_column(
|
||||
TIMESTAMP, nullable=False, comment="Project Start Date"
|
||||
)
|
||||
|
||||
project_stop_date: Mapped[TIMESTAMP] = mapped_column(
|
||||
TIMESTAMP, server_default="2099-12-31 23:59:59"
|
||||
)
|
||||
|
|
@ -1031,7 +1030,7 @@ class BuildDecisionBookProjects(CrudCollection):
|
|||
is_completed: Mapped[bool] = mapped_column(
|
||||
Boolean, server_default="0", comment="Project is Completed"
|
||||
)
|
||||
status_id: Mapped[int] = mapped_column(SmallInteger, nullable=True)
|
||||
status_code: Mapped[int] = mapped_column(SmallInteger, nullable=True)
|
||||
resp_company_fix_wage: Mapped[float] = mapped_column(
|
||||
Numeric(10, 2), server_default="0"
|
||||
)
|
||||
|
|
@ -1040,7 +1039,7 @@ class BuildDecisionBookProjects(CrudCollection):
|
|||
meeting_date: Mapped[TIMESTAMP] = mapped_column(
|
||||
TIMESTAMP, server_default="1900-01-01 00:00:00", index=True
|
||||
)
|
||||
currency: Mapped[float] = mapped_column(String(8), server_default="TRY")
|
||||
currency: Mapped[str] = mapped_column(String(8), server_default="TRY")
|
||||
bid_price: Mapped[float] = mapped_column(Numeric(16, 4), server_default="0")
|
||||
approved_price: Mapped[float] = mapped_column(Numeric(16, 4), server_default="0")
|
||||
final_price: Mapped[float] = mapped_column(Numeric(16, 4), server_default="0")
|
||||
|
|
@ -1057,7 +1056,7 @@ class BuildDecisionBookProjects(CrudCollection):
|
|||
build_decision_book_uu_id: Mapped[str] = mapped_column(
|
||||
String, nullable=True, comment="Decision Book UUID"
|
||||
)
|
||||
build_decision_book_item_id = mapped_column(
|
||||
build_decision_book_item_id: Mapped[int] = mapped_column(
|
||||
ForeignKey("build_decision_book_items.id"), nullable=False
|
||||
)
|
||||
build_decision_book_item_uu_id: Mapped[str] = mapped_column(
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ def build_decision_book_project_people_update(
|
|||
|
||||
|
||||
@build_decision_book_project_route.post(
|
||||
path="/approval/{build_decision_book_project_id}",
|
||||
path="/approval",
|
||||
summary="Approval people from Build Decision Book Project People with given auth levels",
|
||||
)
|
||||
def build_decision_book_project_invite_approval(
|
||||
|
|
|
|||
|
|
@ -28,8 +28,9 @@ def generate_approval_project_item(**kwargs):
|
|||
"build_decision_book_project_uu_id": kwargs.get(
|
||||
"build_decision_book_project_uu_id", None
|
||||
),
|
||||
"final_price_list": kwargs.get("final_price_list", []),
|
||||
"final_price_list": kwargs.get("final_price_list", None),
|
||||
"project_stop_date": kwargs.get("project_stop_date", None),
|
||||
"status_code": kwargs.get("status_code", None),
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -43,7 +44,7 @@ def generate_insert_project_item(**kwargs):
|
|||
}
|
||||
|
||||
|
||||
def create_decision_book_items(requester, insert_project_item):
|
||||
def create_decision_book_project_items(requester, insert_project_item):
|
||||
response = requester.post(
|
||||
endpoint="/build/decision_book/project/items/create", data=insert_project_item
|
||||
)
|
||||
|
|
@ -66,3 +67,16 @@ def approve_build_decision_book_project_approval(requester, approval_project_ite
|
|||
)
|
||||
print("text", response.text)
|
||||
print("json", response.json())
|
||||
|
||||
|
||||
def list_decision_book_project(requester, project_no):
|
||||
response = requester.post(
|
||||
endpoint="/build/decision_book/project/list",
|
||||
data={"query": {"project_no": project_no}},
|
||||
)
|
||||
print("text", response.text)
|
||||
print("json", response.json())
|
||||
response_json = response.json()
|
||||
# project = response_json["data"][0]["uu_id"]
|
||||
project = response_json["data"][0]
|
||||
return project
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import json
|
||||
|
||||
import arrow
|
||||
|
||||
from service_app_test.bases import RequestToApi
|
||||
|
|
@ -30,10 +32,11 @@ from service_app_test.test_application.migrate_old_data.accounts import (
|
|||
from service_app_test.test_application.migrate_old_data.decision_book_project import (
|
||||
approve_build_decision_book_project_approval,
|
||||
update_decision_book_project,
|
||||
create_decision_book_items,
|
||||
create_decision_book_project_items,
|
||||
generate_insert_project_item,
|
||||
generate_update_project_item,
|
||||
generate_approval_project_item,
|
||||
list_decision_book_project,
|
||||
)
|
||||
|
||||
local_api = RequestToApi()
|
||||
|
|
@ -42,8 +45,13 @@ local_api.overwrite_base_url(base_url=LocalAPI.base_url)
|
|||
both_apis = BothAPIS()
|
||||
both_apis.local_api = local_api
|
||||
|
||||
password_token = ""
|
||||
password_token_occ = ""
|
||||
|
||||
def decode_as_json_indent(data):
|
||||
return json.dumps(json.loads(json.dumps(data)), indent=2)
|
||||
|
||||
|
||||
password_token = "FGS095it2IBP3gIp5glaG6u9tQy1KEPzKnBYE1fvGJSGvGUhwaGgxE-56yZAxUQnW-a_J91twOFKTWTc0ue4GZq10vY7fK2cZBsR9bUDJMCHZZZGpFYbsE6pLyaDs-1_K8v5hbggSmpXNFfafMmujuXxqvSzdLQa5hcg9qepHBOvgTbL28wGRHx9w-Fcb7bL"
|
||||
password_token_occ = "kM9vHcWZVVF38IyNxMk6XMlCc8FCc_P1D-0D2u-Er5FrcQzvswSjJe9Lu9QnhJ5fJw5WqC45UYxopme_aCX6YDfZfQ3wQ9RP4Ak5YYTWBZbtwKGXTomlpYCQJghy0RC-1-Q9ATNEgcjYXqU2P9UjjdS9JNvhUawT0R38wXap-Mum6oazjqiKow41SUebnZ-H"
|
||||
login_data = {
|
||||
"domain": "evyos.com.tr",
|
||||
"access_key": "karatay.berkay.sup@evyos.com.tr",
|
||||
|
|
@ -59,15 +67,28 @@ login_creds_occupant = {
|
|||
"password_token": password_token_occ,
|
||||
}
|
||||
selection_list = [
|
||||
# "523dbcd3-fe87-4208-86c2-da45204dfafc",
|
||||
# "24aed2e5-bca0-4657-a056-badf9b3aa81c",
|
||||
"d9ffa716-331c-48fc-83b2-47bf31289b3e",
|
||||
"afebb7f8-9f62-4703-b11c-ee8f14fe73b7",
|
||||
]
|
||||
|
||||
manager_token = ""
|
||||
people_uu_id = ""
|
||||
list_of_attendees = []
|
||||
manager_token = "g0Z1YYjh2WqFfoI3MdJ9wrfXAHeL6f7UatEkySzOK0dFX6CH1sXgjQ"
|
||||
people_uu_id = "2c8781f6-c1bc-432d-bb0c-9f5247ecc750"
|
||||
list_of_attendees = [
|
||||
"_Ky6UyaoatH5CZEQHZ1gdoj_7HDxSJ2DgBwq6hSXbCKR-WG8E9DPuQ",
|
||||
"KhdJF7XP6ni_qdIRXSByGHKez8oTSbmzOAZxdi2A_iy-oOW6-VbfPA",
|
||||
"vn01wNh5moTiNzw2qOvT4h5eqgCQ10jmN3OK659NN-ekriFSmVju_Q",
|
||||
"EMsteygK4Myingptlpi_sr7Xu0Wsrl7xpQD-ukVY4GBjv6NJakpQ4Q",
|
||||
"26p4QD1CofK6-Pk_VyDOB2Xstdv_sx88kh4kResWg4TuCuAy7tAT-A",
|
||||
"2FgntLgLfFM20d32-gOwaHu44Vk_fDlpOh8IvS8gahiW-V0Dv0qLWg",
|
||||
"TwC_dNuT6Iln0NFinEuvxbnjmb_HwcS8qWg-097gjc8pHTQ1p0nTGA",
|
||||
"Yn35HP9TJonn9PTFpsq1lH3w-x-zHjTWymBeP6v4XPcwJP_aMj8JsQ",
|
||||
"C2DbYn1jcocKwjQ8gvJ_jCU0IGAmbJB3JgHj-N_OTu1jNtmhVrW7aQ",
|
||||
"TT5-9a_JVSf_WBAcN1sAfUyV45J2e7J1NoVGe3BcrrlAI1GNoU2_rw",
|
||||
"ED4H5zpmxpLXX5rO6eoTb7wIa2x1v0YbNwsFh-iAohWh7fDyhvq_BQ",
|
||||
]
|
||||
constant = "Toplantı sonucunda araştırmalar tamamlandı, katılımcılara e-posta gönderildi. Onaylayan sayısı yeterli olmadığı için karar alınamadı ve proje iptal edildi ve sonlandırıldı."
|
||||
|
||||
assign_people_to_create_item = -1
|
||||
assign_people_to_create_item = 4
|
||||
if assign_people_to_create_item == -1:
|
||||
local_api.selected_object = local_api.login_via_email_and_password(
|
||||
login_data=login_data, is_password_valid=False
|
||||
|
|
@ -290,31 +311,111 @@ elif assign_people_to_create_item == 3:
|
|||
requester=both_apis.local_api,
|
||||
)
|
||||
elif assign_people_to_create_item == 4:
|
||||
# project_lead_creds_occupant = {
|
||||
# "domain": "evyos.com.tr",
|
||||
# "access_key": "",
|
||||
# "password": "string",
|
||||
# "remember_me": False,
|
||||
# "password_token": "",
|
||||
# }
|
||||
|
||||
local_api.selected_object = local_api.login_via_email_and_password(
|
||||
login_data=login_creds_occupant,
|
||||
is_password_valid=True,
|
||||
selection_list=selection_list,
|
||||
)
|
||||
response = both_apis.local_api.post(
|
||||
endpoint="/build/decision_book/project/list",
|
||||
data={"query": {"project_no": "BDT-R_2024_1"}},
|
||||
)
|
||||
print("text", response.text)
|
||||
print("json", response.json())
|
||||
response_json = response.json()
|
||||
project_uu_id = response_json["data"][0]["uu_id"]
|
||||
print("project_uu_id", project_uu_id)
|
||||
exit()
|
||||
# for i in range(8):
|
||||
# index = i + 1
|
||||
# print("index", index)
|
||||
# if index in [1, 7, 8]:
|
||||
# continue
|
||||
# project_no = f"BDT-R_2024_{index}"
|
||||
# project = list_decision_book_project(
|
||||
# requester=both_apis.local_api, project_no=project_no
|
||||
# )
|
||||
# print("project", decode_as_json_indent(project))
|
||||
# project_uu_id = project["uu_id"]
|
||||
#
|
||||
# insert_project_item = generate_insert_project_item(
|
||||
# **{
|
||||
# "build_decision_book_project_uu_id": project_uu_id,
|
||||
# "item_header": "Toplantı sonrası alınan kararlar",
|
||||
# "item_comment": constant,
|
||||
# }
|
||||
# )
|
||||
# create_decision_book_project_items(
|
||||
# insert_project_item=insert_project_item, requester=both_apis.local_api
|
||||
# )
|
||||
# approve_project_item = {
|
||||
# "build_decision_book_project_uu_id": project_uu_id,
|
||||
# "project_stop_date": "2024-12-01",
|
||||
# "status_code": 9
|
||||
# }
|
||||
# approve_build_decision_book_project_approval(
|
||||
# approval_project_item=generate_approval_project_item(**approve_project_item),
|
||||
# requester=both_apis.local_api,
|
||||
# )
|
||||
#
|
||||
# project = list_decision_book_project(
|
||||
# requester=both_apis.local_api, project_no=project_no
|
||||
# )
|
||||
# print("project", decode_as_json_indent(project))
|
||||
|
||||
selected_decision_book_uu_id = list_decision_books(requester=both_apis.local_api)[
|
||||
"data"
|
||||
][0]["uu_id"]
|
||||
print("select_company_uu_id", local_api.selected_object)
|
||||
project_no = f"BDT-R_2024_7"
|
||||
project = list_decision_book_project(
|
||||
requester=both_apis.local_api, project_no=project_no
|
||||
)
|
||||
print("project", decode_as_json_indent(project))
|
||||
project_uu_id = project["uu_id"]
|
||||
|
||||
approve_project_item = lambda final_price_list : {
|
||||
"build_decision_book_project_uu_id": project_uu_id,
|
||||
"project_stop_date": "2024-12-01",
|
||||
"final_price_list": final_price_list,
|
||||
"status_code": 9
|
||||
}
|
||||
approve_project_dict = approve_project_item(
|
||||
[{"date": "2024-11-03", "price": 585.00}]
|
||||
)
|
||||
insert_project_item = generate_insert_project_item(
|
||||
**{
|
||||
"build_decision_book_project_uu_id": project_uu_id,
|
||||
"item_header": "Toplantı sonrası alınan kararlar",
|
||||
"item_comment": "Bina çalışmaları sonucunda 7020 ₺ lik maliyet çıkmıştır.",
|
||||
}
|
||||
)
|
||||
create_decision_book_project_items(
|
||||
insert_project_item=insert_project_item, requester=both_apis.local_api
|
||||
)
|
||||
approve_build_decision_book_project_approval(
|
||||
approval_project_item=generate_approval_project_item(**approve_project_dict),
|
||||
requester=both_apis.local_api,
|
||||
)
|
||||
|
||||
project = list_decision_book_project(
|
||||
requester=both_apis.local_api, project_no=project_no
|
||||
)
|
||||
print("project", decode_as_json_indent(project))
|
||||
|
||||
project_no = f"BDT-R_2024_8"
|
||||
project = list_decision_book_project(
|
||||
requester=both_apis.local_api, project_no=project_no
|
||||
)
|
||||
print("project", decode_as_json_indent(project))
|
||||
project_uu_id = project["uu_id"]
|
||||
|
||||
approve_project_dict = approve_project_item(
|
||||
[{"date": "2024-12-01", "price": 600.25}, {"date": "2025-01-01", "price": 600.50}]
|
||||
)
|
||||
insert_project_item = generate_insert_project_item(
|
||||
**{
|
||||
"build_decision_book_project_uu_id": project_uu_id,
|
||||
"item_header": "Toplantı sonrası alınan kararlar",
|
||||
"item_comment": "Bina çalışmaları sonucunda 12500 ₺ lik maliyet çıkmıştır.",
|
||||
}
|
||||
)
|
||||
create_decision_book_project_items(
|
||||
insert_project_item=insert_project_item, requester=both_apis.local_api
|
||||
)
|
||||
approve_build_decision_book_project_approval(
|
||||
approval_project_item=generate_approval_project_item(**approve_project_dict),
|
||||
requester=both_apis.local_api,
|
||||
)
|
||||
|
||||
project = list_decision_book_project(
|
||||
requester=both_apis.local_api, project_no=project_no
|
||||
)
|
||||
print("project", decode_as_json_indent(project))
|
||||
|
|
|
|||
Loading…
Reference in New Issue