diff --git a/.gitignore b/.gitignore
index d37d0c2cf4..bd2d5fbb88 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,6 +39,7 @@ cache/csv/*.csv
cache/sitemap/*.xml
portality/migrate/p1p2/*.csv
portality/migrate/p1p2/*.csv.bak
+/portality/scripts/3821_add_deposit_policy/add-Mirabel-deposit-policy.csv
local_store/main/*
!local_store/main/README.md
local_store/tmp/*
diff --git a/cms/assets/img/ambassadors/mahmoud-new.jpg b/cms/assets/img/ambassadors/mahmoud-new.jpg
new file mode 100644
index 0000000000..cf543dc9e3
Binary files /dev/null and b/cms/assets/img/ambassadors/mahmoud-new.jpg differ
diff --git a/cms/assets/img/ambassadors/mahmoud.jpg b/cms/assets/img/ambassadors/mahmoud.jpg
deleted file mode 100644
index ee0dc409ab..0000000000
Binary files a/cms/assets/img/ambassadors/mahmoud.jpg and /dev/null differ
diff --git a/cms/assets/img/sponsors/ALPSP.png b/cms/assets/img/sponsors/ALPSP.png
new file mode 100644
index 0000000000..24aa343878
Binary files /dev/null and b/cms/assets/img/sponsors/ALPSP.png differ
diff --git a/cms/assets/img/sponsors/SN_stack_logo.png b/cms/assets/img/sponsors/SN_stack_logo.png
new file mode 100644
index 0000000000..ccb1864117
Binary files /dev/null and b/cms/assets/img/sponsors/SN_stack_logo.png differ
diff --git a/cms/assets/img/volunteers/Agirre.JPG b/cms/assets/img/volunteers/Agirre.JPG
new file mode 100644
index 0000000000..5f9d424444
Binary files /dev/null and b/cms/assets/img/volunteers/Agirre.JPG differ
diff --git a/cms/assets/img/volunteers/Andista.jpg b/cms/assets/img/volunteers/Andista.jpg
new file mode 100644
index 0000000000..2b8a8ebf18
Binary files /dev/null and b/cms/assets/img/volunteers/Andista.jpg differ
diff --git a/cms/assets/img/volunteers/Carla.jpg b/cms/assets/img/volunteers/Carla.jpg
new file mode 100644
index 0000000000..28215f7b5f
Binary files /dev/null and b/cms/assets/img/volunteers/Carla.jpg differ
diff --git a/cms/assets/img/volunteers/Costa.jpeg b/cms/assets/img/volunteers/Costa.jpeg
new file mode 100644
index 0000000000..9a65e556b4
Binary files /dev/null and b/cms/assets/img/volunteers/Costa.jpeg differ
diff --git a/cms/assets/img/volunteers/DEDI.jpg b/cms/assets/img/volunteers/DEDI.jpg
new file mode 100644
index 0000000000..0108e42efc
Binary files /dev/null and b/cms/assets/img/volunteers/DEDI.jpg differ
diff --git a/cms/assets/img/volunteers/Danner..png b/cms/assets/img/volunteers/Danner..png
new file mode 100644
index 0000000000..39db5a0ebd
Binary files /dev/null and b/cms/assets/img/volunteers/Danner..png differ
diff --git a/cms/assets/img/volunteers/Dr. K.JPG b/cms/assets/img/volunteers/Dr. K.JPG
new file mode 100644
index 0000000000..4a9d254f72
Binary files /dev/null and b/cms/assets/img/volunteers/Dr. K.JPG differ
diff --git a/cms/assets/img/volunteers/Flavius.jpg b/cms/assets/img/volunteers/Flavius.jpg
new file mode 100644
index 0000000000..73a7ed257b
Binary files /dev/null and b/cms/assets/img/volunteers/Flavius.jpg differ
diff --git a/cms/assets/img/volunteers/Julio.jpg b/cms/assets/img/volunteers/Julio.jpg
new file mode 100644
index 0000000000..10444ac27f
Binary files /dev/null and b/cms/assets/img/volunteers/Julio.jpg differ
diff --git a/cms/assets/img/volunteers/Khoirul.jpg b/cms/assets/img/volunteers/Khoirul.jpg
new file mode 100644
index 0000000000..61925b8266
Binary files /dev/null and b/cms/assets/img/volunteers/Khoirul.jpg differ
diff --git a/cms/assets/img/volunteers/Lee.jpg b/cms/assets/img/volunteers/Lee.jpg
new file mode 100644
index 0000000000..ae76daf109
Binary files /dev/null and b/cms/assets/img/volunteers/Lee.jpg differ
diff --git a/cms/assets/img/volunteers/Liping.jpg b/cms/assets/img/volunteers/Liping.jpg
new file mode 100644
index 0000000000..f209327a08
Binary files /dev/null and b/cms/assets/img/volunteers/Liping.jpg differ
diff --git a/cms/assets/img/volunteers/Longo.jpg b/cms/assets/img/volunteers/Longo.jpg
new file mode 100644
index 0000000000..36aa8e8e87
Binary files /dev/null and b/cms/assets/img/volunteers/Longo.jpg differ
diff --git a/cms/assets/img/volunteers/Marchitelli.jpg b/cms/assets/img/volunteers/Marchitelli.jpg
new file mode 100644
index 0000000000..7676ba9943
Binary files /dev/null and b/cms/assets/img/volunteers/Marchitelli.jpg differ
diff --git a/cms/assets/img/volunteers/Margalejo.jpeg b/cms/assets/img/volunteers/Margalejo.jpeg
new file mode 100644
index 0000000000..8999172fc2
Binary files /dev/null and b/cms/assets/img/volunteers/Margalejo.jpeg differ
diff --git a/cms/assets/img/volunteers/Martyna.JPG b/cms/assets/img/volunteers/Martyna.JPG
new file mode 100644
index 0000000000..ffdd0fa604
Binary files /dev/null and b/cms/assets/img/volunteers/Martyna.JPG differ
diff --git a/cms/assets/img/volunteers/Mirecka.jpeg b/cms/assets/img/volunteers/Mirecka.jpeg
new file mode 100644
index 0000000000..338eda062e
Binary files /dev/null and b/cms/assets/img/volunteers/Mirecka.jpeg differ
diff --git a/cms/assets/img/volunteers/Octav.jpg b/cms/assets/img/volunteers/Octav.jpg
new file mode 100644
index 0000000000..47657be109
Binary files /dev/null and b/cms/assets/img/volunteers/Octav.jpg differ
diff --git a/cms/assets/img/volunteers/Penabad.png b/cms/assets/img/volunteers/Penabad.png
new file mode 100644
index 0000000000..368087b146
Binary files /dev/null and b/cms/assets/img/volunteers/Penabad.png differ
diff --git a/cms/assets/img/volunteers/Rasoul.jpg b/cms/assets/img/volunteers/Rasoul.jpg
new file mode 100644
index 0000000000..ebb8a32f61
Binary files /dev/null and b/cms/assets/img/volunteers/Rasoul.jpg differ
diff --git a/cms/assets/img/volunteers/Ratodi.jpg b/cms/assets/img/volunteers/Ratodi.jpg
new file mode 100644
index 0000000000..41b2d21ddb
Binary files /dev/null and b/cms/assets/img/volunteers/Ratodi.jpg differ
diff --git a/cms/assets/img/volunteers/Wileidys.jpg b/cms/assets/img/volunteers/Wileidys.jpg
new file mode 100644
index 0000000000..8c83fd4328
Binary files /dev/null and b/cms/assets/img/volunteers/Wileidys.jpg differ
diff --git a/cms/assets/img/volunteers/Yang.jpg b/cms/assets/img/volunteers/Yang.jpg
new file mode 100644
index 0000000000..5edb4f3656
Binary files /dev/null and b/cms/assets/img/volunteers/Yang.jpg differ
diff --git a/cms/data/ambassadors.yml b/cms/data/ambassadors.yml
index f2a949b4f0..db06e7db21 100644
--- a/cms/data/ambassadors.yml
+++ b/cms/data/ambassadors.yml
@@ -65,8 +65,8 @@
- name: Mahmoud Khalifa
region: Middle East and Persian Gulf
- bio: "Mahmoud is the founder of Cybrarians, the Arabic Portal for Librarianship and Information, a non-profit organization located in Egypt since 2002, and working on serving library and information community in Arab countries. He is PhD candidate in Humboldt University of Berlin, Germany. He works on a dissertation about The national information policies. Mahmoud was an Associate at IFLA International Leaders Programme, 2016-2018, and an accredited trainer for the IFLA BSLA programme (Building Strong Library Association), as well as an OCLC Fellow at Jay Jordan IFLA/OCLC Early Career Development Fellowship Program, class 2010. In 2013 he was the winner of the Scientific Research Academy’s prize in informatics in Egypt. Professionally, he worked in Library of Congress Cairo Office from 2006-2018."
- photo: "mahmoud.jpg"
+ bio: "Mahmoud is a PhD candidate at Humboldt University of Berlin, Germany. He is writing his dissertation about national information policies. Mahmoud was an associate at the IFLA International Leaders Programme, 2016-2018, and an accredited trainer for the IFLA BSLA programme (Building Strong Library Association), as well as an OCLC Fellow at Jay Jordan IFLA/OCLC Early Career Development Fellowship Program, class 2010. Professionally, he worked in the Library of Congress Cairo Office from 2006-2018. As a researcher, he published more than 20 articles, book chapters, and conference papers."
+ photo: "mahmoud-new.jpg"
coi:
2022: https://drive.google.com/file/d/10s7B0WeTPqpaafhThv-i8q03uIFaAAue/view?usp=sharing
@@ -127,13 +127,6 @@ He has been an editor of Journal of Educational Evaluation for Health Profession
photo: "sun-huh.jpg"
coi:
-- name: Thomas Herve Mboa Nkoudou
- region: West and Central Africa
- bio: "Thomas is a PhD candidate in Public Communication at Université Laval (Canada) and deeply engaged in advocating for open science and promoting best practices of scholarly communication in Africa. He has been involved in promoting open access in Haiti and French-speaking African countries (projet SOHA) and is the initiator and organiser of the yearly Africa Open Science and Hardware Summit (AfricaOSH). He is a member of the OpenCon organising committee and an instructor at Force11 Scholarly Communication Institute. He has made it his mission to make scientific resources produced in African-based universities more visible locally and abroad."
- photo: "thomas_mboa.png"
- coi:
- 2022: https://drive.google.com/file/d/19rmrksWpCdP_GAHH8ZPT-HkaBgIjwA1x/view?usp=sharing
-
- name: Vrushali Dandawate
region: India
bio: "Vrushali is Head Librarian at AISSMS College of Engineering College Pune, Maharashtra, India, and She holds a Ph.D. degree from Reva University Banglore, India. Her research topic is 'OPEN ACCESS E -RESOURCES DEVELOPMENT IN ASIA: A STUDY' Vrushali was the winner of the ALCTS Online Course Grant for Library Professionals from Developing Countries in 2014, and the INASP open access week competition in both 2015 and 2016. She was invited to OpenCon 2017 in Berlin, Germany, and subsequently worked as a member of the organizing committee for OpenCon 2018 in Toronto, Canada. She also served as an advisory committee member for Open Access Week 2018-2019. She is selected as an advisory committee member of OpenDOAR and conference committee member of the FORCE2021 Conference."
diff --git a/cms/data/nav.yml b/cms/data/nav.yml
index 775984cd67..1330fd564b 100644
--- a/cms/data/nav.yml
+++ b/cms/data/nav.yml
@@ -29,6 +29,8 @@ entries:
route: doaj.xml # ~~->XMLDocumentation:WebRoute~~
- label: Metadata help
route: doaj.faq # ~~->FAQ:WebRoute~~
+ - label: Preservation
+ route: doaj.preservation # ~~->Preservation:WebRoute~~
- id: about
label: About
footer: true
diff --git a/cms/data/notifications.yml b/cms/data/notifications.yml
index d4b9906822..71919c5ad4 100644
--- a/cms/data/notifications.yml
+++ b/cms/data/notifications.yml
@@ -40,15 +40,15 @@ application:publisher:accepted:notify:
long: |
Congratulations! The application submitted for **{application_title}** on {application_date} has been accepted for inclusion in DOAJ.
- You may access the journal record from your Publisher dashboard: [{publisher_dashboard_url}]({publisher_dashboard_url}) using your DOAJ username and password.
+ You may access the journal record from your Publisher dashboard: [{publisher_dashboard_url}]({publisher_dashboard_url}) using your DOAJ account ID or email address, and password.
- If there are changes or updates to the information about your journal at any time after it has been accepted, please submit an Update Request from your Publisher dashboard promptly. Please be aware that failure to do this may result in removal of your journal from DOAJ.
+ If there are changes or updates to the information about your journal at any time after it has been accepted, please [submit an Update Request](https://doaj.org/publisher/journal) from your Publisher dashboard promptly. Failure to do this promptly may result in the withdrawal of your journal from DOAJ.
- How to submit an Update Request: [{faq_url}#how-do-i-update-the-information-about-my-journal]({faq_url}#how-do-i-update-the-information-about-my-journal)
+ [How to submit an Update Request](https://doaj.org/apply/publisher-responsibilities/#keeping-your-journal-records-up-to-date)
To increase the visibility, impact, distribution and usage of your journal content, we encourage you to upload article metadata for this journal to DOAJ as soon as possible.
- How to upload article metadata: [{faq_url}#how-do-i-upload-article-metadata]({faq_url}#how-do-i-upload-article-metadata)
+ [How to upload article metadata](https://doaj.org/docs/faq/#uploading-article-metadata)
We are delighted to welcome this journal into DOAJ. Do not hesitate to contact us at [helpdesk@doaj.org](mailto:helpdesk@doaj.org) if you have any questions.
short:
diff --git a/cms/data/sponsors.yml b/cms/data/sponsors.yml
index 2077eeb66e..38008a4621 100644
--- a/cms/data/sponsors.yml
+++ b/cms/data/sponsors.yml
@@ -25,6 +25,10 @@
url: https://www.ebsco.com/
logo: ebsco.svg
+- name: Springer Nature Ltd
+ url: https://www.springernature.com/gp
+ logo: SN_stack_logo.png
+
- name: Frontiers
url: https://www.frontiersin.org/
logo: frontiers.svg
@@ -145,3 +149,7 @@
url: https://xueshu.libtools.com.cn/?tenant_id=1
logo: Beijing.jpg
+- name: Association of Learned and Professional Society Publishers
+ url: https://www.alpsp.org/
+ logo: ALPSP.png
+
diff --git a/cms/data/team.yml b/cms/data/team.yml
index fc4dfed97e..5f7758cbc5 100644
--- a/cms/data/team.yml
+++ b/cms/data/team.yml
@@ -62,6 +62,7 @@
bio: "Ikhwan is a faculty member in the Industrial Engineering Department at Universitas Andalas, Indonesia. He is an enthusiastic photography hobbyist. He used to manage the university's library information system, including establishing the online public access catalogue (OPAC) and the repository servers. He is keenly interested in data science, primarily industrial and manufacturing systems research. He has been assisting Indonesian journal managers in their application to DOAJ. He joined DOAJ in 2018 as an ambassador, then became a volunteer editor and joined the DOAJ Team as Managing Editor in 2024."
coi:
2022: https://drive.google.com/file/d/1bmVVvMAPToLQCHGOfNz0D80xi4WyZhwn/view?usp=sharing
+ 2024: https://drive.google.com/file/d/1grtW4MM0drzwG4hG66_Ib3RioYTvkk2p/view?usp=sharing
- name: Ivonne Lujano
role: Community Manager
diff --git a/cms/data/volunteers.yml b/cms/data/volunteers.yml
index 987d4a18db..7fbe11a1c8 100644
--- a/cms/data/volunteers.yml
+++ b/cms/data/volunteers.yml
@@ -18,21 +18,14 @@ ed:
country: Australia
language: Chinese, English
featured: true
-
-- name: Ikhwan Arief
- area: Science, Technology
- year_since:
- city: Padang, West Sumatra
- country: Indonesia
- language: Indonesian, English
-- name: Juyeon Park
- area: Librarianship
+- name: Jiayi Xu
+ area: Academic Publishing
year_since:
- city: Seoul
- country: Korea
- language: Korean, English
-
+ city: Chongqing
+ country: China
+ language: Chinese, English
+
- name: Lut Tamam
area: Medicine
year_since:
@@ -47,6 +40,7 @@ ed:
city: Surabaya
country: Indonesia
language: Indonesian, English
+ photo: "Ratodi.jpg"
- name: Natalia Pamuła-Cieślak
area: Humanities, Social Sciences
@@ -81,6 +75,7 @@ ed:
city: Tabriz
country: Iran
language: Persian, English, Azeri
+ photo: "Rasoul.jpg"
- name: S.Suharto
area: Humanities, Social Sciences
@@ -100,6 +95,14 @@ ed:
## All associate editors
ass_ed:
+- name: Adhi Narayanan
+ area: Scientometric and Bibliometric Studies, Biotechnology
+ year_since:
+ city: Tiruchirappalli
+ country: India
+ language: Tamil, English
+ photo: "Dr. K.JPG"
+
- name: Alain Chaple
area: Medical Sciences
year_since:
@@ -145,6 +148,7 @@ ass_ed:
city: Madiun
country: Indonesia
language: Indonesian, English
+ photo: "Andista.jpg"
- name: Andrea Imre
area: Library Science, Music, General
@@ -154,11 +158,12 @@ ass_ed:
language: Hungarian, English
- name: Andrea Marchitelli
- area: Librarianship
+ area: Library Science
year_since:
- city:
- country: Poland
- language: Polish, English
+ city: Rome
+ country: Italy
+ language: Italian, English
+ photo: "Marchitelli.jpg"
- name: Andronic Octavian
area: Medicine
@@ -166,6 +171,7 @@ ass_ed:
city: Bucharest
country: Romania
language: Romanian, English
+ photo: "Octav.jpg"
- name: Anna Sidorko
area: Library Science
@@ -218,6 +224,22 @@ ass_ed:
language: Spanish, English
photo: "CarlosAlegre.jpg"
+- name: Carla Longo
+ area: Humanities
+ year_since:
+ city: St Andrews
+ country: Scotland
+ language: Italian, English, Latin, Ancient Greek
+ photo: "Longo.jpg"
+
+- name: Carla Marques
+ area: Information and library sciences
+ year_since:
+ city: Braga
+ country: Portugal
+ language: Information and library sciences
+ photo: "Carla.jpg"
+
- name: Cezary Borkowicz
area: Librarianship
year_since:
@@ -240,7 +262,7 @@ ass_ed:
city: Bengkulu
country: Indonesia
language: Indonesian, English
- photo:
+ photo: "Danner..png"
- name: Daria Chrześcijańska
area: Computer Science, Social Sciences
@@ -272,6 +294,7 @@ ass_ed:
city: Samarinda
country: Indonesia
language: Indonesian, English
+ photo: "DEDI.jpg"
- name: Dessy Harisanty
area: Library and Information Science
@@ -326,13 +349,6 @@ ass_ed:
language: English
photo: "Emrah Kaya.jpg"
-- name: Francesca Soldati
- area: Science
- year_since:
- city: Lincoln
- country: United Kingdom
- language: Italian, English, Spanish
-
- name: Francesco Cavinato
area: Humanities, Social Sciences
year_since:
@@ -362,7 +378,6 @@ ass_ed:
country: Republic of Korea
language: Korean, English
-
- name: Iryna Kuchma
area: Humanities, Social Sciences
year_since:
@@ -376,6 +391,7 @@ ass_ed:
city: Valencia
country: Spain
language: Spanish, English
+ photo: "Margalejo.jpeg"
- name: Jamila Jaber
area: Library and Information Science
@@ -391,13 +407,6 @@ ass_ed:
country:
language: English
-- name: Jiayi Xu
- area: Publishing
- year_since:
- city: Chongqing
- country: China
- language: Chinese,English
-
- name: Jinjin Liu
area: Social Sciences, Medicine
year_since:
@@ -405,13 +414,12 @@ ass_ed:
country: China
language: English
-- name: João Sousa
- area: Social Sciences
+- name: João Pedro Oliveira
+ area: Health Sciences
year_since:
- city:
- country: Angola
+ city: Porto
+ country: Portugal
language: Portuguese, English
- photo: "sousa.JPG"
- name: JooYeun Son
area:
@@ -420,13 +428,6 @@ ass_ed:
country:
language: Korean, English
-- name: José Darío Martínez Ezquerro
- area: Medicine
- year_since:
- city:
- country: Mexico
- language: Spanish, English
-
- name: Juliana Soares Lima
area: Librarianship and information science
year_since:
@@ -435,11 +436,19 @@ ass_ed:
language: Portuguese, English
photo: "jlima.jpg"
-- name: JuYeon Park
- area:
+- name: Julio Zetter
+ area: Library Science
year_since:
- city:
- country:
+ city: Mexico City
+ country: Mexico
+ language: Spanish, English
+ photo: "Julio.jpg"
+
+- name: Juyeon Park
+ area: Librarianship
+ year_since:
+ city: Seoul
+ country: Korea
language: Korean, English
- name: Kadri Kıran
@@ -473,14 +482,7 @@ ass_ed:
city:
country: Indonesia
language: Indonesian, English
- photo:
-
-- name: Kimberly Mears
- area: Medicine
- year_since:
- city: Charlottetown
- country: Canada
- language: English
+ photo: "Khoirul.jpg"
- name: Kristen Totleben
area: Librarianship, Humanities, Social Sciences
@@ -490,12 +492,28 @@ ass_ed:
language: English, Spanish
photo: "Kristen.jpg"
+- name: Lee Yang Díaz Chieng
+ area: Information Sciences
+ year_since:
+ city: Guantánamo
+ country: Cuba
+ language: Spanish and English
+ photo: "Lee.jpg"
+
- name: Lena Lönngren
area:
year_since:
city:
country: Finland
language: Finnish, English
+
+- name: Leila Yang
+ area: Scholarly Publishing
+ year_since:
+ city: Beijing
+ country: China
+ language: Chinese, English
+ photo: "Yang.jpg"
- name: Liana Penabad Camacho
area: Social Sciences
@@ -503,6 +521,7 @@ ass_ed:
city: San José
country: Costa Rica
language: Spanish, English
+ photo: "Penabad.png"
- name: Lina Marcela Blandón García
area: Science
@@ -511,6 +530,14 @@ ass_ed:
country: Colombia
language: Spanish, English
+- name: Liping Yang
+ area: Material Engineering, Library Studies
+ year_since:
+ city: Suzhou
+ country: China
+ language: Chinese, English
+ photo: "Liping.jpg"
+
- name: Lorri Peters
area: Science
year_since:
@@ -518,20 +545,13 @@ ass_ed:
country: USA
language: English
-- name: Lucas Helal
- area: Public Health
- year_since:
- city: Criciúma
- country: Brazil
- language: Portuguese, Spanish, English
- photo: "lucashelal.jpg"
-
- name: Marcau Flavius-Cristian
area: Social Sciences
year_since:
city: Târgu jiu
country: Romania
language: Romanian, English
+ photo: "Flavius.jpg"
- name: Marco Tullney
area: Social Sciences, Technology
@@ -553,14 +573,6 @@ ass_ed:
city: V.N Gaia
country: Portugal
language: Portuguese, Spanish, English
-
-- name: Mariano Hernán Corujo
- area: Librarianship
- year_since:
- city: Buenos Aires
- country: Argentina
- language: Spanish, English
- photo: "MarianoCorujo.jpeg"
- name: Marie-Eve Dugas
area: Library Science, Social Sciences
@@ -576,6 +588,14 @@ ass_ed:
country:
language: Spanish, English
+- name: Martyna Mirecka
+ area: History, Political Science
+ year_since:
+ city: Łupice
+ country: Poland
+ language: Polish, English
+ photo: "Martyna.JPG"
+
- name: Melih Sever
area: Social Sciences
year_since:
@@ -583,14 +603,6 @@ ass_ed:
country: Türkiye
language: English
-- name: Miguel-Ángel Vera-Baceta
- area: Social Sciences
- year_since:
- city: Murcia
- country: Spain
- language: Spanish, English
- photo: "MiguelAVera.jpg"
-
- name: Milagro Castro
area: Social Sciences
year_since:
@@ -675,6 +687,7 @@ ass_ed:
city: Donostia
country: Spain
language: Euskera, Spanish, English
+ photo: "Agirre.JPG"
- name: Paula Carina de Araújo
area: Library and Information Science
@@ -707,13 +720,6 @@ ass_ed:
country: Indonesia
language: Indonesian, English
-- name: Raúl Sampieri
- area: Science
- year_since:
- city:
- country: Mexico
- language: Spanish, English
-
- name: Remedios Melero (Reme)
area: Social Sciences
year_since:
@@ -757,13 +763,12 @@ ass_ed:
country: Italy
language: Italian, English, German
-- name: Sofia Fagiolo
- area: Librarianship
+- name: Shiying Li
+ area: Forensic Science
year_since:
- city: Rome
- country: Italy
- language: Italian, English
- photo: "sofiaf.jpg"
+ city: Shanghai
+ country: China
+ language: Chinese
- name: Soon Kim
area:
@@ -787,6 +792,14 @@ ass_ed:
language: French
photo: "sogoba1.jpg"
+- name: Susana Costa
+ area: Library and Information Sciences
+ year_since:
+ city: Braga
+ country: Portugal
+ language: Portuguese, English
+ photo: "Costa.jpeg"
+
- name: Swasti Maharani
area: Mathematics
year_since:
@@ -816,6 +829,14 @@ ass_ed:
country: India
language: Kannada, English
photo: "Vasanth.jpg"
+
+- name: Wileidys Artigas
+ area: Library Science
+ year_since:
+ city: Plano, Texas
+ country: USA
+ language: Spanish, English and Portuguese
+ photo: "Wileidys.jpg"
- name: Yalçın Tükel
area: Sports recreation
diff --git a/cms/pages/apply/copyright-and-licensing.md b/cms/pages/apply/copyright-and-licensing.md
index 2f9b41443a..15c5e29bf7 100644
--- a/cms/pages/apply/copyright-and-licensing.md
+++ b/cms/pages/apply/copyright-and-licensing.md
@@ -49,3 +49,11 @@ But the license applies to the readers **and** the author when:
## Further reading
Further reading and more examples are [available as a downloadable presentation](https://drive.google.com/drive/folders/190BgMV0ImGk-gUpHu5ai_R-uvO8NDAB8?usp=sharing).
+
+## In other languages
+
+[French](https://www.erudit.org/public/documents/licencedroitsauteursDOAJ.pdf) - hosted by Érudit
+
+## Version history
+
+This is Version 1 of our Licensing and copyright page.
diff --git a/cms/pages/apply/guide.md b/cms/pages/apply/guide.md
index 46ac31918c..854c2f5bf7 100644
--- a/cms/pages/apply/guide.md
+++ b/cms/pages/apply/guide.md
@@ -223,7 +223,7 @@ Our criteria are available in:
- [Chinese](https://zenodo.org/record/4633341)
- [Danish](https://pro.kb.dk/danske-open-access-tidsskrifter-og-directory-open-access-journals/basisbetingelser-indeksering)
- [Finnish](https://docs.google.com/document/d/1BLuaFerSw0G4L2GCVcGeu3rB7SXT7fWL0px26ME9jo0/edit?usp=sharing)
-- [French (Canadian)](https://drive.google.com/drive/folders/1-9FraAimhA9Ks64tvKE_W4wsQ8LNob9a?usp=sharing)
+- [French](https://www.erudit.org/public/documents/guidecandidatureDOAJ.pdf) - hosted by Érudit
- [German](https://bibliothek.thws.de/leitfaden-fuer-die-zeitschriftenregistrierung-bei-doaj/)
- [Japanese](https://drive.google.com/file/d/1MDRlcc7SJnv8yOlZ1aCqbivXOZevxH4a/view?usp=sharing)
- [Lithuanian](https://drive.google.com/file/d/1f7YXn6cXGXhDH9AbPJyOiM7_tHVRMe4j/view?usp=sharing)
@@ -234,7 +234,7 @@ Our criteria are available in:
---
-## Change log
+## Version history
This is Version 2.2 of our Guide to applying.
diff --git a/cms/pages/apply/publisher-responsibilities.md b/cms/pages/apply/publisher-responsibilities.md
index 75d54a0a5f..007616c8d7 100644
--- a/cms/pages/apply/publisher-responsibilities.md
+++ b/cms/pages/apply/publisher-responsibilities.md
@@ -75,7 +75,7 @@ You can access your dashboard and account settings by logging into your account.
On [your dashboard](/publisher/), you can
- See [a list of your journals](/publisher/journal) indexed in DOAJ
-- [Submit an update request](/apply/guide/#updating-your-journal-record) when journal details change
+- [Submit an update request](/publisher-responsibilities/#keeping-your-journal-records-up-to-date) when journal details change
- [Upload](/publisher/uploadfile) or [enter](/publisher/metadata) article metadata for your journals
- Download the Seal logo (only for journals awarded the DOAJ Seal).
- Upload your full-text content (only for journals preserved via JASPER).
@@ -163,7 +163,7 @@ When we withdraw your journal, we will send you an email. Remind yourself of the
- We have to withdraw your journal from DOAJ if it no longer adheres to our criteria or to publishing best practices.
- We have to withdraw the journal if it is inactive (ceased publishing) or the website is unavailable.
-You can also check our [list of withdrawn journals](https://docs.google.com/spreadsheets/d/183mRBRqs2jOyP0qZWXN8dUd02D4vL0Mov_kgYF8HORM/edit#gid=1650882189) and ask for more information by [contacting our Help Desk](mailto:helpdesk@doaj.org).
+You can also check our [log of withdrawn journals](https://docs.google.com/spreadsheets/d/1Kv3MbgFSgtSDnEGkA2JacrSjunRu0umHeZCtcMeqO5E/edit#gid=2104690845&range=A1) and ask for more information by [contacting our Help Desk](mailto:helpdesk@doaj.org).
### Journal is not listed on my dashboard
@@ -172,3 +172,11 @@ You can also check our [list of withdrawn journals](https://docs.google.com/spre
### Unknown journal on my dashboard
- [Contact our Help Desk](mailto:helpdesk@doaj.org) with the journal title and ISSN; they will help you.
+
+## In other languages
+
+[French](https://www.erudit.org/public/documents/infoediteursDOAJ.pdf) - hosted by Érudit
+
+## Version history
+
+This is Version 1 of our Publisher information page.
diff --git a/cms/pages/apply/seal.md b/cms/pages/apply/seal.md
index 7fc7f4d414..1a1e6984f3 100644
--- a/cms/pages/apply/seal.md
+++ b/cms/pages/apply/seal.md
@@ -47,3 +47,11 @@ All seven criteria must be met for a journal to be awarded the Seal. Failure to
- Creative Commons licensing information must be displayed in all full-text article formats.
7. Copyright and publishing rights
- Authors must retain unrestricted copyright and all publishing rights when publishing under any license permitted by the journal.
+
+## In other languages
+
+[French](https://www.erudit.org/public/documents/sceauDOAJ.pdf) - hosted by Érudit
+
+## Version history
+
+This is Version 1 of our Seal criteria.
diff --git a/cms/pages/apply/transparency.md b/cms/pages/apply/transparency.md
index 7cb39e0a0c..ec05c1d83a 100644
--- a/cms/pages/apply/transparency.md
+++ b/cms/pages/apply/transparency.md
@@ -171,7 +171,7 @@ Any direct marketing activities, including solicitation of manuscripts, that are
## Version history
-- This is Version 4.0 of the Principles of Transparency and Best Practice in Scholarly Publishing
+- This is Version 4.0 - September 2022
- [Version 3.0](https://docs.google.com/document/d/1wtnA5zj02Hn3XY_SUWvs3U22DC9MaaNVrdiCHYXlrGE/edit?usp=sharing) - January 2018
- [Version 2.0](https://oaspa.org/principles-of-transparency-and-best-practice-in-scholarly-publishing-2/?highlight=principles) - June 2015 (on the OASPA website)
- [Version 1.0](https://oaspa.org/principles-of-transparency-and-best-practice-in-scholarly-publishing/?highlight=principles) - December 2013 (on the OASPA website)
@@ -203,6 +203,7 @@ WAME is a global nonprofit voluntary association of editors of peer-reviewed med
- [Bengali](https://docs.google.com/document/d/1hsCynqvYbnaUwnu7VxlEPNKn076mz1KrRUdQ4vefYX4/edit?usp=sharing) - Google document
- [Chinese](https://zenodo.org/records/10401800) - PDF, Zenodo
+- [French](https://www.erudit.org/public/documents/transparenceDOAJ.pdf) - hosted by Érudit
- [Korean](https://drive.google.com/file/d/1Uyh5uZR1vbkPwcIvN1h7PPlHVwu0fMHA/view?usp=sharing) - PDF
- [Portuguese](https://docs.google.com/document/d/155dAHllL2KhPhzTsR3UhbMEASYjkxP157fAtiZ1jw2w/edit?usp=sharing) - Google document
- [Serbian](https://www.ceon.rs/index.php?option=com_content&view=article&id=654:transparentnost-i-najbolja-praksa&catid=94&lang=sr&Itemid=578) (hosted at ceon.rs)
diff --git a/cms/pages/docs/faq.md b/cms/pages/docs/faq.md
index 6621c19bf2..c2fe321bc4 100644
--- a/cms/pages/docs/faq.md
+++ b/cms/pages/docs/faq.md
@@ -10,10 +10,10 @@ featuremap: ~~FAQ:Fragment~~
After your journal is indexed in DOAJ and you start to upload article metadata to us, we generate journal and article metadata. We make these publicly and freely available via different methods:
-- Our [Atom feed](https://staticdoaj.cottagelabs.com/feed)
-- Our [OAI-PMH service](https://staticdoaj.cottagelabs.com/docs/oai-pmh/)
-- [A journal CSV](https://staticdoaj.cottagelabs.com/csv) file (updates every 60 minutes)
-- Our [API](https://staticdoaj.cottagelabs.com/docs/api/)
+- Our [Atom feed](https://doaj.org/feed)
+- Our [OAI-PMH service](https://doaj.org/docs/oai-pmh/)
+- [A journal CSV](https://doaj.org/csv) file (updates every 60 minutes)
+- Our [API](https://doaj.org/docs/api/)
- On our website
Our metadata is collected and incorporated into commercial discovery systems, library discovery portals and search engines around the world. Here are some of them:
@@ -100,6 +100,20 @@ Choose how you want to upload article metadata to us.
- **Documentation** No
- **Troubleshooting**: you must be careful to enter the Print ISSN and Electronic ISSN in the right field.
+### A note about updating articles
+
+Sometimes article metadata needs to be updated. We use the Full Text URL and DOI, if present, to identify and match articles. If you are updating article metadata with details about authors, affiliations, year, volume, issue, etc or adding a DOI to an article that doesn't have one in DOAJ, you will be able to send us the updated metadata, using one of the methods above, without any problem.
+
+However, if you need to update the Full Text URL or DOI of articles that already have that metadata present in DOAJ, you will need to contact us first. Submitting new FUll Text URLs or DOIs will cause duplicate articles to be created. Our preferenc here is that we delete the existing article records first.
+
+If you do need us to delete article metadata, please contact Help Desk with the following details:
+
+- journal title
+- ISSN(s)
+- years to be deleted (we can only delete whole years) or if we should delete all article for a journal
+
+We will confirm the number of articles to delete with you. Deleting articles is instantaneous and cannot be reversed.
+
## Help with metadata uploads
### My authors have multiple affiliations
@@ -144,11 +158,12 @@ If you received a spreadsheet from us, please complete it as soon as possible. T
Before you send us the file, you must do two things:
-1. Convert the spreadsheet to a CSV. To do this, you will need to first delete the instructions tab and then Save as CSV.
+1. Convert the spreadsheet to a CSV. To do this, you will need to first delete the instructions tab and then Save as CSV. (Save in the Unicode UTF-8 format.)
2. [Validate it](/publisher/journal-csv).
Here are some tips on how to ensure that your CSV file will pass validation:
+- make sure CSV is in UTF-8 format
- don't change an ISSN or Title of a journal. To do this, contact [Help Desk](mailto:helpdesk@doaj.org).
- don't add a new journal to the file. To do this, [submit a new application](/apply/).
- don't change the title of a column
@@ -174,4 +189,11 @@ The following warnings may be seen after validating your CSV:
| You may not change _question_. Please revert it to match what was sent to you in the spreadsheet. | During editing, the question has been changed. The question must be exactly as it is in the spreadsheet sent to you. Please change it. |
| We couldn't understand the information in _question_ | | The information in the cell doesn't match the formatting requirements. Check the Instructions tab in the spreadsheet sent to you. |
-From time to time, other validation errors might be seen if one of the cells contains completely incorrect information. For example, the cell should contain a URL but it contains text. These error messages are self-explanatory,, but contact Help Desk if you require help.
+From time to time, other validation errors might be seen if one of the cells contains completely incorrect information. For example, the cell should contain a URL but it contains text. These error messages should be easy to understand but contact the Help Desk if you have questions.
+
+## Version history
+
+This is Version 2 of our Metadata help page.
+
+*Version 2.0 (December 2023 - added the entire 'Using a spreadsheet to update your journal metadata' section)*
+Version 1.0 (November 2023 - created this whole page with new content)
diff --git a/cms/pages/support/supporters.md b/cms/pages/support/supporters.md
index 6cf98e6b0f..eed80a4508 100644
--- a/cms/pages/support/supporters.md
+++ b/cms/pages/support/supporters.md
@@ -15,4 +15,4 @@ Check [our Institutions and libraries support page](/support/) for pricing and b
## Current supporters
-
+
diff --git a/cms/sass/base/_palette.scss b/cms/sass/base/_palette.scss
index f33e96f69f..c180436f5c 100644
--- a/cms/sass/base/_palette.scss
+++ b/cms/sass/base/_palette.scss
@@ -3,6 +3,7 @@
// Greyscale
$warm-black: #282624;
$dark-grey: #5C5956;
+$mid-grey: #A9A7A5;
$light-grey: #F6F4F4;
$white: #FFF;
diff --git a/cms/sass/components/_form.scss b/cms/sass/components/_form.scss
index 81eb330e81..8d3e93ee06 100644
--- a/cms/sass/components/_form.scss
+++ b/cms/sass/components/_form.scss
@@ -11,6 +11,14 @@
}
}
+.form__legend {
+ margin-bottom: $spacing-03;
+ font-weight: 700;
+ line-height: 1;
+ @include typescale-01;
+ @include font-serif;
+}
+
.form__header {
margin-bottom: 0;
padding-bottom: $spacing-03;
diff --git a/cms/sass/components/_notifications.scss b/cms/sass/components/_notifications.scss
index 35edadb64a..a7975845c4 100644
--- a/cms/sass/components/_notifications.scss
+++ b/cms/sass/components/_notifications.scss
@@ -1,6 +1,6 @@
.notifications {
overflow-y: scroll;
- height: 300px;
+ height: fit-content;
width: 300px;
@include typescale-06;
}
diff --git a/cms/sass/layout/_editorial-panel.scss b/cms/sass/layout/_editorial-panel.scss
index a08cb98ca3..0f2f818dd0 100644
--- a/cms/sass/layout/_editorial-panel.scss
+++ b/cms/sass/layout/_editorial-panel.scss
@@ -16,8 +16,14 @@
position: sticky;
top: 100px;
+ &__wrapper {
+ display: flex;
+ flex-direction: column;
+ max-height: calc(100vh - 75px - 1.5rem - 25px); //(full viewport)-(nav height)-(top padding)-(bottom padding)
+ }
+
&__content {
- max-height: 70vh;
+ flex: 1;
overflow-y: scroll;
select, textarea, input {
diff --git a/cms/sass/main.scss b/cms/sass/main.scss
index 661f2a4ae6..0f72c8eac8 100644
--- a/cms/sass/main.scss
+++ b/cms/sass/main.scss
@@ -14,7 +14,7 @@
"base/general",
"base/grid",
"base/highlight",
-
+
"vendors/swagger",
"layout/editorial-panel",
@@ -71,5 +71,6 @@
"pages/uploadmetadata",
"themes/dashboard",
+ "themes/editorial-form",
"themes/timeline"
;
diff --git a/cms/sass/themes/_dashboard.scss b/cms/sass/themes/_dashboard.scss
index 50bd3e8986..5d68af6374 100644
--- a/cms/sass/themes/_dashboard.scss
+++ b/cms/sass/themes/_dashboard.scss
@@ -58,6 +58,7 @@
top: 75px;
bottom: 0;
background-color: $light-grey;
+ border-right: 1px dotted $mid-grey;
overflow-y: scroll;
}
}
@@ -171,4 +172,136 @@
padding: 40px;
}
}
+
+ // Application form styles — overrides
+ .form {
+ padding: $spacing-04 0;
+ }
+
+ .form--compact {
+ h1 {
+ margin: 0 (-$spacing-04) $spacing-04 (-$spacing-04);
+ padding: $spacing-04;
+ border-radius: $spacing-02 $spacing-02 0 0;
+ background: $warm-black;
+ color: $white;
+
+ + .form__header {
+ margin-top: -$spacing-04;
+ }
+
+ + .alert {
+ margin: 0 0 $spacing-04 0;
+ background-color: $light-grey;
+ border-radius: $spacing-02;
+ border-color: $mid-grey;
+ color: $warm-black;
+ }
+
+ + .form__question {
+ padding-top: 0;
+ border: 0;
+ }
+ }
+
+ .form__header {
+ margin: 0 (-$spacing-04);
+ padding: $spacing-03 $spacing-04;
+ width: auto;
+ border: 0;
+ border-top: 1px dotted $mid-grey;
+ background: $light-grey;
+ }
+
+ fieldset {
+ margin: 0 0 $spacing-04 0;
+ padding: 0 $spacing-04;
+ border-radius: $spacing-02;
+ background: $white;
+ }
+
+ .form__question {
+ padding: $spacing-04;
+ margin: 0;
+ margin-left: -$spacing-04;
+ margin-right: -$spacing-04;
+ border-top: 1px dotted $mid-grey;
+
+ input, select, textarea, .select2-container {
+ margin-bottom: $spacing-03;
+ width: 100% !important;
+ border-color: $mid-grey;
+ }
+
+ .removable-fields li {
+ display: flex;
+ justify-content: center;
+ }
+
+ .remove_field__button {
+ margin-bottom: $spacing-03;
+ white-space: nowrap;
+ }
+ }
+
+ .form__subquestion {
+ border-left-width: $spacing-01;
+ }
+
+ .form__short-help {
+ margin-bottom: $spacing-02;
+ font-size: smaller;
+ }
+
+ .icon-container {
+ display: inline-flex;
+ margin-bottom: $spacing-02;
+ padding: $spacing-01;
+ line-height: 1;
+ border-radius: 50%;
+ color: $white;
+ }
+
+ .icon-container--unable_to_access {
+ background: $grapefruit;
+ }
+
+ .icon-container--not_found,
+ .icon-container--not_validated,
+ .icon-container--missing,
+ .icon-container--outdated {
+ background: $sanguine;
+ }
+
+ .icon-container--fully_validated,
+ .icon-container--present {
+ background: $mid-green;
+ }
+
+ .parsley-errors-list {
+ padding: $spacing-03;
+ border-radius: $spacing-01;
+ background: rgba($grapefruit, .25);
+ font-weight: bold;
+
+ p {
+ margin: 0;
+ }
+ }
+
+ .formulaic-annotation-pissn-list,
+ .formulaic-annotation-eissn-list,
+ .formulaic-annotation-preservation_service-list {
+ margin: 0;
+ padding: $spacing-03;
+ border-radius: $spacing-02;
+ border: 1px dotted $mid-grey;
+ background: $light-grey;
+ }
+
+ .formulaic-clickableurl-visit {
+ margin: 0 0 0 $spacing-03;
+ white-space: nowrap;
+ }
+ }
}
diff --git a/cms/sass/themes/_editorial-form.scss b/cms/sass/themes/_editorial-form.scss
new file mode 100644
index 0000000000..3e2ceb4c45
--- /dev/null
+++ b/cms/sass/themes/_editorial-form.scss
@@ -0,0 +1,197 @@
+// Application form review styles — overrides
+// Managing editor, editor, associate editor views
+#maned_form,
+#ed_form,
+#assed_form {
+ padding: $spacing-04 0;
+ background: rgba($light-grey, .5);
+
+ details {
+ cursor: pointer;
+ }
+
+ fieldset {
+ margin: 0 0 $spacing-04 0;
+ padding: 0 $spacing-04;
+ border-radius: $spacing-02;
+ background: $white;
+ @include box-shadow;
+ }
+
+ .page-content {
+ padding: 0;
+ }
+
+ .form__legend {
+ margin: 0;
+ width: 100%;
+ @include typescale-06;
+
+ div {
+ margin: 0 (-$spacing-04) $spacing-04 (-$spacing-04);
+ padding: $spacing-02;
+ border-radius: $spacing-02 $spacing-02 0 0;
+ background: $dark-grey;
+ color: $white;
+ text-align: center;
+ }
+
+ + .form__header,
+ + details {
+ margin-top: -$spacing-04;
+ }
+
+ + .alert {
+ margin: 0 0 $spacing-04 0;
+ background-color: $light-grey;
+ border-radius: $spacing-02;
+ border-color: $mid-grey;
+ color: $warm-black;
+ }
+
+ + .form__question {
+ padding-top: 0;
+ border: 0;
+ }
+ }
+
+ .form__header {
+ margin: 0 (-$spacing-04);
+ padding: $spacing-03;
+ width: auto;
+ border: 0;
+ border-top: 1px dotted $mid-grey;
+ background: $light-grey;
+ }
+
+ .form__question {
+ padding: $spacing-03;
+ margin: 0;
+ margin-left: -$spacing-04;
+ margin-right: -$spacing-04;
+ border-top: 1px dotted $mid-grey;
+
+ input, select, textarea, .select2-container {
+ margin-bottom: $spacing-02;
+ width: 100% !important;
+ border-color: $mid-grey;
+ }
+
+ .removable-fields li {
+ display: flex;
+ justify-content: center;
+ }
+
+ .remove_field__button {
+ margin-bottom: $spacing-03;
+ white-space: nowrap;
+ }
+
+ &.editor_group__container,
+ &.editor__container {
+ border-top: 0;
+ }
+ }
+
+ .form__subquestion {
+ border-left-width: $spacing-01;
+ }
+
+ .form__short-help {
+ margin-bottom: $spacing-02;
+ font-size: smaller;
+ }
+
+ .icon-container {
+ display: inline-flex;
+ margin-right: $spacing-02;
+ padding: $spacing-01;
+ line-height: 1;
+ border-radius: 50%;
+ color: $white;
+ }
+
+ .icon-container--success {
+ background: $mid-green;
+ }
+
+ .icon-container--error {
+ background: $sanguine;
+ }
+
+ .icon-container--warn {
+ background: $grapefruit;
+ }
+
+ .icon-container--info {
+ background: $mid-grey;
+ }
+
+ //.icon-container--unable_to_access {
+ // background: $grapefruit;
+ //}
+ //
+ //.icon-container--not_found,
+ //.icon-container--not_validated,
+ //.icon-container--missing,
+ //.icon-container--outdated {
+ // background: $sanguine;
+ //}
+ //
+ //.icon-container--fully_validated,
+ //.icon-container--present {
+ // background: $mid-green;
+ //}
+
+ .parsley-errors-list {
+ padding: $spacing-03;
+ border-radius: $spacing-01;
+ background: rgba($grapefruit, .25);
+ font-weight: bold;
+
+ p {
+ margin: 0;
+ }
+ }
+
+ .formulaic-annotation-pissn-list,
+ .formulaic-annotation-eissn-list,
+ .formulaic-annotation-preservation_service-list {
+ margin: 0;
+ padding: $spacing-03;
+ border-radius: $spacing-02;
+ border: 1px dotted $mid-grey;
+ background: $light-grey;
+
+ li {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ line-height: 1;
+
+ + li {
+ margin-top: $spacing-02;
+ }
+ }
+
+ button { // dismiss button
+ margin: 0;
+ margin-left: auto;
+ }
+ }
+
+ .formulaic-clickableurl-visit {
+ margin: 0 0 0 $spacing-03;
+ white-space: nowrap;
+ }
+
+ [class*="-annotations"] {
+ + [class*="fullcontents"] {
+ margin: $spacing-03 0 0 0;
+ }
+ }
+
+ [class*="fullcontents-contents"] {
+ margin: 0;
+ }
+}
\ No newline at end of file
diff --git a/cms/tours/admin_journal_autochecks.yml b/cms/tours/admin_journal_autochecks.yml
new file mode 100644
index 0000000000..7c6e575489
--- /dev/null
+++ b/cms/tours/admin_journal_autochecks.yml
@@ -0,0 +1,14 @@
+steps:
+ - selector: '.autochecks-manager-toggle'
+ title: Autochecks are available on this Journal
+ content: |
+
+
This journal has had a number of checks carried out on its data, to aid in your review. To see these checks alongside
+ the questions in the form, click this button to show them.
+
For now these are quite basic, covering the following fields:
+
+
Print and Online ISSNs: these are checked to see if they are registered and valid in issn.org
+
Archiving policy: these are checked to see if the journal is being archived in the selected services, and how current the data is.
+
+
In time, more checks will become available.
+
\ No newline at end of file
diff --git a/data_import_settings/dev_extras.json b/data_import_settings/dev_extras.json
index b2bd93258d..8525b6e9d2 100644
--- a/data_import_settings/dev_extras.json
+++ b/data_import_settings/dev_extras.json
@@ -1,24 +1,24 @@
{
"elastic_search_host" : null,
"elastic_search_db" : null,
- "confirm" : true,
+ "confirm" : false,
"max_content_length" : 40000000,
"types" : {
"account" : {"import" : true, "limit" : -1},
"application" : {"import" : true, "limit" : -1},
- "article" : {"import" : true, "limit" : 100000},
"background_job" : {"import" : true, "limit" : 10000},
- "news" : {"import" : true, "limit" : -1},
- "notification" : {"import" : true, "limit" : -1},
- "preserve" : {"import" : true, "limit" : -1},
+ "cache" : {"import" : true, "limit" : -1},
+ "draft_application" : {"import" : true, "limit" : 1000},
"editor_group" : {"import" : true, "limit" : -1},
+ "harvester_state" : {"import" : true, "limit" : -1},
"journal" : {"import" : true, "limit" : -1},
-
- "cache" : {"import" : false, "limit" : -1},
- "harvester_state" : {"import" : false, "limit" : -1},
- "lcc" : {"import" : false, "limit" : -1},
- "lock" : {"import" : false, "limit" : -1},
- "provenance" : {"import" : false, "limit" : -1},
- "upload" : {"import" : false, "limit" : -1}
+ "lcc" : {"import" : true, "limit" : -1},
+ "lock" : {"import" : true, "limit" : -1},
+ "news" : {"import" : true, "limit" : -1},
+ "notification" : {"import" : true, "limit" : 1000},
+ "preserve" : {"import" : true, "limit" : -1},
+ "provenance" : {"import" : true, "limit" : 10000},
+ "upload" : {"import" : true, "limit" : 10000},
+ "article" : {"import" : true, "limit" : 100000}
}
}
\ No newline at end of file
diff --git a/doajtest/README.md b/doajtest/README.md
index 4f5b85873d..fb7b0415d9 100644
--- a/doajtest/README.md
+++ b/doajtest/README.md
@@ -33,6 +33,12 @@ Following are the guide to write unit test for parallelised:
----------------------------------------
+## Combinatrix and paramaterised tests
+
+Find the test matrices here: https://drive.google.com/drive/folders/1EFKBbBCay983wzSUgD6F3Bj_V8c5ix54
+
+TODO, full guide...
+
## Testbook
See: Testbook section from ../docs/README.md
diff --git a/doajtest/fixtures/__init__.py b/doajtest/fixtures/__init__.py
index 75d594d773..156fe944e5 100644
--- a/doajtest/fixtures/__init__.py
+++ b/doajtest/fixtures/__init__.py
@@ -6,3 +6,4 @@
from .bibjson import BibJSONFixtureFactory
from .provenance import ProvenanceFixtureFactory
from .background import BackgroundFixtureFactory
+from doajtest.fixtures.issn_org import IssnOrgFixtureFactory
diff --git a/doajtest/fixtures/issn_org.py b/doajtest/fixtures/issn_org.py
new file mode 100644
index 0000000000..72addfbed5
--- /dev/null
+++ b/doajtest/fixtures/issn_org.py
@@ -0,0 +1,9 @@
+from copy import deepcopy
+from portality.lib import paths
+
+class IssnOrgFixtureFactory(object):
+ @classmethod
+ def web_page_body(cls):
+ source = paths.rel2abs(__file__, "../unit/resources/issn_org_web_page.html")
+ with open(source) as f:
+ return f.read()
\ No newline at end of file
diff --git a/doajtest/fixtures/resources.py b/doajtest/fixtures/resources.py
new file mode 100644
index 0000000000..69bb9e9364
--- /dev/null
+++ b/doajtest/fixtures/resources.py
@@ -0,0 +1,123 @@
+from copy import deepcopy
+from datetime import datetime
+
+from portality.autocheck.resources.issn_org import ISSNOrgData
+
+
+class ResourcesFixtureFactory(object):
+ @classmethod
+ def issn_org(cls, issn=None, version=None, archive_components=None):
+ record = deepcopy(ISSN_ORG)
+
+ if issn is not None:
+ record["@id"] = "https://portal.issn.org/resource/ISSN/" + issn
+ record["exampleOfWork"]["@id"] = record["@id"]
+ record["exampleOfWork"]["workExample"][0]["@id"] = record["@id"]
+ record["issn"] = issn
+ record["identifier"][0]["value"] = issn
+ record["identifier"][1]["value"] = issn
+ record["mainEntityOfPage"]["@id"] = record["@id"] + "#Record"
+ record["mainEntityOfPage"]["mainEntity"] = record["@id"]
+
+ if version is not None:
+ record["mainEntityOfPage"]["version"] = version
+
+ if archive_components is not None:
+ record["subjectOf"] = []
+ for service, in_time in archive_components.items():
+ ac_base = deepcopy(SUBJECT_OF)
+ service_url = ID_MAP.get(service)
+ ac_base["holdingArchive"]["@id"] = service_url
+ ac_base["holdingArchive"]["name"] = service
+ if in_time:
+ now = datetime.utcnow()
+ last = now.year - 1
+ first = now.year - 3
+ ac_base["temporalCoverage"] = "{x}/{y}".format(x=first, y=last)
+ else:
+ now = datetime.utcnow()
+ last = now.year - 4
+ first = now.year - 6
+ ac_base["temporalCoverage"] = "{x}/{y}".format(x=first, y=last)
+
+ record["subjectOf"].append(ac_base)
+
+ return ISSNOrgData(record)
+
+
+ID_MAP = {
+ "CLOCKSS": "http://issn.org/organization/keepers#clockss",
+ "LOCKSS": "http://issn.org/organization/keepers#lockss",
+ "Internet Archive": "http://issn.org/organization/keepers#internetarchive",
+ "PKP PN": "http://issn.org/organization/keepers#pkppln",
+ "Portico": "http://issn.org/organization/keepers#portico"
+}
+
+SUBJECT_OF = {
+ "@type": "ArchiveComponent",
+ "creativeWorkStatus": "Preserved",
+ "description": "1 to 3",
+ "holdingArchive": {
+ "@type": "ArchiveOrganization",
+ "@id": "http://issn.org/organization/keepers#clockss",
+ "name": "CLOCKSS Archive"
+ },
+ "abstract": "1 to 3",
+ "dateModified": "2023-06-19",
+ "temporalCoverage": ""
+}
+
+ISSN_ORG = {
+ "@context": "http://schema.org/",
+ "@id": "https://portal.issn.org/resource/ISSN/1234-1231",
+ "@type": "Periodical",
+ "exampleOfWork": {
+ "@id": "https://portal.issn.org/resource/ISSN-L/1234-1231",
+ "@type": "CreativeWork",
+ "workExample": [
+ {
+ "@id": "https://portal.issn.org/resource/ISSN/1234-1231",
+ "name": "Wiadomości Unii Spółdzielców Mieszkaniowych"
+ }
+ ]
+ },
+ "issn": "1234-1231",
+ "identifier": [
+ {
+ "@type": "PropertyValue",
+ "name": "ISSN",
+ "value": "1234-1231",
+ "description": "Valid"
+ },
+ {
+ "@type": "PropertyValue",
+ "name": "ISSN-L",
+ "value": "1234-1231",
+ "description": "Valid"
+ }
+ ],
+ "name": "Wiadomości Unii Spółdzielców Mieszkaniowych",
+ "alternateName": "Wiadomości Unii Spółdzielców Mieszkaniowych.",
+ "publication": {
+ "@id": "https://portal.issn.org/resource/ISSN/1234-1231#ReferencePublicationEvent",
+ "@type": "PublicationEvent",
+ "location": {
+ "@id": "https://www.iso.org/obp/ui/#iso:code:3166:PL",
+ "@type": "Country",
+ "name": "Poland"
+ }
+ },
+ "mainEntityOfPage": {
+ "@id": "https://portal.issn.org/resource/ISSN/1234-1231#Record",
+ "@type": "CreativeWork",
+ "dateModified": "05/01/2023",
+ "mainEntity": "https://portal.issn.org/resource/ISSN/1234-1231",
+ "sourceOrganization": {
+ "@id": "https://www.issn.org/organization/ISSNCenter#57",
+ "@type": "Organization",
+ "name": "ISSN National Centre for Poland"
+ },
+ "version": "Register"
+ },
+ "material": "Print"
+}
\ No newline at end of file
diff --git a/doajtest/fixtures/urls.py b/doajtest/fixtures/urls.py
index 0fa1f98302..df3ceb8949 100644
--- a/doajtest/fixtures/urls.py
+++ b/doajtest/fixtures/urls.py
@@ -4,7 +4,10 @@
"https://www.cosmos.com#galaxy",
"https://www.cosmos.com/galaxy",
"https://www.cosmos.com/galaxy#peanut",
- "http://ftp.example.com/file%20name.txt"
+ "http://ftp.example.com/file%20name.txt",
+ "https://revistalogos.policia.edu.co:8443/index.php/rlct/about",
+ "https://revistalogos.policia.edu.co:65535/index.php/rlct/about",
+ "https://revistalogos.policia.edu.co:0/index.php/rlct/about"
]
INVALID_URL_LISTS = [
@@ -12,7 +15,9 @@
"nonexistent.com",
"https://www.doaj.org and https://www.reddit.com",
"http://www.doaj.org and www.doaj.org",
-"http://www.doaj.org, www.doaj.org",
-"http://www.doaj.org, https://www.doaj.org",
-"http://ftp.example.com/file name.txt"
-]
\ No newline at end of file
+ "http://www.doaj.org, www.doaj.org",
+ "http://www.doaj.org, https://www.doaj.org",
+ "http://ftp.example.com/file name.txt",
+ "https://revistalogos.policia.edu.co:65536/index.php/rlct/about",
+ "https://revistalogos.policia.edu.co:655350/index.php/rlct/about"
+]
diff --git a/doajtest/fixtures/v2/journals.py b/doajtest/fixtures/v2/journals.py
index 068b14aebd..3b3d1123aa 100644
--- a/doajtest/fixtures/v2/journals.py
+++ b/doajtest/fixtures/v2/journals.py
@@ -118,8 +118,8 @@ def question_answers():
"Languages in which the journal accepts manuscripts",
"Publisher",
"Country of publisher",
- "Society or institution",
- "Country of society or institution",
+ "Other organisation",
+ "Country of other organisation",
"Journal license",
"License attributes",
"URL for license terms",
diff --git a/doajtest/helpers.py b/doajtest/helpers.py
index 60c8dd0e85..a8f33d52d5 100644
--- a/doajtest/helpers.py
+++ b/doajtest/helpers.py
@@ -14,8 +14,10 @@
from doajtest.fixtures import ArticleFixtureFactory, ApplicationFixtureFactory
from portality import core, dao, models
from portality.core import app
+from portality.dao import any_pending_tasks, query_data_tasks
from portality.lib import paths, dates
from portality.lib.dates import FMT_DATE_STD
+from portality.lib.thread_utils import wait_until
from portality.tasks.redis_huey import main_queue, long_running
from portality.util import url_for
@@ -83,6 +85,10 @@ def warmArticle(self):
CREATED_INDICES = []
+def initialise_index():
+ core.initialise_index(app, core.es_connection)
+
+
def create_index(index_type):
if index_type in CREATED_INDICES:
return
@@ -132,6 +138,7 @@ def create_app_patch(cls):
"ES_RETRY_HARD_LIMIT": 0,
"ES_BLOCK_WAIT_OVERRIDE": 0.5,
"ES_READ_TIMEOUT": '5m',
+ 'ES_SOCKET_TIMEOUT': 5 * 60,
"ELASTIC_SEARCH_DB": app.config.get('ELASTIC_SEARCH_TEST_DB'),
'ELASTIC_SEARCH_DB_PREFIX': create_es_db_prefix(cls),
"FEATURES": app.config['VALID_FEATURES'],
@@ -411,3 +418,20 @@ def login(app_client, username, password, follow_redirects=True):
def logout(app_client, follow_redirects=True):
return app_client.get(url_for('account.logout'), follow_redirects=follow_redirects)
+
+
+def wait_until_no_es_incomplete_tasks():
+ """
+
+ wait until no ES pending tasks and no data tasks is running
+
+ created for make sure model.save() or model.delete() is completed
+
+ if your data still can not be query, try Model.refresh()
+
+ """
+
+ def _cond_fn():
+ return not any_pending_tasks() and len(query_data_tasks(timeout='3m')) == 0
+
+ return wait_until(_cond_fn, 10, 0.2)
diff --git a/doajtest/integration/__init__.py b/doajtest/integration/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/doajtest/integration/autocheck_resources/__init__.py b/doajtest/integration/autocheck_resources/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/doajtest/integration/autocheck_resources/test_issn_org.py b/doajtest/integration/autocheck_resources/test_issn_org.py
new file mode 100644
index 0000000000..9ddf23f452
--- /dev/null
+++ b/doajtest/integration/autocheck_resources/test_issn_org.py
@@ -0,0 +1,53 @@
+from doajtest.helpers import DoajTestCase
+
+from portality.autocheck.resource_bundle import Resource, ResourceBundle
+from portality.autocheck.resources.issn_org import ISSNOrg
+
+#########################################
+# We're expecting the following ISSNs to resolve to pages which embed schema.org data
+# which have the following properties:
+#
+# * provisional - the ISSN is provisional, so the property mainEntityOfPage.version is not "Register"
+# * archived - the ISSN is archived, so the property subjectOf contains at least one ArchiveComponent
+# * registered - the ISSN is registered, so the property mainEntityOfPage.version is "Register"
+
+TESTS = {
+ "2786-5800": ["provisional"],
+ "2673-8198": ["archived"],
+ "1234-1231": ["registered"]
+}
+
+
+class TestISSNOrg(DoajTestCase):
+ def setUp(self):
+ super(TestISSNOrg, self).setUp()
+
+ def tearDown(self):
+ super(TestISSNOrg, self).tearDown()
+
+ def test_01_integrations(self):
+ resources = ResourceBundle()
+ issn_org = ISSNOrg(resources)
+
+ for issn, expected in TESTS.items():
+ data = issn_org.fetch(issn)
+
+ if "provisional" in expected:
+ assert data is not None
+ assert data.is_registered() is False
+
+ if "archived" in expected:
+ assert data is not None
+ assert len(data.archive_components) > 0
+
+ for ac in data.archive_components:
+ id = ac.get("holdingArchive", {}).get("@id")
+ tc = ac.get("temporalCoverage")
+ assert id is not None
+ assert tc is not None
+
+ if "registered" in expected:
+ assert data is not None
+ assert data.is_registered() is True
+
+
diff --git a/doajtest/matrices/bll_todo_maned/top_todo_maned.matrix.csv b/doajtest/matrices/bll_todo_maned/top_todo_maned.matrix.csv
index 1945cc9ad9..9965c80495 100644
--- a/doajtest/matrices/bll_todo_maned/top_todo_maned.matrix.csv
+++ b/doajtest/matrices/bll_todo_maned/top_todo_maned.matrix.csv
@@ -1,6 +1,6 @@
-test_id,account,raises,todo_maned_stalled,todo_maned_follow_up_old,todo_maned_ready,todo_maned_completed,todo_maned_assign_pending,todo_maned_ready_order,todo_maned_follow_up_old_order,todo_maned_stalled_order,todo_maned_assign_pending_order,todo_maned_completed_order
-1,none,ArgumentException,0,0,0,0,0,,,,,
-2,no_role,,0,0,0,0,0,,,,,
-3,admin,,1,1,1,1,1,1,2,3,4,5
-4,editor,,0,0,0,0,0,,,,,
-5,assed,,0,0,0,0,0,,,,,
+test_id,account,raises,todo_maned_stalled,todo_maned_follow_up_old,todo_maned_ready,todo_maned_completed,todo_maned_assign_pending,todo_maned_new_update_request,todo_maned_new_update_request_order,todo_maned_ready_order,todo_maned_follow_up_old_order,todo_maned_stalled_order,todo_maned_assign_pending_order,todo_maned_completed_order
+1,none,ArgumentException,0,0,0,0,0,0,,,,,,
+2,no_role,,0,0,0,0,0,0,,,,,,
+3,admin,,1,1,1,1,1,1,1,2,3,4,5,6
+4,editor,,0,0,0,0,0,0,,,,,,
+5,assed,,0,0,0,0,0,0,,,,,,
diff --git a/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.csv b/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.csv
index 419f22f89d..a8148032f9 100644
--- a/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.csv
+++ b/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.csv
@@ -1,32 +1,36 @@
-field,test_id,account,raises,todo_maned_stalled,todo_maned_follow_up_old,todo_maned_ready,todo_maned_completed,todo_maned_assign_pending,todo_maned_ready_order,todo_maned_follow_up_old_order,todo_maned_stalled_order,todo_maned_assign_pending_order,todo_maned_completed_order
-type,index,generated,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional
-default,,,,,,,,,,,,,
-,,,,,,,,,,,,,
-values,,none,ArgumentException,,,,,,,,,,
-values,,no_role,,,,,,,,,,,
-values,,admin,,,,,,,,,,,
-values,,editor,,,,,,,,,,,
-values,,assed,,,,,,,,,,,
-,,,,,,,,,,,,,
-conditional raises,,none,ArgumentException,,,,,,,,,,
-,,,,,,,,,,,,,
-conditional todo_maned_stalled,,admin,,1,,,,,,,,,
-conditional todo_maned_stalled,,!admin,,0,,,,,,,,,
-,,,,,,,,,,,,,
-conditional todo_maned_follow_up_old,,admin,,,1,,,,,,,,
-conditional todo_maned_follow_up_old,,!admin,,,0,,,,,,,,
-,,,,,,,,,,,,,
-conditional todo_maned_ready,,admin,,,,1,,,,,,,
-conditional todo_maned_ready,,!admin,,,,0,,,,,,,
-,,,,,,,,,,,,,
-conditional todo_maned_completed,,admin,,,,,1,,,,,,
-conditional todo_maned_completed,,!admin,,,,,0,,,,,,
-,,,,,,,,,,,,,
-conditional todo_maned_assign_pending,,admin,,,,,,1,,,,,
-conditional todo_maned_assign_pending,,!admin,,,,,,0,,,,,
-,,,,,,,,,,,,,
-conditional todo_maned_ready_order,,admin,,,,,,,1,,,,
-conditional todo_maned_follow_up_old_order,,admin,,,,,,,,2,,,
-conditional todo_maned_stalled_order,,admin,,,,,,,,,3,,
-conditional todo_maned_assign_pending_order,,admin,,,,,,,,,,4,
-conditional todo_maned_completed_order,,admin,,,,,,,,,,,5
\ No newline at end of file
+field,test_id,account,raises,todo_maned_stalled,todo_maned_follow_up_old,todo_maned_ready,todo_maned_completed,todo_maned_assign_pending,todo_maned_new_update_request,todo_maned_new_update_request_order,todo_maned_ready_order,todo_maned_follow_up_old_order,todo_maned_stalled_order,todo_maned_assign_pending_order,todo_maned_completed_order
+type,index,generated,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional,conditional
+default,,,,,,,,,,,,,,,
+,,,,,,,,,,,,,,,
+values,,none,ArgumentException,,,,,,,,,,,,
+values,,no_role,,,,,,,,,,,,,
+values,,admin,,,,,,,,,,,,,
+values,,editor,,,,,,,,,,,,,
+values,,assed,,,,,,,,,,,,,
+,,,,,,,,,,,,,,,
+conditional raises,,none,ArgumentException,,,,,,,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_stalled,,admin,,1,,,,,,,,,,,
+conditional todo_maned_stalled,,!admin,,0,,,,,,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_follow_up_old,,admin,,,1,,,,,,,,,,
+conditional todo_maned_follow_up_old,,!admin,,,0,,,,,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_ready,,admin,,,,1,,,,,,,,,
+conditional todo_maned_ready,,!admin,,,,0,,,,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_completed,,admin,,,,,1,,,,,,,,
+conditional todo_maned_completed,,!admin,,,,,0,,,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_assign_pending,,admin,,,,,,1,,,,,,,
+conditional todo_maned_assign_pending,,!admin,,,,,,0,,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_new_update_request,,admin,,,,,,,1,,,,,,
+conditional todo_maned_new_update_request,,!admin,,,,,,,0,,,,,,
+,,,,,,,,,,,,,,,
+conditional todo_maned_new_update_request_order,,admin,,,,,,,,1,,,,,
+conditional todo_maned_ready_order,,admin,,,,,,,,,2,,,,
+conditional todo_maned_follow_up_old_order,,admin,,,,,,,,,,3,,,
+conditional todo_maned_stalled_order,,admin,,,,,,,,,,,4,,
+conditional todo_maned_assign_pending_order,,admin,,,,,,,,,,,,5,
+conditional todo_maned_completed_order,,admin,,,,,,,,,,,,,6
\ No newline at end of file
diff --git a/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.json b/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.json
index 28e9c66dc5..6625f298f2 100644
--- a/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.json
+++ b/doajtest/matrices/bll_todo_maned/top_todo_maned.settings.json
@@ -179,7 +179,7 @@
}
},
{
- "name": "todo_maned_ready_order",
+ "name": "todo_maned_new_update_request",
"type": "conditional",
"default": "",
"values": {
@@ -193,11 +193,40 @@
}
}
]
+ },
+ "0": {
+ "conditions": [
+ {
+ "account": {
+ "nor": [
+ "admin"
+ ]
+ }
+ }
+ ]
}
}
},
{
- "name": "todo_maned_follow_up_old_order",
+ "name": "todo_maned_new_update_request_order",
+ "type": "conditional",
+ "default": "",
+ "values": {
+ "1": {
+ "conditions": [
+ {
+ "account": {
+ "or": [
+ "admin"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "name": "todo_maned_ready_order",
"type": "conditional",
"default": "",
"values": {
@@ -215,7 +244,7 @@
}
},
{
- "name": "todo_maned_stalled_order",
+ "name": "todo_maned_follow_up_old_order",
"type": "conditional",
"default": "",
"values": {
@@ -233,7 +262,7 @@
}
},
{
- "name": "todo_maned_assign_pending_order",
+ "name": "todo_maned_stalled_order",
"type": "conditional",
"default": "",
"values": {
@@ -251,7 +280,7 @@
}
},
{
- "name": "todo_maned_completed_order",
+ "name": "todo_maned_assign_pending_order",
"type": "conditional",
"default": "",
"values": {
@@ -267,6 +296,24 @@
]
}
}
+ },
+ {
+ "name": "todo_maned_completed_order",
+ "type": "conditional",
+ "default": "",
+ "values": {
+ "6": {
+ "conditions": [
+ {
+ "account": {
+ "or": [
+ "admin"
+ ]
+ }
+ }
+ ]
+ }
+ }
}
]
}
\ No newline at end of file
diff --git a/doajtest/mocks/autocheck_checkers.py b/doajtest/mocks/autocheck_checkers.py
new file mode 100644
index 0000000000..fa7ada847d
--- /dev/null
+++ b/doajtest/mocks/autocheck_checkers.py
@@ -0,0 +1,22 @@
+from portality.autocheck.checker import Checker
+
+
+class AutocheckMockFactory(object):
+ @classmethod
+ def mock_autochecker(cls):
+ return MockChecker
+
+
+class MockChecker(Checker):
+ __identity__ = "mock_annotator"
+
+ def check(self, form,
+ jla,
+ autochecks,
+ resources,
+ logger):
+ autochecks.add_check(field="pissn",
+ original_value="1234-5678",
+ suggested_value="9876-5432",
+ advice="Change the issn",
+ reference_url="http://example.com/9876-5432")
diff --git a/doajtest/mocks/autocheck_resource_bundle_Resource.py b/doajtest/mocks/autocheck_resource_bundle_Resource.py
new file mode 100644
index 0000000000..1931433f19
--- /dev/null
+++ b/doajtest/mocks/autocheck_resource_bundle_Resource.py
@@ -0,0 +1,34 @@
+from doajtest.fixtures.resources import ResourcesFixtureFactory
+
+from portality.autocheck.resource_bundle import ResourceUnavailable
+
+
+class ResourceBundleResourceMockFactory(object):
+ @classmethod
+ def no_contact_resource_fetch(cls, version=None, archive_components=None):
+ def mock(self, *args, **kwargs):
+ if self.__identity__ == "issn_org":
+ issn = None
+ if "issn" in kwargs:
+ issn = kwargs["issn"]
+ if len(args) > 0:
+ issn = args[0]
+ return ResourcesFixtureFactory.issn_org(issn=issn, version=version, archive_components=archive_components)
+
+ return None
+
+ return mock
+
+ @classmethod
+ def fail_fetch(cls):
+ def mock(self, *args, **kwargs):
+ raise ResourceUnavailable()
+
+ return mock
+
+ @classmethod
+ def not_found_fetch(cls):
+ def mock(self, *args, **kwargs):
+ return None
+
+ return mock
\ No newline at end of file
diff --git a/doajtest/selenium_helpers.py b/doajtest/selenium_helpers.py
index b3f5e5ea21..80d9e2e42e 100644
--- a/doajtest/selenium_helpers.py
+++ b/doajtest/selenium_helpers.py
@@ -1,14 +1,13 @@
import datetime
import logging
-import time
import multiprocessing
+import time
from multiprocessing import Process, freeze_support
from typing import TYPE_CHECKING
import selenium
from selenium import webdriver
-from selenium.common import StaleElementReferenceException, ElementClickInterceptedException
-from selenium.webdriver import DesiredCapabilities
+from selenium.common.exceptions import StaleElementReferenceException, ElementClickInterceptedException
from selenium.webdriver.common.by import By
from doajtest.fixtures.url_path import URL_LOGOUT
diff --git a/doajtest/testbook/admin_article_metadata_form/admin_article_metadata_form.yml b/doajtest/testbook/admin_article_metadata_form/admin_article_metadata_form.yml
index ca85eded33..d3f7df9563 100644
--- a/doajtest/testbook/admin_article_metadata_form/admin_article_metadata_form.yml
+++ b/doajtest/testbook/admin_article_metadata_form/admin_article_metadata_form.yml
@@ -2,118 +2,138 @@
suite: Admin Article Metadata Form
testset: Admin Article Metadata Form
tests:
-- title: Preparation
- context:
- role: Admin
- setup:
- - Ensure you own a journal with ISSNs 1234-5678 and 9876-5432 and no articles
- attached
- - Ensure you are an owner of a journal with ISSN 0000-0000 that is not in
- DOAJ
- steps:
- - step: Upload set of test articles
- resource: /xml_upload_test_package/admin_metadata_form_test_pack.xml
- results:
- - 3 Articles are uploaded and attached to the journal
+ - title: Preparation
+ context:
+ role: Admin
+ setup:
+ - Ensure you own a journal with ISSNs 1234-5678 and 9876-5432 and no articles
+ attached
+ - Ensure you are an owner of a journal with ISSN 0000-0000 that is not in
+ DOAJ
+ steps:
+ - step: Upload set of test articles
+ resource: /xml_upload_test_package/admin_metadata_form_test_pack.xml
+ results:
+ - 3 Articles are uploaded and attached to the journal
-- title: Updating data other then DOI and Fulltext URL
- context:
- role: Admin
- depends:
- - suite: Admin Article Metadata Form
- testset: Admin Article Metadata Form
- test: Preparation
- steps:
- - step: Go to admin journal and articles search, choose Articles from the "Journals
- vs Articles" facets at the left
- results:
- - Each article in the search results has "Delete this article | Edit this article"
- option in the lower right corner
- - step: Find "Success 300" article
- - step: Click "Edit this article"
- results:
- - The Admin Metadata Form for "Success 300" article is opened in the new window
- - step: Check if PISSN and EISSN dropdowns have 1234-5678 and 9876-5432 options
- - step: Check that PISSN and EISSN dropdowns have not 0000-0000 option
- - step: Check the Authors section
- results:
- - There is only one author and no "Remove Author" button
- - step: Click "Add Author"
- results:
- - New empty Author Subform appears, each has "Remove Author" option
- - step: Click "Remove Author" under one of the authors
- results:
- - The author is removed from the list
- - step: Change the title to "Success 400"
- - step: Add an author filling in any string as a name, an affiliation and an orcid
- id in the correct form, for example https://orcid.org/0001-1234-1234-444X
- - step: Change all the other fields except doi and fulltext URL to something easily
- recognisable
- - step: Click "Update Article" button
- results:
- - Green banner saying "Article created/updated" is shown at the top of the page.
- - step: Search for "Success 400" article again
- - step: Close the page with the Article Metadata Form
- - step: Click "Edit the article"
- results:
- - Confirm all the metadata is updated
+ - title: Updating data other then DOI and Fulltext URL
+ context:
+ role: Admin
+ depends:
+ - suite: Admin Article Metadata Form
+ testset: Admin Article Metadata Form
+ test: Preparation
+ steps:
+ - step: Go to admin journal and articles search, choose Articles from the "Journals
+ vs Articles" facets at the left
+ results:
+ - Each article in the search results has "Delete this article | Edit this article"
+ option in the lower right corner
+ - step: Find "Success 300" article
+ - step: Click "Edit this article"
+ results:
+ - The Admin Metadata Form for "Success 300" article is opened in the new window
+ - step: Check if PISSN and EISSN dropdowns have 1234-5678 and 9876-5432 options
+ - step: Check that PISSN and EISSN dropdowns have not 0000-0000 option
+ - step: Check the Authors section
+ results:
+ - There is only one author and no "Remove Author" button
+ - step: Click "Add Author"
+ results:
+ - New empty Author Subform appears, each has "Remove Author" option
+ - step: Click "Remove Author" under one of the authors
+ results:
+ - The author is removed from the list
+ - step: Change the title to "Success 400"
+ - step: Add an author filling in any string as a name, an affiliation and an orcid
+ id in the correct form, for example https://orcid.org/0001-1234-1234-444X
+ - step: Change all the other fields except doi and fulltext URL to something easily
+ recognisable
+ - step: Click "Update Article" button
+ results:
+ - Green banner saying "Article created/updated" is shown at the top of the page.
+ - step: Search for "Success 400" article again
+ - step: Close the page with the Article Metadata Form
+ - step: Click "Edit the article"
+ results:
+ - Confirm all the metadata is updated
-- title: Checking data validation
- context:
- role: Admin
- depends:
- - suite: Admin Article Metadata Form
- testset: Admin Article Metadata Form
- test: Updating data other then DOI and Fulltext URL
- steps:
- - step: Open "Success 400" article metadata form
- - step: 'Change DOI to any string in invalid format, eg: 0000'
- - step: 'Change author''s orcid_id to the wrong format (eg: "0000")'
- - step: Click "Update Article" button
- results:
- - Error "Invalid DOI. A DOI can optionally start with a prefix (such as "doi:"),
- followed by "10." and the remainder of the identifier" under DOI field and "Invalid
- ORCID iD. Please enter your ORCID iD as a full URL of the form https://orcid.org/0000-0000-0000-0000"
- is shown under orcid_id field
- - step: Close the form
- results:
- - Confirm the metadata of "Success 400" article has not change
+ - title: Checking data validation
+ context:
+ role: Admin
+ depends:
+ - suite: Admin Article Metadata Form
+ testset: Admin Article Metadata Form
+ test: Updating data other then DOI and Fulltext URL
+ steps:
+ - step: Open "Success 400" article metadata form
+ - step: 'Change DOI to any string in invalid format, eg: 0000'
+ - step: 'Change author''s orcid_id to the wrong format (eg: "0000")'
+ - step: Click "Update Article" button
+ results:
+ - Error "Invalid DOI. A DOI can optionally start with a prefix (such as "doi:"),
+ followed by "10." and the remainder of the identifier" under DOI field and "Invalid
+ ORCID iD. Please enter your ORCID iD as a full URL of the form https://orcid.org/0000-0000-0000-0000"
+ is shown under orcid_id field
+ - step: Close the form
+ results:
+ - Confirm the metadata of "Success 400" article has not change
-- title: Change DOI and Fulltext URL
- context:
- role: Admin
- depends:
- - suite: Admin Article Metadata Form
- testset: Admin Article Metadata Form
- test: Updating data other then DOI and Fulltext URL
- steps:
- - step: Open a "Success 400" article metadata form
- - step: Change DOI to 10.1234/200 and Fulltext URL to http://doaj.org/testing/500.pdf
- - step: Click "Update article" button
- results:
- - The red banner "Article could not be updated, as it matches another existing
- article. Please check your metadata, and contact us if you cannot resolve the
- issue yourself."
- - step: Change DOI to 10.1234/500 and Fulltext URL to http://doaj.org/testing/200.pdf
- - step: Click "Update article" button
- results:
- - The red banner "Article could not be updated, as it matches another existing
- article. Please check your metadata, and contact us if you cannot resolve the
- issue yourself."
- - step: Change DOI back to 10.1234/400 and Fulltext URL to http://doaj.org/testing/500.pdf
- - step: Click "Update article" button
- results:
- - Green banner "Article created/updated" is shown at the top page
- - step: Open the "Success 400" landing page
- results:
- - Confirm that Fulltext URL is changed to http://doaj.org/testing/500.pdf
- - step: Go back to the article metadata form
- - step: Change DOI to 10.1234/500
- - step: Click "Update article" button
- results:
- - Green banner "Article created/updated" is shown at the top page
- - step: Open the "Success 400" landing page
- results:
- - Confirm that Fulltext URL is changed to http://doaj.org/testing/500.pdf
- - Confirm only one article with DOI 10.1234/500 and fulltext URL http://doaj.org/testing/500.pdf
- exists
+ - title: Change DOI and Fulltext URL
+ context:
+ role: Admin
+ depends:
+ - suite: Admin Article Metadata Form
+ testset: Admin Article Metadata Form
+ test: Updating data other then DOI and Fulltext URL
+ steps:
+ - step: Open a "Success 400" article metadata form
+ - step: Change DOI to 10.1234/200 and Fulltext URL to http://doaj.org/testing/500.pdf
+ - step: Click "Update article" button
+ results:
+ - The red banner "Article could not be updated, as it matches another existing
+ article. Please check your metadata, and contact us if you cannot resolve the
+ issue yourself."
+ - step: Change DOI to 10.1234/500 and Fulltext URL to http://doaj.org/testing/200.pdf
+ - step: Click "Update article" button
+ results:
+ - The red banner "Article could not be updated, as it matches another existing
+ article. Please check your metadata, and contact us if you cannot resolve the
+ issue yourself."
+ - step: Change DOI back to 10.1234/400 and Fulltext URL to http://doaj.org/testing/500.pdf
+ - step: Click "Update article" button
+ results:
+ - Green banner "Article created/updated" is shown at the top page
+ - step: Open the "Success 400" landing page
+ results:
+ - Confirm that Fulltext URL is changed to http://doaj.org/testing/500.pdf
+ - step: Go back to the article metadata form
+ - step: Change DOI to 10.1234/500
+ - step: Click "Update article" button
+ results:
+ - Green banner "Article created/updated" is shown at the top page
+ - step: Open the "Success 400" landing page
+ results:
+ - Confirm that Fulltext URL is changed to http://doaj.org/testing/500.pdf
+ - Confirm only one article with DOI 10.1234/500 and fulltext URL http://doaj.org/testing/500.pdf
+ exists
+
+ - title: Check button linking to the article's page
+ context:
+ role: Admin
+ steps:
+ - step: Click "See this article in doaj" button under the article's title on the left
+ results:
+ - The article's public page is opened in a new tab
+ - On the article's public page at the top the button "Edit this article" is shown
+ - step: Click "Edit this article" button
+ results:
+ - The artcile's admin metadata form is opened in a new tab with correct data
+ - step: Confirm above buttons are shown only for admin user. Log out from admin account and log in as publisher
+ - step: Navigate to the article's public page as a publisher
+ results:
+ - The button "Edit this article" is not displayed
+ - step: Log out
+ - step: Navigate to the article's public page as an anonymous user
+ results:
+ - The button "Edit this article" is not displayed
diff --git a/doajtest/testbook/article_metadata_upload_form/article_metadata_upload_form.yml b/doajtest/testbook/article_metadata_upload_form/article_metadata_upload_form.yml
index 2e6d391ca1..2808e1065d 100644
--- a/doajtest/testbook/article_metadata_upload_form/article_metadata_upload_form.yml
+++ b/doajtest/testbook/article_metadata_upload_form/article_metadata_upload_form.yml
@@ -10,7 +10,7 @@ tests:
- step: Do not fill in any data yet. Click "Add Article" button at the bottom of
the page
results:
- - Black popup "Please fill that field in" below the Title field is shown
+ - You are scrolled back up to the Title field
- Title field is focussed (it is possible to type straight into the field without
the need to click in it)
- step: "In \"Article Title\" textbox enter valid article title\n (any string of\
@@ -21,10 +21,10 @@ tests:
- 'Red error: ''You must provide the Full-Text URL or the DOI'' appears under
the URL field and the DOI field'
- Red error "Please provide at least one author" under Authors fields appears
- - Red error "Either this field or Journal ISSN (online version) is required" under
- "Journal ISSN (print version)" appears
- - Red error "Either this field or Journal ISSN (print version) is required" under
- "Journal ISSN (online version)" appears
+ - Red error "Either this field or Online ISSN is required" under
+ "ISSN, Print" appears
+ - Red error "Either this field or Print ISSN is required" under
+ "ISSN, Online" appears
- step: In Authors section click on orange "Add more authors" button
results:
- One row for author is added
@@ -55,11 +55,10 @@ tests:
- step: Select 2 identical ISSNs
- step: Click "Add Article" button
results:
- - 'Errors: "This field must contain a different value to the field ''eissn''"
- and "This field must contain a different value to the field ''pissn''" are shown
- below ISSNs inputs'
+ - 'The error: "The Print and Online ISSNs supplied are identical. If you supply 2 ISSNs they must be different."
+ is shown below each ISSN field.'
- step: Choose different Online ISSN
- step: Click "Add Article" button
results:
- - 'At the top of the page you see the confirmation message: Article created/updated'
+ - 'At the top of the page you see the confirmation message: Article created/updated (Dismiss)'
- https://docs.google.com/spreadsheets/d/1KGv7DEwocDvdbT8giN9Aw2EWtZGzKympouEw_uR2q18/edit#gid=782367369
diff --git a/doajtest/testbook/article_xml_upload/article_doaj_xml_upload.yml b/doajtest/testbook/article_xml_upload/article_doaj_xml_upload.yml
index 6a896f9daf..37852ae306 100644
--- a/doajtest/testbook/article_xml_upload/article_doaj_xml_upload.yml
+++ b/doajtest/testbook/article_xml_upload/article_doaj_xml_upload.yml
@@ -21,8 +21,8 @@ tests:
based (e.g. an image file or a PDF)
- step: Click "Upload"
results:
- - A flash message with appropriate text appears at the top of the screen indicating an error has occurred
- - Your file is shown in the "History of uploads" with status "processing failed"
+ - A flash message with appropriate text appears at the top of the screen, indicating an error has occurred
+ - Your file is shown in the "History of uploads" with the status "processing failed"
and a suitable entry in the "Notes". Check that the explanation link goes to
a suitable reason and resolution for the problem.
@@ -38,8 +38,8 @@ tests:
- step: Choose "DOAJ Native XML" from "Format of the file" dropdown
- step: Click "Upload"
results:
- - A flash message with appropriate text appears at the top of the screen indicating an error has occurred
- - Your file is shown in the "History of uploads" with status "processing failed"
+ - A flash message with appropriate text appears at the top of the screen, indicating an error has occurred
+ - Your file is shown in the "History of uploads" with the status "processing failed"
and a suitable entry in the "Notes" (you may need to reload the page). Check
that the explanation link goes to a suitable reason and resolution for the problem.
@@ -55,8 +55,8 @@ tests:
- step: Choose "DOAJ Native XML" from "Format of the file" dropdown
- step: Click "Upload"
results:
- - A flash message with appropriate text appears at the top of the screen indicating an error has occurred
- - Your file is shown in the "History of uploads" with status "processing failed"
+ - A flash message with appropriate text appears at the top of the screen, indicating an error has occurred
+ - Your file is shown in the "History of uploads" with the status "processing failed"
and a suitable entry in the "Notes". Check that the explanation link goes to
a suitable reason and resolution for the problem.
@@ -75,12 +75,11 @@ tests:
results:
- 'A flash message appears at the top of the screen: File uploaded and waiting
to be processed. Check back here for updates.'
- - Your file is shown in the "History of uploads" with status "pending"
- - step: wait a short amount of time for the job to process, then reload the page
- (do not re-submit the form data). If the job remains in "pending", reload the
+ - Click away to another tab and then back - your file is shown in the "History of uploads" with the status "pending"
+ - step: wait a short amount of time for the job to process, then click away and then back again. If the job remains in "pending", reload the
page until the status changes.
results:
- - Your file is shown in the "History of uploads" with status "processing failed"
+ - Your file is shown in the "History of uploads" with the status "processing failed"
and a suitable entry in the "Notes". Check that the explanation link goes to
a suitable reason and resolution for the problem.
@@ -100,10 +99,9 @@ tests:
- step: Click "Upload"
results:
- 'A flash message appears at the top of the screen indicating a successful upload:
- File uploaded and waiting to be processed. Check back here for updates.(Dismiss)'
- - Your file is shown in the "History of uploads" with status "pending"
- - step: wait a short amount of time for the job to process, then reload the page
- (do not re-submit the form data). If the job remains in "pending", reload the
+ File uploaded and waiting to be processed. Check back here for updates. (Dismiss)'
+ - Click away to another tab and then back - your file is shown in the "History of uploads" with status "pending"
+ - step: wait a short amount of time for the job to process, then click away and then back. If the job remains in "pending", reload the
page until the status changes.
results:
- Your file is shown in the "History of uploads" with status "processing failed"
@@ -111,14 +109,14 @@ tests:
a suitable reason and resolution for the problem.
- step: click on "(show error details)" for the record in the "History of uploads"
results:
- - Additional error details are shown, indicating that the publisher does not own
+ - Clicking 'show error details' shows information indicating that the publisher does not own
ISSNs "0000-0000" and "0000-000X"
- title: Upload a file containing ISSN that has been withdrawn
context:
role: publisher
steps:
- - step: Ensure that the publisher owns a journal with ISSN 0000-0000 that is not
+ - step: Ensure that the publisher owns a journal with ISSN 0000-1111 that is not
in DOAJ (ie. has been withdrawn)
- step: Go to the "Upload Article XML" tab in the "Publisher Area"
- step: Choose "DOAJ Native XML" from "Format of the file" dropdown
@@ -128,19 +126,17 @@ tests:
- step: Click "Upload"
results:
- 'A flash message appears at the top of the screen indicating a successful upload:
- File uploaded and waiting to be processed. Check back here for updates.(Dismiss)'
- - Your file is shown in the "History of uploads" with status "pending"
- - step: wait a short amount of time for the job to process, then reload the page
- (do not re-submit the form data). If the job remains in "pending", reload the
+ File uploaded and waiting to be processed. Check back here for updates. (Dismiss)'
+ - Click away to another tab and then back - your file is shown in the "History of uploads" with the status "pending"
+ - step: wait a short amount of time for the job to process, then click away and then back. If the job remains in "pending", reload the
page until the status changes.
results:
- - Your file is shown in the "History of uploads" with status "processing failed"
+ - Your file is shown in the "History of uploads" with the status "processing failed"
and a suitable entry in the "Notes". Check that the explanation link goes to
a suitable reason and resolution for the problem.
- step: click on "(show error details)" for the record in the "History of uploads"
results:
- - Additional error details are shown, indicating that the journal has been withdrawn
- from DOAJ and therefore the article cannot be accepted
+ - extra information indicates that ISSN is not in DOAJ
- title: Upload a file containing ISSNs not previously seen in DOAJ
context:
@@ -156,13 +152,12 @@ tests:
- step: Click "Upload"
results:
- 'A flash message appears at the top of the screen indicating a successful upload:
- File uploaded and waiting to be processed. Check back here for updates.(Dismiss)'
- - Your file is shown in the "History of uploads" with status "pending"
- - step: wait a short amount of time for the job to process, then reload the page
- (do not re-submit the form data). If the job remains in "pending", reload the
+ File uploaded and waiting to be processed. Check back here for updates. (Dismiss)'
+ - Click away to another tab and then back - your file is shown in the "History of uploads" with the status "pending"
+ - step: wait a short amount of time for the job to process, then click away and then back. If the job remains in "pending", reload the
page until the status changes.
results:
- - Your file is shown in the "History of uploads" with status "processing failed"
+ - Your file is shown in the "History of uploads" with the status "processing failed"
and a suitable entry in the "Notes". Check that the explanation link goes to
a suitable reason and resolution for the problem.
- step: click on "(show error details)" for the record in the "History of uploads"
@@ -214,9 +209,9 @@ tests:
resource: /xml_upload_test_package/DOAJ/successful.xml
- step: Click "Upload"
results:
- - A flash message appears at the top of the screen indicating a successful upload
+ - A flash message appears at the top of the screen, indicating a successful upload
File uploaded and waiting to be processed. Check back here for updates.(Dismiss)
- - Your file is shown in the "History of uploads" with status "pending"
+ - Your file is shown in the "History of uploads" with the status "pending"
- step: wait a short amount of time for the job to process, then reload the page
(do not re-submit the form data). If the job remains in "pending", reload the
page until the status changes.
@@ -239,9 +234,9 @@ tests:
resource: /xml_upload_test_package/DOAJ/update.xml
- step: Click "Upload"
results:
- - A flash message appears at the top of the screen indicating a successful upload
+ - A flash message appears at the top of the screen, indicating a successful upload
File uploaded and waiting to be processed. Check back here for updates.(Dismiss)
- - Your file is shown in the "History of uploads" with status "pending"
+ - Your file is shown in the "History of uploads" with the status "pending"
- step: wait a short amount of time for the job to process, then reload the page
(do not re-submit the form data). If the job remains in "pending", reload the
page until the status changes.
@@ -258,16 +253,16 @@ tests:
role: publisher
steps:
- step: Run through test 7 and 8 to upload and update a new article
- - step: 'Make sure there are no other articles in the databse with the DOI: 10.1234/100.
+ - step: 'Make sure there are no other articles in the database with the DOI: 10.1234/100.
Delete those first.'
- step: Go to the "Upload Article XML" tab in the "Publisher Area"
- step: In the box "Provide a URL where we can download the XML", enter the URL below
resource: /xml_upload_test_package/DOAJ/successful.xml
- step: Click "Upload"
results:
- - A flash message appears at the top of the screen indicating that the file reference
+ - A flash message appears at the top of the screen, indicating that the file reference
was successfully received
- - Your file is shown in the "History of uploads" with status "pending"
+ - Your file is shown in the "History of uploads" with the status "pending"
- step: wait a short amount of time for the job to process, then reload the page
(do not re-submit the form data). If the job remains in "pending", reload the
page until the status changes.
@@ -361,4 +356,4 @@ tests:
results:
- Related background job is found
- status is "complete"
- - Outcome Status is "success"
\ No newline at end of file
+ - Outcome Status is "success"
diff --git a/doajtest/testbook/autocheck/application_submission_workflow.yml b/doajtest/testbook/autocheck/application_submission_workflow.yml
new file mode 100644
index 0000000000..00742c53d9
--- /dev/null
+++ b/doajtest/testbook/autocheck/application_submission_workflow.yml
@@ -0,0 +1,40 @@
+suite: Autocheck
+testset: Application Submission Workflow
+tests:
+
+- title: Submit application for autochecking
+ steps:
+ - step: To create the publisher and admin accounts required for this test, and to prepare the environment,
+ use the testdrive setup linked below
+ path: /testdrive/autocheck_application_submission
+ results:
+ - you receive a page which contains at least a set of admin account credentials and publisher account credentials
+ - step: Log in with a publisher account
+ path: /account/login
+ - step: Go to the application form
+ path: /apply/
+ - step: |
+ Complete the application form as you like, but ensure to set the following values:
+ * ISSN (print): 1848-3380
+ * ISSN (online): 0005-1144
+ * Archiving policy: CLOCKSS, LOCKSS
+ - step: Submit the application
+ results:
+ - The application is successfully submitted
+ - step: Log out as a publisher and log in as an administrator
+ - step: Go to the background jobs view
+ results:
+ - A background job is present for the application autochecks for the application you just submitted (it is probably
+ the top job, but if not limit by action "application_autochecks" to find it)
+ - The status of the job is either "queued" or "completed". If it is "queued" wait for it to finish (you will need to refresh
+ the page to see the status change)
+ - It should move to "completed" fairly quickly, if it does not the test may have failed
+ - step: Go to the application search and find the application you just submitted (e.g. sort by date applied, descending, and it
+ should be the first result)
+ - step: Open the application for reviewing and scroll through it
+ results:
+ - There is text at the top which tells you when the Autochecks were made, dated to today, and an option to Hide All Autochecks
+ - The ISSN (print) field has an autocheck annotation
+ - The ISSN (online) field has an autocheck annotation
+ - The Archiving Policy question has autocheck annotations for all selected services
+ - step: Delete the accounts you created for this test by clicking the "Teardown" link in the testdrive page you used to create them
\ No newline at end of file
diff --git a/doajtest/testbook/autocheck/autocheck.yml b/doajtest/testbook/autocheck/autocheck.yml
new file mode 100644
index 0000000000..e13965b5ac
--- /dev/null
+++ b/doajtest/testbook/autocheck/autocheck.yml
@@ -0,0 +1,122 @@
+suite: Autocheck
+testset: Autocheck
+tests:
+
+- title: Preparation
+ context:
+ role: Any Authenticated User
+ steps:
+ - step: Activate the testdrive setup for this test suite, by using the following url
+ path: /testdrive/autocheck
+ results:
+ - You receive the testdrive setup details, including an admin account for you to use,
+ and an application and journal which have been autochecked for testing
+ - step: Log into DOAJ using the admin credentials supplied by the testdrive. You may want to do
+ this in a private browsing window, so you can remain logged in to your own account in your
+ main window.
+ path: /account/login
+ results:
+ - You are logged in as an admin user
+ - step: You may now proceed to the tests below
+
+- title: Application autochecks
+ context:
+ role: Admin
+ depends:
+ - suite: Autocheck
+ testset: Autocheck
+ test: Preparation
+ steps:
+ - step: Go to the Application admin_url supplied by the testdrive setup
+ results:
+ - You are looking at a test Application created for this test
+ - step: Scroll down to find the ISSN (print) and ISSN (online) fields
+ results:
+ - The Print ISSN field is annotated with a green tick, and text which says that ISSN
+ is fully registered at ISSN.org
+ - The Electronic ISSN field is annotated with an orange cross, which says the ISSN is not
+ registered at ISSN.org
+ - step: Click on one of the "see record" links in the annotation
+ results:
+ - The link is opened in a new window/tab
+ - You are taken to the ISSN.org record. Note that for the purposes of this test, this
+ is a random record on ISSN.org, unrelated to the actual record in DOAJ.
+ - step: Close the ISSN.org window/tab and return to the application form
+ - step: Scroll to the "Best Practice" section of the application form, and look at the "Long-term preservation services" question
+ results:
+ - "4 checks are visible attached to this question, for: CLOCKSS, LOCKSS, PMC and PKP PN"
+ - CLOCKSS is annotated with a green tick, saying it is archived
+ - LOCKSS is annotated with a red cross, saying it is not current
+ - PMC is annotated with a grey info symbol, saying it is not currently recorded by Keepers
+ - PKP PN is annotated with a red cross, saying it is not archived
+ - step: Click on one of the "see record" links in the annotation
+ results:
+ - The link is opened in a new window/tab
+ - You are taken to the ISSN.org record. Note that for the purposes of this test, this
+ is a random record on ISSN.org, unrelated to the actual record in DOAJ.
+ - step: Close the ISSN.org window/tab and return to the application form
+ - step: Scroll to the top of the application form
+ results:
+ - There is text which tells you when the Autochecks were made, and an option to Hide All Autochecks
+ - step: Click "Hide All Autochecks", then scroll through the form
+ results:
+ - The autochecks are all hidden
+ - step: Return to the top of the application form and click "Show All Autochecks", then scroll through the form
+ results:
+ - The autochecks are all visible again
+
+- title: Journal autochecks
+ context:
+ role: Admin
+ depends:
+ - suite: Autocheck
+ testset: Autocheck
+ test: Preparation
+ steps:
+ - step: Go to the Journal admin_url supplied by the testdrive setup
+ results:
+ - You are looking at a test Journal created for this test
+ - step: Scroll down to find the ISSN (print) and ISSN (online) fields
+ results:
+ - The Print ISSN field is annotated with a green tick, and text which says that ISSN
+ is fully registered at ISSN.org
+ - The Electronic ISSN field is annotated with an red cross, which says the ISSN is not
+ found at ISSN.org
+ - step: Click on one of the "see record" links in the annotation
+ results:
+ - The link is opened in a new window/tab
+ - You are taken to the ISSN.org record. Note that for the purposes of this test, this
+ is a random record on ISSN.org, unrelated to the actual record in DOAJ.
+ - step: Close the ISSN.org window/tab and return to the journal form
+ - step: Scroll to the "Best Practice" section of the application form, and look at the "Long-term preservation services" question
+ results:
+ - "4 checks are visible attached to this question, for: CLOCKSS, LOCKSS, PMC and PKP PN"
+ - CLOCKSS is annotated with a green tick, saying it is archived
+ - LOCKSS is annotated with a red cross, saying it is not current
+ - PMC is annotated with a grey info symbol, saying it is not currently recorded by Keepers
+ - PKP PN is annotated with a red cross, saying it is not archived
+ - step: Click on one of the "see record" links in the annotation
+ results:
+ - The link is opened in a new window/tab
+ - You are taken to the ISSN.org record. Note that for the purposes of this test, this
+ is a random record on ISSN.org, unrelated to the actual record in DOAJ.
+ - step: Close the ISSN.org window/tab and return to the journal form
+ - step: Scroll to the top of the journal form
+ results:
+ - There is text which tells you when the Autochecks were made, and an option to Hide All Autochecks
+ - step: Click "Hide All Autochecks", then scroll through the form
+ results:
+ - The autochecks are all hidden
+ - step: Return to the top of the journal form and click "Show All Autochecks", then scroll through the form
+ results:
+ - The autochecks are all visible again
+
+- title: Teardown
+ context:
+ role: Any Authenticated User
+ steps:
+ - step: Close your private browsing window you used for the test
+ - step: Click the "Teardown" url supplied by the testdrive setup
+ results:
+ - You receive a success notification in your browser window
+ - step: You can now close the testdrive browser tab/window
\ No newline at end of file
diff --git a/doajtest/testbook/dashboards/maned_todo.yml b/doajtest/testbook/dashboards/maned_todo.yml
index 8bc3564a6d..96c7b171c4 100644
--- a/doajtest/testbook/dashboards/maned_todo.yml
+++ b/doajtest/testbook/dashboards/maned_todo.yml
@@ -21,41 +21,75 @@ tests:
in the ready state, an application in your maned group which is in the completed state, an application in your maned group which has
not had an associate editor assigned, an application created over 10 weeks ago in your maned group, an application in your maned
group which has not been updated for 8 weeks."
+ - "The user account should be assigned to one update request which was created over 4 weeks ago"
steps:
- step: log in as a managing editor
- step: Go to the maned dashboard page
path: /dashboard
results:
- - You can see 13 applications in your priority list
+ - You can see 16 applications in your priority list
- Your priority list contains a mixture of managing editor items (actions related to teams you are the managing editor for),
editor items (actions related to teams you are the editor for) and associate items (actions related to applications which
are assigned specifically to you for review).
+ - Your highest priority item (first in the list) is for an update request which was submitted this month
- At least one of your priority items is for an application which is older than 10 weeks (it should indicate that it is for your maned group)
- At least one of your priority items is for an application which has been inactive (stalled) for more than 8 weeks (it should indicate that it is for your maned group)
- At least one of your priority items is for an application in the state ready (it should indicate that it is for your maned group)
- At least one of your priority items is for an application in the completed state which has not been updated for more than 2 weeks (it should indicate that it is for your maned group)
- At least one of your priority items is for an application in the pending state which has not been updated for more than 2 weeks (it should indicate that it is for your maned group)
+ - Your lowest priority item (last in the list) is for an update request which was submitted this month
- step: click on the managing editor's ready application
- step: Change the application status to "Accepted" and save
- step: close the tab, return to the dashboard and reload the page
results:
- - You can see 12 applications in your priority list
+ - You can see 15 applications in your priority list
- The application you have just edited has disappeared from your priority list
- step: click on the [in progress] stalled managing editor's application
- step: make any minor adjustment to the metadata and save
- step: close the tab, return to the dashboard and reload the page
results:
- - You can see 11 applications in your priority list
+ - You can see 14 applications in your priority list
- The application you just edited has disappeared from your priority list
- step: click on the "completed" maned application
- step: Change the application to "ready" status
- step: close the tab, return to the dashboard and reload the page
results:
- - You can still see 11 applications in your priority list
+ - You can still see 14 applications in your priority list
- The completed application you just moved to ready is now in your priority list as a ready application
- step: click on the pending managing editor's application
- step: Assign the item to an editor in the selected group (there should be a test editor available to you to select)
- step: close the tab, return to the dashboard and reload the page
results:
- - You have 10 applications left in your todo list
- - The pending application you just edited is no longer visible
\ No newline at end of file
+ - You have 13 applications left in your todo list
+ - The pending application you just edited is no longer visible
+
+ - title: Filtering the todo list
+ context:
+ role: admin
+ testdrive: todo_maned_editor_associate
+ setup:
+ - Use the todo_maned_editor_associate testdrive to setup for this test, OR follow the setup from the previous test
+ steps:
+ - step: log in as a managing editor
+ - step: Go to the maned dashboard page
+ path: /dashboard
+ results:
+ - You can see 16 applications in your priority list
+ - Your highest priority item (first in the list) is for an update request which was submitted last month
+ - Your lowest priority item (last in the list) is for an update request which was submitted this month
+ - On the top right of the todo list are a set of filter buttons "Show all", "New Applications" and "Update Requests"
+ - The "Show all" button is highlighted
+ - step: click on the "New Applications" filter button
+ results:
+ - You can see 14 applications in your priority list
+ - The update requests which were on the previous screen are no longer visible
+ - The "New Applications" filter button is now highlighted
+ - step: click on the "Update Request" filter button
+ results:
+ - You can see 12application in your priority list
+ - Your highest priority item (first in the list) is for an update request which was submitted last month
+ - Your lowest priority item (last in the list) is for an update request which was submitted this month
+ - The "Update Request" filter button is now highlighted
+ - step: click the "Show all" filter button
+ results:
+ - You are back to the original display, containing both applications and update requests
\ No newline at end of file
diff --git a/doajtest/testbook/journal_form/maned_form.yml b/doajtest/testbook/journal_form/maned_form.yml
index 935fe4504f..7206d57653 100644
--- a/doajtest/testbook/journal_form/maned_form.yml
+++ b/doajtest/testbook/journal_form/maned_form.yml
@@ -126,3 +126,22 @@ tests:
- step: Attempt to paste the value (use separate editor)
results:
- Correct value is pasted
+- title: Check button linking to the article's page
+ context:
+ role: Admin
+ steps:
+ - step: Click "See this journal in doaj" button under the journal's title on the left
+ results:
+ - The journal's public page is opened in a new tab
+ - On the journal's public page at the top the button "Edit this journal" is shown
+ - step: Click "Edit this journal" button
+ results:
+ - The journal's admin metadata form is opened in a new tab with correct data
+ - step: Confirm above buttons are shown only for admin user. Log out from admin account and log in as publisher
+ - step: Navigate to the article's public page as a publisher
+ results:
+ - The button "Edit this journal" is not displayed
+ - step: Log out
+ - step: Navigate to the article's public page as an anonymous user
+ results:
+ - The button "Edit this journal" is not displayed
diff --git a/doajtest/testbook/new_application_form/maned_form.yml b/doajtest/testbook/new_application_form/maned_form.yml
index 10c524df2a..82c7fdf388 100644
--- a/doajtest/testbook/new_application_form/maned_form.yml
+++ b/doajtest/testbook/new_application_form/maned_form.yml
@@ -48,7 +48,10 @@ tests:
results:
- A message at the top of the form tells you that you can only choose one or two
subject classifications
- - step: Remove one subject classification and 'Save'
+ - step: Remove one subject classification
+ - step: Click "Unlock & Close"
+ results: Confirmation dialog is displayed warning you about unsaved changes
+ - step: Click "Stay on Page" and then 'Save'
results:
- The form saves
- The changes you applied, both to the form, and in the functionality box, have
diff --git a/doajtest/testdrive/autocheck.py b/doajtest/testdrive/autocheck.py
new file mode 100644
index 0000000000..7e9bf4fbbe
--- /dev/null
+++ b/doajtest/testdrive/autocheck.py
@@ -0,0 +1,171 @@
+from portality import constants
+from doajtest.testdrive.factory import TestDrive
+from doajtest.fixtures.v2.applications import ApplicationFixtureFactory
+from doajtest.fixtures.v2.journals import JournalFixtureFactory
+from portality import models
+from datetime import datetime
+from portality.autocheck.checkers.issn_active import ISSNActive, ISSNChecker
+from portality.autocheck.resources.issn_org import ISSNOrgData
+from portality.autocheck.checkers.keepers_registry import KeepersRegistry
+from portality.bll import DOAJ
+from flask import url_for
+from portality.core import app
+
+class Autocheck(TestDrive):
+
+ def setup(self) -> dict:
+ un = self.create_random_str()
+ pw = self.create_random_str()
+ acc = models.Account.make_account(un + "@example.com", un, "Admin " + un, [constants.ROLE_ADMIN])
+ acc.set_password(pw)
+ acc.save()
+
+ ##################################################
+ ## Setup and Application with the following features
+ ##
+ ## - Print ISSN registered at ISSN.org
+ ## - Electronic ISSN not registered at ISSN.org
+ ## - 3 preservation services:
+ ## - CLOCKSS - currently archived
+ ## - LOCKSS - not currently archived
+ ## - PMC - not registered
+ source = ApplicationFixtureFactory.make_application_source()
+ ap = models.Application(**source)
+ ap.application_type = constants.APPLICATION_TYPE_NEW_APPLICATION
+ ap.remove_current_journal()
+ ap.remove_related_journal()
+ apbj = ap.bibjson()
+ apbj.set_preservation(["CLOCKSS", "LOCKSS", "PMC", "PKP PN"], "http://policy.example.com")
+ ap.set_id(ap.makeid())
+ ap.save()
+
+ bj = ap.bibjson()
+ pissn = bj.get_one_identifier(bj.P_ISSN)
+ eissn = bj.get_one_identifier(bj.E_ISSN)
+
+ thisyear = datetime.utcnow().year
+
+ pissn_data = ISSNOrgData({
+ "mainEntityOfPage": {
+ "version": "Register" # this means the ISSN is registered at ISSN.org
+ },
+ "subjectOf": [
+ {
+ "@type": "ArchiveComponent",
+ "holdingArchive": {
+ "@id": "http://issn.org/organization/keepers#clockss"
+ },
+ "temporalCoverage": "2022/" + str(thisyear)
+ },
+ {
+ "@type": "ArchiveComponent",
+ "holdingArchive": {
+ "@id": "http://issn.org/organization/keepers#lockss"
+ },
+ "temporalCoverage": "2019/2020"
+ }
+ ]
+ })
+
+ eissn_data = ISSNOrgData({
+ "mainEntityOfPage": {
+ "version": "Pending" # this means the ISSN is not registered at ISSN.org
+ },
+ "subjectOf": [
+ {
+ "@type": "ArchiveComponent",
+ "holdingArchive": {
+ "@id": "http://issn.org/organization/keepers#clockss"
+ },
+ "temporalCoverage": "2022/" + str(thisyear)
+ },
+ {
+ "@type": "ArchiveComponent",
+ "holdingArchive": {
+ "@id": "http://issn.org/organization/keepers#lockss"
+ },
+ "temporalCoverage": "2019/2020"
+ }
+ ]
+ })
+
+ old_retrieve_from_source = ISSNChecker.retrieve_from_source
+ ISSNChecker.retrieve_from_source = lambda *args, **kwargs: (
+ eissn,
+ "https://portal.issn.org/resource/ISSN/2682-4396",
+ eissn_data,
+ False,
+ pissn,
+ "https://portal.issn.org/resource/ISSN/2682-4396",
+ pissn_data,
+ False)
+
+ acSvc = DOAJ.autochecksService(
+ autocheck_plugins=[
+ # (journal, application, plugin)
+ (True, True, ISSNActive),
+ (True, True, KeepersRegistry)
+ ]
+ )
+ ac1 = acSvc.autocheck_application(ap)
+
+ ##################################################
+ ## Setup a Journal with the following features
+ ##
+ ## - Print ISSN registered at ISSN.org
+ ## - Electronic ISSN not found
+ ## - 3 preservation services:
+ ## - CLOCKSS - currently archived
+ ## - LOCKSS - not currently archived
+ ## - PMC - not registered
+
+ source = JournalFixtureFactory.make_journal_source()
+ j = models.Journal(**source)
+ j.remove_current_application()
+ j.set_id(ap.makeid())
+ j.save()
+
+ bj = j.bibjson()
+ pissn = bj.get_one_identifier(bj.P_ISSN)
+ eissn = bj.get_one_identifier(bj.E_ISSN)
+
+ ISSNChecker.retrieve_from_source = lambda *args, **kwargs: (
+ eissn,
+ "https://portal.issn.org/resource/ISSN/9999-000X",
+ None, # Don't pass in any data, so we get the Not Found response
+ False,
+ pissn,
+ "https://portal.issn.org/resource/ISSN/2682-4396",
+ pissn_data,
+ False)
+
+ ac2 = acSvc.autocheck_journal(j)
+
+ ISSNChecker.retrieve_from_source = old_retrieve_from_source
+
+ return {
+ "account": {
+ "username": acc.id,
+ "password": pw
+ },
+ "application": {
+ "id": ap.id,
+ "admin_url": app.config.get("BASE_URL") + url_for("admin.application", application_id=ap.id)
+ },
+ "journal": {
+ "id": j.id,
+ "admin_url": app.config.get("BASE_URL") + url_for("admin.journal_page", journal_id=j.id)
+ },
+ "autocheck": {
+ "application": ac1.id,
+ "journal": ac2.id
+ }
+ }
+
+ def teardown(self, params):
+ models.Account.remove_by_id(params["account"]["username"])
+ models.Application.remove_by_id(params["application"]["id"])
+ models.Journal.remove_by_id(params["journal"]["id"])
+ models.Autocheck.remove_by_id(params["autocheck"]["application"])
+ models.Autocheck.remove_by_id(params["autocheck"]["journal"])
+ return {"status": "success"}
diff --git a/doajtest/testdrive/autocheck_application_submission.py b/doajtest/testdrive/autocheck_application_submission.py
new file mode 100644
index 0000000000..fd42eff85d
--- /dev/null
+++ b/doajtest/testdrive/autocheck_application_submission.py
@@ -0,0 +1,50 @@
+from portality import constants
+from doajtest.testdrive.factory import TestDrive
+from portality import models
+
+class AutocheckApplicationSubmission(TestDrive):
+ """
+ setup for the testbook test autocheck/application_submission_workflow
+ """
+
+ def setup(self) -> dict:
+ # admin
+ un = self.create_random_str()
+ pw1 = self.create_random_str()
+ admin = models.Account.make_account(un + "@example.com", un, "Admin " + un, [constants.ROLE_ADMIN])
+ admin.set_password(pw1)
+ admin.save()
+
+ # publisher
+ un = self.create_random_str()
+ pw2 = self.create_random_str()
+ pub = models.Account.make_account(un + "@example.com", un, "Publisher " + un, [constants.ROLE_PUBLISHER])
+ pub.set_password(pw2)
+ pub.save()
+
+ # ensure that the issns that we are going to use in the test are removed from the database
+ js = models.Journal.find_by_issn("1848-3380")
+ if js is not None:
+ for j in js:
+ j.delete()
+
+ js = models.Journal.find_by_issn("0005-1144")
+ if js is not None:
+ for j in js:
+ j.delete()
+
+ return {
+ "admin": {
+ "username": admin.id,
+ "password": pw1
+ },
+ "publisher": {
+ "username": pub.id,
+ "password": pw2
+ }
+ }
+
+ def teardown(self, params):
+ models.Account.remove_by_id(params["admin"]["username"])
+ models.Account.remove_by_id(params["publisher"]["username"])
+ return {"status": "success"}
diff --git a/doajtest/testdrive/todo_maned_editor_associate.py b/doajtest/testdrive/todo_maned_editor_associate.py
index a6efd6f747..1fa8ff936e 100644
--- a/doajtest/testdrive/todo_maned_editor_associate.py
+++ b/doajtest/testdrive/todo_maned_editor_associate.py
@@ -152,18 +152,42 @@ def build_maned_applications(un, eg, owner, eponymous_group):
"title": un + " Maned Low Priority Pending Application"
}]
+ lmur = build_application(un + " Last Month Maned Update Request", 5 * w, 5 * w, constants.APPLICATION_STATUS_UPDATE_REQUEST,
+ editor_group=eponymous_group.name, owner=owner, update_request=True)
+ lmur.save()
+
+ tmur = build_application(un + " This Month Maned Update Request", 0, 0, constants.APPLICATION_STATUS_UPDATE_REQUEST,
+ editor_group=eponymous_group.name, owner=owner, update_request=True)
+ tmur.save()
+
+ apps["update_request"] = [
+ {
+ "id": lmur.id,
+ "title": un + " Last Month Maned Update Request"
+ },
+ {
+ "id": tmur.id,
+ "title": un + " This Month Maned Update Request"
+ }
+ ]
+
return apps
-def build_application(title, lmu_diff, cd_diff, status, editor=None, editor_group=None, owner=None):
+def build_application(title, lmu_diff, cd_diff, status, editor=None, editor_group=None, owner=None, update_request=False):
source = ApplicationFixtureFactory.make_application_source()
ap = models.Application(**source)
ap.bibjson().title = title
ap.set_id(ap.makeid())
- ap.remove_current_journal()
- ap.remove_related_journal()
del ap.bibjson().discontinued_date
- ap.application_type = constants.APPLICATION_TYPE_NEW_APPLICATION
+
+ if update_request:
+ ap.application_type = constants.APPLICATION_TYPE_UPDATE_REQUEST
+ else:
+ ap.remove_current_journal()
+ ap.remove_related_journal()
+ ap.application_type = constants.APPLICATION_TYPE_NEW_APPLICATION
+
ap.set_last_manual_update(dates.before(datetime.utcnow(), lmu_diff))
ap.set_created(dates.before(datetime.utcnow(), cd_diff))
ap.set_date_applied(dates.before(datetime.utcnow(), cd_diff))
diff --git a/doajtest/unit/api_tests/test_api_account.py b/doajtest/unit/api_tests/test_api_account.py
index 5cc1b1b8ea..0ea640259f 100644
--- a/doajtest/unit/api_tests/test_api_account.py
+++ b/doajtest/unit/api_tests/test_api_account.py
@@ -1,5 +1,6 @@
from flask import Response
+from doajtest import helpers
from doajtest.helpers import DoajTestCase, with_es
from portality import models
from portality.core import load_account_for_login_manager
@@ -10,6 +11,7 @@ class TestAPIClient(DoajTestCase):
@classmethod
def setUpClass(cls):
super(TestAPIClient, cls).setUpClass()
+ helpers.initialise_index()
# Turn off debug so we're allowed to add these routes after the app has been used in other tests
cls.app_test.debug = False
diff --git a/doajtest/unit/autocheck_resources/__init__.py b/doajtest/unit/autocheck_resources/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/doajtest/unit/autocheck_resources/test_issn_org.py b/doajtest/unit/autocheck_resources/test_issn_org.py
new file mode 100644
index 0000000000..180945325c
--- /dev/null
+++ b/doajtest/unit/autocheck_resources/test_issn_org.py
@@ -0,0 +1,35 @@
+from doajtest.helpers import DoajTestCase
+from doajtest.fixtures import ApplicationFixtureFactory, IssnOrgFixtureFactory
+from doajtest.mocks.autocheck_resource_bundle_Resource import ResourceBundleResourceMockFactory
+
+from portality.autocheck.checkers.issn_active import ISSNActive
+from portality import models
+from portality.autocheck.resource_bundle import Resource, ResourceBundle
+from portality.autocheck.resources.issn_org import ISSNOrg
+
+import responses # mocks for the requests library
+
+
+class TestISSNOrg(DoajTestCase):
+ def setUp(self):
+ super(TestISSNOrg, self).setUp()
+
+ def tearDown(self):
+ super(TestISSNOrg, self).tearDown()
+
+ @responses.activate
+ def test_01_issn_fetch(self):
+ resources = ResourceBundle()
+ issn_org = ISSNOrg(resources)
+
+ rsp1 = responses.Response(
+ method="GET",
+ url=issn_org.reference_url("1234-5678"),
+ body=IssnOrgFixtureFactory.web_page_body()
+ )
+ responses.add(rsp1)
+
+ data = issn_org.fetch("1234-5678")
+
+ assert data is not None
+ assert data.is_registered()
diff --git a/doajtest/unit/autocheck_resources/test_resource.py b/doajtest/unit/autocheck_resources/test_resource.py
new file mode 100644
index 0000000000..98ebf55174
--- /dev/null
+++ b/doajtest/unit/autocheck_resources/test_resource.py
@@ -0,0 +1,35 @@
+from doajtest.helpers import DoajTestCase
+from doajtest.fixtures import ApplicationFixtureFactory, IssnOrgFixtureFactory
+from doajtest.mocks.autocheck_resource_bundle_Resource import ResourceBundleResourceMockFactory
+
+from portality.autocheck.checkers.issn_active import ISSNActive
+from portality import models
+from portality.autocheck.resource_bundle import Resource, ResourceBundle, ResourceUnavailable
+from portality.autocheck.resources.issn_org import ISSNOrg
+
+import responses # mocks for the requests library
+
+
+class TestResource(DoajTestCase):
+ def setUp(self):
+ super(TestResource, self).setUp()
+
+ def tearDown(self):
+ super(TestResource, self).tearDown()
+
+ def test_01_resource_bundle(self):
+ resources = ResourceBundle()
+
+ resinst = Resource(resources)
+ resinst.fetch_fresh = lambda *args, **kwargs: {"test": "data"}
+ data = resinst.fetch("arbitrary_resource")
+
+ assert data == {"test": "data"}
+ assert resources.get(resinst.make_resource_id()) == {"test": "data"}
+
+ def test_02_resource_unavailable(self):
+ resources = ResourceBundle()
+
+ resinst = Resource(resources)
+ with self.assertRaises(ResourceUnavailable):
+ data = resinst.fetch("arbitrary_resource")
diff --git a/doajtest/unit/autocheckers/__init__.py b/doajtest/unit/autocheckers/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/doajtest/unit/autocheckers/test_issn_active.py b/doajtest/unit/autocheckers/test_issn_active.py
new file mode 100644
index 0000000000..b83eb8f316
--- /dev/null
+++ b/doajtest/unit/autocheckers/test_issn_active.py
@@ -0,0 +1,105 @@
+from doajtest.helpers import DoajTestCase
+from doajtest.fixtures import ApplicationFixtureFactory
+from doajtest.mocks.autocheck_resource_bundle_Resource import ResourceBundleResourceMockFactory
+
+from portality.autocheck.checkers.issn_active import ISSNActive
+from portality import models
+from portality.autocheck.resource_bundle import Resource, ResourceBundle
+
+
+class TestISSNActive(DoajTestCase):
+ def setUp(self):
+ self.old_fetch = Resource.fetch
+ super(TestISSNActive, self).setUp()
+
+ def tearDown(self):
+ Resource.fetch = self.old_fetch
+ super(TestISSNActive, self).tearDown()
+
+ def test_01_issn_fetch_fail(self):
+ Resource.fetch = ResourceBundleResourceMockFactory.fail_fetch()
+
+ issn_active = ISSNActive()
+
+ form = {
+ "pissn": "1234-5678",
+ "eissn": "9876-5432"
+ }
+
+ source = ApplicationFixtureFactory.make_application_source()
+ app = models.Application(**source)
+
+ autochecks = models.Autocheck()
+ resources = ResourceBundle()
+
+ issn_active.check(form, app, autochecks, resources, logger=lambda x: x)
+
+ assert len(autochecks.checks) == 2
+ for anno in autochecks.checks:
+ assert anno.get("advice") == issn_active.UNABLE_TO_ACCESS
+
+ def test_02_not_found(self):
+ Resource.fetch = ResourceBundleResourceMockFactory.not_found_fetch()
+
+ issn_active = ISSNActive()
+
+ form = {
+ "pissn": "1234-5678",
+ "eissn": "9876-5432"
+ }
+
+ source = ApplicationFixtureFactory.make_application_source()
+ app = models.Application(**source)
+
+ autochecks = models.Autocheck()
+ resources = ResourceBundle()
+
+ issn_active.check(form, app, autochecks, resources, logger=lambda x: x)
+
+ assert len(autochecks.checks) == 2
+ for anno in autochecks.checks:
+ assert anno.get("advice") == issn_active.NOT_FOUND
+
+ def test_03_fully_validated(self):
+ Resource.fetch = ResourceBundleResourceMockFactory.no_contact_resource_fetch(version="Register")
+
+ issn_active = ISSNActive()
+
+ form = {
+ "pissn": "1234-5678",
+ "eissn": "9876-5432"
+ }
+
+ source = ApplicationFixtureFactory.make_application_source()
+ app = models.Application(**source)
+
+ autochecks = models.Autocheck()
+ resources = ResourceBundle()
+
+ issn_active.check(form, app, autochecks, resources, logger=lambda x: x)
+
+ assert len(autochecks.checks) == 2
+ for anno in autochecks.checks:
+ assert anno.get("advice") == issn_active.FULLY_VALIDATED
+
+ def test_04_not_validated(self):
+ Resource.fetch = ResourceBundleResourceMockFactory.no_contact_resource_fetch(version="Pending")
+
+ issn_active = ISSNActive()
+
+ form = {
+ "pissn": "1234-5678",
+ "eissn": "9876-5432"
+ }
+
+ source = ApplicationFixtureFactory.make_application_source()
+ app = models.Application(**source)
+
+ autochecks = models.Autocheck()
+ resources = ResourceBundle()
+
+ issn_active.check(form, app, autochecks, resources, logger=lambda x: x)
+
+ assert len(autochecks.checks) == 2
+ for anno in autochecks.checks:
+ assert anno.get("advice") == issn_active.NOT_VALIDATED
\ No newline at end of file
diff --git a/doajtest/unit/autocheckers/test_keepers_registry.py b/doajtest/unit/autocheckers/test_keepers_registry.py
new file mode 100644
index 0000000000..7e49f4612f
--- /dev/null
+++ b/doajtest/unit/autocheckers/test_keepers_registry.py
@@ -0,0 +1,61 @@
+from doajtest.helpers import DoajTestCase
+from doajtest.fixtures import ApplicationFixtureFactory
+from doajtest.mocks.autocheck_resource_bundle_Resource import ResourceBundleResourceMockFactory
+
+from portality.autocheck.checkers.keepers_registry import KeepersRegistry
+from portality import models
+from portality.autocheck.resource_bundle import Resource, ResourceBundle
+
+
+class TestKeepersRegistry(DoajTestCase):
+ def setUp(self):
+ self.old_fetch = Resource.fetch
+ super(TestKeepersRegistry, self).setUp()
+
+ def tearDown(self):
+ Resource.fetch = self.old_fetch
+ super(TestKeepersRegistry, self).tearDown()
+
+ # Note that we do not test the failure to fetch cases as they are already covered
+ # by the ISSNActive tests
+
+ def test_01_registered(self):
+ Resource.fetch = ResourceBundleResourceMockFactory.no_contact_resource_fetch(archive_components={
+ "CLOCKSS": True,
+ "LOCKSS": True,
+ "Internet Archive": False
+ })
+
+ kr = KeepersRegistry()
+
+ form = {
+ "pissn": "1234-5678",
+ "eissn": "9876-5432",
+ "preservation_service": ["LOCKSS", "Internet Archive", "PKP PN"]
+ }
+
+ source = ApplicationFixtureFactory.make_application_source()
+ app = models.Application(**source)
+
+ autochecks = models.Autocheck()
+ resources = ResourceBundle()
+
+ kr.check(form, app, autochecks, resources, logger=lambda x: x)
+
+ assert len(autochecks.checks) == 3
+
+ checks = [False, False, False]
+ for check in autochecks.checks:
+ if check["context"]["service"] == "LOCKSS":
+ assert check["advice"] == kr.PRESENT
+ checks[0] = True
+
+ if check["context"]["service"] == "Internet Archive":
+ assert check["advice"] == kr.OUTDATED
+ checks[1] = True
+
+ if check["context"]["service"] == "PKP PN":
+ assert check["advice"] == kr.MISSING
+ checks[2] = True
+
+ assert all(checks)
\ No newline at end of file
diff --git a/doajtest/unit/resources/annotation_examples.csv b/doajtest/unit/resources/annotation_examples.csv
new file mode 100644
index 0000000000..c6766743fe
--- /dev/null
+++ b/doajtest/unit/resources/annotation_examples.csv
@@ -0,0 +1,80 @@
+2587-2559
+1300-3747
+2544-963X
+2579-4965
+1848-9184
+2217-5563
+1816-6326
+2079-1771
+2519-2752
+2560-5011
+1680-2004
+2073-753X
+2288-2294
+2093-0569
+2645-6109
+2617-9555
+2313-3783
+2663-5828
+1791-4884
+2652-3647
+2528-9462
+2223-2125
+2384-8901
+2447-018X
+2354-7006
+2352-9148
+0807-7096
+2175-5787
+1699-7778
+2344-5416
+1300-3747
+2352-9148
+1816-6326
+2110-5820
+2579-4965
+2073-753X
+2288-2294
+2544-963X
+2110-5820
+2383-4420
+2287-9129
+2587-2559
+2544-963X
+2579-4965
+1647-0818
+1549-4497
+1647-0818
+2367-5144
+2078-5127
+1542-6300
+1022-9825
+1548-7733
+2316-9125
+2767-1402
+1678-4766
+2391-6702
+1848-9184
+1504-3029
+2519-2752
+1848-3380
+1816-6326
+2217-5563
+2384-8901
+2447-018X
+2386-4303
+1647-0818
+1769-7298
+2663-2365
+1022-9825
+2652-3647
+2354-7006
+1816-6326
+2663-5828
+1406-0132
+2078-5127
+1848-9184
+2078-5127
+2413-9432
+2079-1771
+3434-3434
diff --git a/doajtest/unit/resources/issn_org_web_page.html b/doajtest/unit/resources/issn_org_web_page.html
new file mode 100644
index 0000000000..4a10e7bfb7
--- /dev/null
+++ b/doajtest/unit/resources/issn_org_web_page.html
@@ -0,0 +1,695 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ISSN 2682-4396 (Print) | Egyptian Journal of Medical Research | The ISSN Portal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ×
+ Please ensure you modified the corresponding record in ISSN+ or in your local catalogue before declaring the modification request is processed. Otherwise, the modification will not be reported in the Portal record
+
{% set fs = formulaic_context.fieldset("apc") %}
{{ fs.label }}
{% for f in fs.fields() %}
diff --git a/portality/templates/application_form/06-best-practice/index.html b/portality/templates/application_form/06-best-practice/index.html
index 2c1d770df5..9cadc35164 100644
--- a/portality/templates/application_form/06-best-practice/index.html
+++ b/portality/templates/application_form/06-best-practice/index.html
@@ -3,7 +3,7 @@
Page 6 of {{ FORM | length + 1}}
{% endif %}
-
Best practice
+
The best practices in this section adhere to publishing standards based around findability, preserving the content and ethical publishing practices.
We encourage journals to adopt these best practices but they are not mandatory for DOAJ indexing.
diff --git a/portality/templates/application_form/07-review/index.html b/portality/templates/application_form/07-review/index.html
index 3dd15fd8eb..ff73560741 100644
--- a/portality/templates/application_form/07-review/index.html
+++ b/portality/templates/application_form/07-review/index.html
@@ -5,9 +5,9 @@
{% set t = { "val": 0} %}
{% if obj %}
-
{{ obj.data.bibjson.title }}
+
{% else %}
-
Review your answers
+
{% endif %}
diff --git a/portality/templates/application_form/_autochecks.html b/portality/templates/application_form/_autochecks.html
new file mode 100644
index 0000000000..c3ce41c143
--- /dev/null
+++ b/portality/templates/application_form/_autochecks.html
@@ -0,0 +1,2 @@
+{# This div is populated by javascript class doaj.autocheckers.AutochecksManager #}
+
\ No newline at end of file
diff --git a/portality/templates/application_form/_contact.html b/portality/templates/application_form/_contact.html
index b1140a6e87..fd0f7c36b5 100644
--- a/portality/templates/application_form/_contact.html
+++ b/portality/templates/application_form/_contact.html
@@ -1,13 +1,16 @@
{% if obj.owner %}
{% set account = obj.owner_account %}
- {% if account.id == current_user.id %}
-
DOAJ’s team of managing editors, editors, and volunteers work with publishers to index new journals. As soon as they’re accepted, these journals are displayed on our website freely accessible to everyone.
{# this next bit has to be all on one line so that the spacing is correct #}
- {% if bibjson.pissn %}{{bibjson.pissn}} (Print){% endif %}{% if bibjson.eissn %}{% if bibjson.pissn %} / {% endif %}{{bibjson.eissn}} (Online){% endif %}
+ {% if bibjson.pissn %}{{ bibjson.pissn }} (Print){% endif %}{% if bibjson.eissn %}
+ {% if bibjson.pissn %} / {% endif %}{{ bibjson.eissn }} (Online){% endif %}
@@ -60,7 +64,8 @@
{% if p.is_in_doaj() %}
{{ bibjson.title }}
{% else %}
- {{ bibjson.title }}, ISSN: {{ bibjson.get_preferred_issn() }} (not available in DOAJ)
+ {{ bibjson.title }}, ISSN: {{ bibjson.get_preferred_issn() }} (not available in
+ DOAJ)
{% endif %}
{% endif %}
{% if not loop.last %}; {% endif %}
@@ -77,7 +82,8 @@
{% if f.is_in_doaj() %}
{{ bibjson.title }}
{% else %}
- {{ bibjson.title }}, ISSN: {{ bibjson.get_preferred_issn() }} (not available in DOAJ)
+ {{ bibjson.title }}, ISSN: {{ bibjson.get_preferred_issn() }} (not available in
+ DOAJ)
{% endif %}
{% endif %}
{% if not loop.last %}; {% endif %}
@@ -87,21 +93,21 @@