Skip to content
Open
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"pos_index": ["IndexA"], "publish_status": "public", "feedback_mail": ["wekosoftware@nii.ac.jp"], "edit_mode": "Keep", "metadata": {"pubdate": "2021-08-07", "item_1617186331708": [{"subitem_1551255647225": "ja_conference paperITEM00000001(public_open_access_open_access_simple)", "subitem_1551255648112": "ja"}, {"subitem_1551255647225": "en_conference paperITEM00000001(public_open_access_simple)", "subitem_1551255648112": "en"}], "item_1617186385884": [{"subitem_1551255720400": "Alternative Title", "subitem_1551255721061": "en"}, {"subitem_1551255720400": "Alternative Title", "subitem_1551255721061": "ja"}], "item_1617186419668": [{"creatorAffiliations": [{"affiliationNameIdentifiers": [{"affiliationNameIdentifier": "0000000121691048", "affiliationNameIdentifierScheme": "ISNI", "affiliationNameIdentifierURI": "http://isni.org/isni/0000000121691048"}], "affiliationNames": [{"affiliationName": "University", "affiliationNameLang": "en"}]}], "creatorMails": [{"creatorMail": "wekosoftware@nii.ac.jp"}], "creatorNames": [{"creatorName": "情報, 太郎", "creatorNameLang": "ja"}, {"creatorName": "ジョウホウ, タロウ", "creatorNameLang": "ja-Kana"}, {"creatorName": "Joho, Taro", "creatorNameLang": "en"}], "familyNames": [{"familyName": "情報", "familyNameLang": "ja"}, {"familyName": "ジョウホウ", "familyNameLang": "ja-Kana"}, {"familyName": "Joho", "familyNameLang": "en"}], "givenNames": [{"givenName": "太郎", "givenNameLang": "ja"}, {"givenName": "タロウ", "givenNameLang": "ja-Kana"}, {"givenName": "Taro", "givenNameLang": "en"}], "nameIdentifiers": [{"nameIdentifier": "4", "nameIdentifierScheme": "WEKO"}, {"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "ORCID", "nameIdentifierURI": "https://orcid.org/"}, {"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "CiNii", "nameIdentifierURI": "https://ci.nii.ac.jp/"}, {"nameIdentifier": "zzzzzzz", "nameIdentifierScheme": "KAKEN2", "nameIdentifierURI": "https://kaken.nii.ac.jp/"}]}, {"creatorMails": [{"creatorMail": "wekosoftware@nii.ac.jp"}], "creatorNames": [{"creatorName": "情報, 太郎", "creatorNameLang": "ja"}, {"creatorName": "ジョウホウ, タロウ", "creatorNameLang": "ja-Kana"}, {"creatorName": "Joho, Taro", "creatorNameLang": "en"}], "familyNames": [{"familyName": "情報", "familyNameLang": "ja"}, {"familyName": "ジョウホウ", "familyNameLang": "ja-Kana"}, {"familyName": "Joho", "familyNameLang": "en"}], "givenNames": [{"givenName": "太郎", "givenNameLang": "ja"}, {"givenName": "タロウ", "givenNameLang": "ja-Kana"}, {"givenName": "Taro", "givenNameLang": "en"}], "nameIdentifiers": [{"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "ORCID", "nameIdentifierURI": "https://orcid.org/"}, {"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "CiNii", "nameIdentifierURI": "https://ci.nii.ac.jp/"}, {"nameIdentifier": "zzzzzzz", "nameIdentifierScheme": "KAKEN2", "nameIdentifierURI": "https://kaken.nii.ac.jp/"}]}, {"creatorMails": [{"creatorMail": "wekosoftware@nii.ac.jp"}], "creatorNames": [{"creatorName": "情報, 太郎", "creatorNameLang": "ja"}, {"creatorName": "ジョウホウ, タロウ", "creatorNameLang": "ja-Kana"}, {"creatorName": "Joho, Taro", "creatorNameLang": "en"}], "familyNames": [{"familyName": "情報", "familyNameLang": "ja"}, {"familyName": "ジョウホウ", "familyNameLang": "ja-Kana"}, {"familyName": "Joho", "familyNameLang": "en"}], "givenNames": [{"givenName": "太郎", "givenNameLang": "ja"}, {"givenName": "タロウ", "givenNameLang": "ja-Kana"}, {"givenName": "Taro", "givenNameLang": "en"}], "nameIdentifiers": [{"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "ORCID", "nameIdentifierURI": "https://orcid.org/"}, {"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "CiNii", "nameIdentifierURI": "https://ci.nii.ac.jp/"}, {"nameIdentifier": "zzzzzzz", "nameIdentifierScheme": "KAKEN2", "nameIdentifierURI": "https://kaken.nii.ac.jp/"}]}], "item_1617349709064": [{"contributorMails": [{"contributorMail": "wekosoftware@nii.ac.jp"}], "contributorNames": [{"contributorName": "情報, 太郎", "lang": "ja"}, {"contributorName": "ジョウホウ, タロウ", "lang": "ja-Kana"}, {"contributorName": "Joho, Taro", "lang": "en"}], "contributorType": "ContactPerson", "familyNames": [{"familyName": "情報", "familyNameLang": "ja"}, {"familyName": "ジョウホウ", "familyNameLang": "ja-Kana"}, {"familyName": "Joho", "familyNameLang": "en"}], "givenNames": [{"givenName": "太郎", "givenNameLang": "ja"}, {"givenName": "タロウ", "givenNameLang": "ja-Kana"}, {"givenName": "Taro", "givenNameLang": "en"}], "nameIdentifiers": [{"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "ORCID", "nameIdentifierURI": "https://orcid.org/"}, {"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "CiNii", "nameIdentifierURI": "https://ci.nii.ac.jp/"}, {"nameIdentifier": "xxxxxxx", "nameIdentifierScheme": "KAKEN2", "nameIdentifierURI": "https://kaken.nii.ac.jp/"}]}], "item_1617186476635": {"subitem_1522299639480": "open access", "subitem_1600958577026": "http://purl.org/coar/access_right/c_abf2"}, "item_1617351524846": {"subitem_1523260933860": "Unknown"}, "item_1617186499011": [{"subitem_1522650717957": "ja", "subitem_1522650727486": "http://localhost", "subitem_1522651041219": "Rights Information"}], "item_1617610673286": [{"nameIdentifiers": [{"nameIdentifier": "xxxxxx", "nameIdentifierScheme": "ORCID", "nameIdentifierURI": "https://orcid.org/"}], "rightHolderNames": [{"rightHolderLanguage": "ja", "rightHolderName": "Right Holder Name"}]}], "item_1617186609386": [{"subitem_1522299896455": "ja", "subitem_1522300014469": "Other", "subitem_1522300048512": "http://localhost/", "subitem_1523261968819": "Sibject1"}], "item_1617186626617": [{"subitem_description": "Description\nDescription<br/>Description", "subitem_description_language": "en", "subitem_description_type": "Abstract"}, {"subitem_description": "概要\n概要\n概要\n概要", "subitem_description_language": "ja", "subitem_description_type": "Abstract"}], "item_1617186643794": [{"subitem_1522300295150": "en", "subitem_1522300316516": "Publisher"}], "item_1617186660861": [{"subitem_1522300695726": "Available", "subitem_1522300722591": "2021-06-30"}], "item_1617186702042": [{"subitem_1551255818386": "jpn"}], "item_1617258105262": {"resourcetype": "conference paper", "resourceuri": "http://purl.org/coar/resource_type/c_5794"}, "item_1617349808926": {"subitem_1523263171732": "Version"}, "item_1617265215918": {"subitem_1522305645492": "AO", "subitem_1600292170262": "http://purl.org/coar/version/c_b1a7d7d4d402bcce"}, "item_1617186783814": [{"subitem_identifier_type": "URI", "subitem_identifier_uri": "http://localhost"}], "item_1617353299429": [{"subitem_1522306207484": "isVersionOf", "subitem_1522306287251": {"subitem_1522306382014": "arXiv", "subitem_1522306436033": "xxxxx"}, "subitem_1523320863692": [{"subitem_1523320867455": "en", "subitem_1523320909613": "Related Title"}]}], "item_1617186859717": [{"subitem_1522658018441": "en", "subitem_1522658031721": "Temporal"}], "item_1617186882738": [{"subitem_geolocation_place": [{"subitem_geolocation_place_text": "Japan"}]}], "item_1617186901218": [{"subitem_1522399143519": {"subitem_1522399281603": "ISNI", "subitem_1522399333375": "http://xxx"}, "subitem_1522399412622": [{"subitem_1522399416691": "en", "subitem_1522737543681": "Funder Name"}], "subitem_1522399571623": {"subitem_1522399585738": "Award URI", "subitem_1522399628911": "Award Number"}, "subitem_1522399651758": [{"subitem_1522721910626": "en", "subitem_1522721929892": "Award Title"}]}], "item_1617186920753": [{"subitem_1522646500366": "ISSN", "subitem_1522646572813": "xxxx-xxxx-xxxx"}], "item_1617186941041": [{"subitem_1522650068558": "en", "subitem_1522650091861": "Source Title"}], "item_1617186959569": {"subitem_1551256328147": "1"}, "item_1617186981471": {"subitem_1551256294723": "111"}, "item_1617186994930": {"subitem_1551256248092": "12"}, "item_1617187024783": {"subitem_1551256198917": "1"}, "item_1617187045071": {"subitem_1551256185532": "3"}, "item_1617187112279": [{"subitem_1551256126428": "Degree Name", "subitem_1551256129013": "en"}], "item_1617187136212": {"subitem_1551256096004": "2021-06-30"}, "item_1617944105607": [{"subitem_1551256015892": [{"subitem_1551256027296": "xxxxxx", "subitem_1551256029891": "kakenhi"}], "subitem_1551256037922": [{"subitem_1551256042287": "Degree Grantor Name", "subitem_1551256047619": "en"}]}], "item_1617187187528": [{"subitem_1599711633003": [{"subitem_1599711636923": "Conference Name", "subitem_1599711645590": "ja"}], "subitem_1599711655652": "1", "subitem_1599711660052": [{"subitem_1599711680082": "Sponsor", "subitem_1599711686511": "ja"}], "subitem_1599711699392": {"subitem_1599711704251": "2020/12/11", "subitem_1599711712451": "1", "subitem_1599711727603": "12", "subitem_1599711731891": "2000", "subitem_1599711735410": "1", "subitem_1599711739022": "12", "subitem_1599711743722": "2020", "subitem_1599711745532": "ja"}, "subitem_1599711758470": [{"subitem_1599711769260": "Conference Venue", "subitem_1599711775943": "ja"}], "subitem_1599711788485": [{"subitem_1599711798761": "Conference Place", "subitem_1599711803382": "ja"}], "subitem_1599711813532": "JPN"}], "item_1617605131499": [{"accessrole": "open_access", "date": [{"dateType": "Available", "dateValue": "2021-07-12"}], "displaytype": "simple", "filename": "1KB.pdf", "filesize": [{"value": "1 KB"}], "format": "text/plain"}, {"filename": ""}], "item_1617620223087": [{"subitem_1565671149650": "ja", "subitem_1565671169640": "Banner Headline", "subitem_1565671178623": "Subheading"}, {"subitem_1565671149650": "en", "subitem_1565671169640": "Banner Headline", "subitem_1565671178623": "Subheding"}]}, "file_path": ["file00000001/1KB.pdf", ""], "item_type_name": "デフォルトアイテムタイプ(フル)", "item_type_id": 15, "$schema": "https://localhost:8443/items/jsonschema/15", "identifier_key": "item_1617186819068", "errors": null}]
125 changes: 124 additions & 1 deletion modules/weko-search-ui/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,7 @@ def test_handle_check_duplicate_record(app):


# def handle_check_exist_record(list_record) -> list:
# .tox/c1/bin/pytest --cov=weko_search_ui tests/test_utils.py::test_handle_check_exist_record -vv -s --cov-branch --cov-report=term --basetemp=/code/modules/weko-search-ui/.tox/c1/tmp
def test_handle_check_exist_record(app):
case = unittest.TestCase()
# case 1 import new items
Expand All @@ -1213,7 +1214,8 @@ def test_handle_check_exist_record(app):
with open(filepath, encoding="utf-8") as f:
result = json.load(f)

case.assertCountEqual(handle_check_exist_record(list_record), result)
with app.test_request_context():
case.assertCountEqual(handle_check_exist_record(list_record), result)

# case 2 import items with id
filepath = os.path.join(
Expand Down Expand Up @@ -1287,6 +1289,127 @@ def test_handle_check_exist_record(app):
with set_locale("en"):
case.assertCountEqual(handle_check_exist_record(list_record), result)

# .tox/c1/bin/pytest --cov=weko_search_ui tests/test_utils.py::test_handle_check_exist_record_put_auto_fill -vv -s --cov-branch --cov-report=term --basetemp=/code/modules/weko-search-ui/.tox/c1/tmp
def test_handle_check_exist_record_put_auto_fill(app,db):
class DummyRecord:
def __init__(self, recid="10", deleted=False):
self._recid = recid
self._deleted = deleted
self.pid = self

def is_deleted(self):
return self._deleted

def get(self, key):
if key == "recid":
return self._recid
return None
# case 5 no id,uri
with patch("weko_deposit.api.WekoRecord.get_record_by_pid") as mock_get_record:
mock_get_record.return_value = DummyRecord(recid="10", deleted=False)

filepath = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"data",
"list_records",
"b4_handle_check_exist_record4.json",
)
with open(filepath, encoding="utf-8") as f:
list_record = json.load(f)

recid = "10"
with app.test_request_context("/sword/deposit/{}".format(recid), method="PUT"):
request.view_args = {"recid": recid}
result = handle_check_exist_record(list_record)
assert result[0]["id"] == recid
assert result[0]["uri"].endswith("/records/{}".format(recid))
assert result[0]["status"] == "keep"

class DummyPid:
def __init__(self, deleted=False):
self._deleted = deleted
def is_deleted(self):
return self._deleted

class DummyRecord:
def __init__(self, recid="", deleted=False):
self.pid = DummyPid(deleted)
self._recid = recid
def get(self, key):
if key == "recid":
return self._recid
return None

# .tox/c1/bin/pytest --cov=weko_search_ui tests/test_utils.py::test_handle_check_exist_record_branches -vv -s --cov-branch --cov-report=html --basetemp=/code/modules/weko-search-ui/.tox/c1/tmp
def test_handle_check_exist_record_cases(app, db):
from weko_search_ui.utils import handle_check_exist_record

# 1. item_id is None, recid is set
list_record = [{"id": None, "uri": None}]
with app.test_request_context("/sword/deposit/100", method="PUT"):
request.view_args = {"recid": "100"}
result = handle_check_exist_record(list_record)
assert result[0]["id"] == "100"
assert result[0]["status"] is None

# 2. uri and system_url are different
list_record = [{"id": "101", "uri": "http://dummy/other/101"}]
with app.test_request_context("/sword/deposit/101", method="PUT"):
request.view_args = {"recid": "101"}
result = handle_check_exist_record(list_record)
assert result[0]["status"] is None
assert any("Specified URI and system URI do not match." in err for err in result[0].get("errors", []))

# 3. PIDDoesNotExistError occurs
list_record = [{"id": "102", "uri": None}]
with patch("weko_deposit.api.WekoRecord.get_record_by_pid", side_effect=PIDDoesNotExistError("recid", "102")):
with app.test_request_context("/sword/deposit/102", method="PUT"):
request.view_args = {"recid": "102"}
result = handle_check_exist_record(list_record)
assert result[0]["status"] is None
assert any("Item does not exist in the system." in err for err in result[0].get("errors", []))

# 4. item_exist.pid.is_deleted() is True
list_record = [{"id": "103", "uri": None}]
with patch("weko_deposit.api.WekoRecord.get_record_by_pid", return_value=DummyRecord(recid="103", deleted=True)):
with app.test_request_context("/sword/deposit/103", method="PUT"):
request.view_args = {"recid": "103"}
result = handle_check_exist_record(list_record)
assert result[0]["status"] is None

# 5. edit_mode is None
list_record = [{"id": "104", "uri": None, "edit_mode": None}]
with patch("weko_deposit.api.WekoRecord.get_record_by_pid", return_value=DummyRecord(recid="104", deleted=False)):
with app.test_request_context("/sword/deposit/104", method="PUT"):
request.view_args = {"recid": "104"}
result = handle_check_exist_record(list_record)
assert result[0]["status"] is None
assert any("Please specify either \"Keep\" or \"Upgrade\"." in err for err in result[0].get("errors", []))

# 6. edit_mode is invalid value
list_record = [{"id": "105", "uri": None, "edit_mode": "delete"}]
with patch("weko_deposit.api.WekoRecord.get_record_by_pid", return_value=DummyRecord(recid="105", deleted=False)):
with app.test_request_context("/sword/deposit/105", method="PUT"):
request.view_args = {"recid": "105"}
result = handle_check_exist_record(list_record)
assert result[0]["status"] is None
assert any("Please specify either \"Keep\" or \"Upgrade\"." in err for err in result[0].get("errors", []))

# 7. edit_mode is correct value
list_record = [{"id": "106", "uri": None, "edit_mode": "keep"}]
with patch("weko_deposit.api.WekoRecord.get_record_by_pid", return_value=DummyRecord(recid="106", deleted=False)):
with app.test_request_context("/sword/deposit/106", method="PUT"):
request.view_args = {"recid": "106"}
result = handle_check_exist_record(list_record)
assert result[0]["status"] == "keep"

# 8. When item_id is an empty string
list_record = [{"id": "", "uri": None}]
with app.test_request_context("/sword/deposit/", method="PUT"):
request.view_args = {"recid": ""}
result = handle_check_exist_record(list_record)
assert result[0]["id"] is None
assert result[0]["status"] == "new"

# def make_file_by_line(lines):
def test_make_file_by_line(i18n_app):
Expand Down
10 changes: 10 additions & 0 deletions modules/weko-search-ui/weko_search_ui/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1589,7 +1589,17 @@ def handle_check_exist_record(list_record) -> list:
item = dict(**item, **{"status": "new"})
# current_app.logger.debug("item:{}".format(item))
errors = item.get("errors") or []
recid = request.view_args.get("recid")
item_id = item.get("id")
if item_id is None and recid is not None:
item["id"] = recid
item_id = recid
system_url = (
request.host_url + "records/" + str(item_id)
if item_id is not None else None
)
if item.get("uri") is None and system_url is not None:
item["uri"] = system_url
# current_app.logger.debug("item_id:{}".format(item_id))
if item_id and item_id is not "":
system_url = request.host_url + "records/" + str(item_id)
Expand Down
33 changes: 32 additions & 1 deletion modules/weko-swordserver/tests/data/records/test_items.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,35 @@
"resourcetype": "conference paper"
}
}
]
,
{
"id": "filetest",
"pid": { "type": "depid", "value": "filetest", "revision_id": 0 },
"lang": "ja",
"owner": "99",
"title": "filetest_title",
"owners": [99],
"status": "published",
"$schema": "/items/jsonschema/15",
"pubdate": "2026-02-09",
"created_by": 99,
"owners_ext": {
"email": "filetest@nii.ac.jp",
"username": "fileuser",
"displayname": "File Test User"
},
"shared_user_ids": [],
"item_1617186331708": [
{ "subitem_1551255647225": "filetest_title", "subitem_1551255648112": "ja" }
],
"item_file": [
{
"url": {
"url": "http://TEST_SERVER.localdomain/files/filetest.pdf",
"label": "filetest.pdf"
},
"mimetype": "application/pdf"
}
]
}
]
50 changes: 50 additions & 0 deletions modules/weko-swordserver/tests/data/records/test_records.json
Original file line number Diff line number Diff line change
Expand Up @@ -202,5 +202,55 @@
]
},
"relation_version_is_last": true
},
{
"_oai": { "id": "oai:weko3.example.org:filetest", "sets": ["99"] },
"path": ["99"],
"owner": "99",
"recid": "filetest",
"title": ["filetest_title"],
"pubdate": { "attribute_name": "PubDate", "attribute_value": "2026-02-09" },
"_buckets": { "deposit": "filetest-bucket-uuid" },
"_deposit": {
"id": "filetest",
"pid": { "type": "depid", "value": "filetest", "revision_id": 0 },
"owner": "99",
"owners": [99],
"status": "published",
"created_by": 99,
"owners_ext": {
"email": "filetest@nii.ac.jp",
"username": "fileuser",
"displayname": "File Test User"
}
},
"item_title": "filetest_title",
"author_link": [],
"item_type_id": "99",
"publish_date": "2026-02-09",
"publish_status": "0",
"weko_shared_ids": [],
"item_1617186331708": {
"attribute_name": "Title",
"attribute_value_mlt": [
{
"subitem_1551255647225": "filetest_title",
"subitem_1551255648112": "ja"
}
]
},
"item_file": {
"attribute_type": "file",
"attribute_value_mlt": [
{
"url": {
"url": "http://TEST_SERVER.localdomain/files/filetest.pdf",
"label": "filetest.pdf"
},
"mimetype": "application/pdf"
}
]
},
"relation_version_is_last": true
}
]
Loading
Loading