diff --git a/cms/assets/img/volunteers/Lina Blandon.jpg b/cms/assets/img/volunteers/Lina Blandon.jpg
new file mode 100644
index 0000000000..aa0020547e
Binary files /dev/null and b/cms/assets/img/volunteers/Lina Blandon.jpg differ
diff --git a/cms/assets/img/volunteers/Mario Uribe.webp b/cms/assets/img/volunteers/Mario Uribe.webp
new file mode 100644
index 0000000000..dd939af3d9
Binary files /dev/null and b/cms/assets/img/volunteers/Mario Uribe.webp differ
diff --git a/cms/data/volunteers.yml b/cms/data/volunteers.yml
index d526786e14..6707bb533a 100644
--- a/cms/data/volunteers.yml
+++ b/cms/data/volunteers.yml
@@ -106,8 +106,8 @@ ass_ed:
- name: Alain Chaple
area: Medical Sciences
year_since:
- city: La Habana
- country: Cuba
+ city: Santiago
+ country: Chile
language: Spanish, English
photo: "alainchaple.png"
@@ -118,13 +118,6 @@ ass_ed:
country: Poland
language: Polish, English
photo: "AleksandraZawadzka.jpg"
-
-- name: Alessandro Pierno
- area: Humanities
- year_since:
- city: Florence
- country: Italy
- language: Italian, English, Spanish
- name: Ana Melisa Fernandes
area: Bird behavior and ecology
@@ -327,13 +320,6 @@ ass_ed:
city: Malang
country: Indonesia
language: Indonesian, English
-
-- name: Eko Supraptono
- area: Technology
- year_since:
- city: Semarang
- country: Indonesia
- language: Indonesian, English
- name: Emrah Kaya
area: Social Sciences, Humanities
@@ -527,7 +513,8 @@ ass_ed:
city:
country: Colombia
language: Spanish, English
-
+ photo: "Lina Blandon.jpg"
+
- name: Liping Yang
area: Material Engineering, Library Studies
year_since:
@@ -556,6 +543,14 @@ ass_ed:
city: V.N Gaia
country: Portugal
language: Portuguese, Spanish, English
+
+- name: Mariano Hernán Corujo
+ area: Library Science
+ year_since:
+ city: Buenos Aires
+ country: Argentina
+ language: Spanish, English
+ photo: "MarianoCorujo.jpeg"
- name: Marie-Eve Dugas
area: Library Science, Social Sciences
@@ -563,7 +558,15 @@ ass_ed:
city: Montréal
country: Canada
language: French, English
-
+
+- name: Mario Alejandro Marín Uribe
+ area: Ecology
+ year_since:
+ city: Medellín
+ country: Colombia
+ language: Portuguese, English
+ photo: "Mario Uribe.webp"
+
- name: Martyna Mirecka
area: History, Political Science
year_since:
@@ -572,6 +575,13 @@ ass_ed:
language: Polish, English
photo: "Martyna.JPG"
+- name: Mateus de Novaes Maia
+ area: Literature and Geography
+ year_since:
+ city:
+ country: Brazil
+ language: Portuguese, English
+
- name: Maxim Mitrofanov
area: International Relations, Political Science
year_since:
diff --git a/cms/pages/about/index.md b/cms/pages/about/index.md
index 49dbeabd84..5922e51cd6 100644
--- a/cms/pages/about/index.md
+++ b/cms/pages/about/index.md
@@ -8,7 +8,7 @@ featuremap: ~~About:Fragment~~
---
-DOAJ is a unique and extensive index of diverse open access journals from around the world, driven by a growing community, committed to ensuring quality content is freely available online for everyone.
+DOAJ is a unique and extensive index of diverse open access journals from around the world, driven by a growing community, committed to ensuring quality content is openly available online for everyone.
OPEN - DOAJ is a vital part of the global open access infrastructure.
@@ -20,7 +20,7 @@ TRUSTED – Globally, DOAJ's [criteria](/apply/guide/#basic-criteria-for-inclusi
DOAJ's mission is to increase the visibility, accessibility, reputation, usage and impact of quality, peer-reviewed, open access scholarly research journals globally, regardless of discipline, geography or language.
-DOAJ is committed to being 100% independent and maintaining all of its primary services and metadata as free for everyone.
+DOAJ is committed to being 100% independent and maintaining all of its primary services and metadata as open for everyone.
## Our vision
diff --git a/cms/pages/about/volunteers.md b/cms/pages/about/volunteers.md
index e2a040518e..42aad8c4d2 100644
--- a/cms/pages/about/volunteers.md
+++ b/cms/pages/about/volunteers.md
@@ -9,10 +9,10 @@ featuremap: ~~Volunteers:Fragment->VolunteersData:Template~~
---
-DOAJ volunteers come from all over the world, from a variety of backgrounds, and speak many languages.
+DOAJ volunteers come from various backgrounds all over the world and speak many languages.
-DOAJ would not be able to do the work that we do without our volunteers. In 2023, our volunteers provided 2500 hours of editorial effort! We are grateful for the work they do, helping us review applications.
+Without our volunteers, we wouldn't be able to do as much of our work reviewing applications. In 2023, our volunteers provided 2500 hours of editorial effort and we are so grateful for their help!
-In recognition of their support for DOAJ and the open access community, we have published the names of our volunteers below.
+As a way of thanking them for their support to us and to the open access community, we have published the names of our volunteers below.
-Occasionally, we need more volunteers, often when we need help with specific languages. Follow [our blog](https://blog.doaj.org/) or our [Twitter feed](http://twitter.com/doajplus) to be alerted when the next call for volunteers is published.
+Occasionally, we need more volunteers, especially for help with specific languages. Follow [our blog](https://blog.doaj.org/), our [LinkedIn page](https://www.linkedin.com/company/doaj/) or our [Bluesky account](https://bsky.app/profile/doaj.bsky.social) to be alerted when the next call for volunteers is published.
diff --git a/cms/pages/apply/guide.md b/cms/pages/apply/guide.md
index dafe5a95a8..75049535dc 100644
--- a/cms/pages/apply/guide.md
+++ b/cms/pages/apply/guide.md
@@ -7,7 +7,9 @@ sticky_sidenav: true
featuremap: ~~GuideToApplying:Fragment~~
---
-Before you start the application process, you will be asked to log in or register. You can save your progress and review all your answers before you submit them. To help you, a [PDF list of the questions](/static/doaj/docs/DOAJquestions-for-reference-only.pdf) is available for download.
+Before you start the application process, you will be asked to log in or register. The registration process requires an email address. You must use an official email for the journal or an email address that is checked regularly by the journal’s management office.
+
+Once registered you may begin the application process. You can save your progress and review all your answers before you submit them. To help you, a [PDF list of the questions](/static/doaj/docs/DOAJquestions-for-reference-only.pdf) is available for download.
## Basic criteria for inclusion
@@ -66,9 +68,10 @@ The following information must be available online and easily accessible from th
- colour charges
- Any fee waiver must be clearly specified with the conditions of waiver, e.g. amount, time period.
- If there are charges for withdrawing the article after submission, they cannot exceed the author charges.
-- Contact details
+- Publisher information
+ - The journal must provide the name and address of the publisher, with a link to the publisher website, if available.
- Include the name of a contact person and the journal's dedicated email address.
- - The country in the application and on the journal website must be where the publisher is registered and carries out its business activities.
+ - The country given in the application and on the journal website must be where the publisher is registered and carries out its business activities.
---
@@ -193,17 +196,31 @@ DOAJ only accepts journals that follow good publishing practice. If our review f
Journals or publishers that have had multiple exclusions totalling six years or more will not be considered for inclusion in DOAJ and applications from them will be automatically rejected.
-Journals already accepted into DOAJ may be removed if they are found to be no longer adhering to DOAJ criteria or publishing best practice.
-
Please ensure that, if you do apply again after the exclusion period, the journal meets the DOAJ criteria for inclusion and that any necessary changes have been made to the journal website or policies.
---
+## If your application is accepted
+
+After your journal is accepted, you are responsible for updating the DOAJ record and ensuring the journal continues to comply with DOAJ criteria. See the [Publisher Information Page](/apply/publisher-responsibilities/) for details of how to submit an update request.
+
+We undertake periodic re-evaluation of journals accepted into DOAJ, particularly when:
+
+- They have not been updated by the publisher for several years
+- Reports are received of website unavailability or questionable practices
+
+Journals will be removed if they no longer adhere to DOAJ criteria or publishing best practice.
+
+---
+
## Appeals
-You may submit an appeal if your journal has been removed from DOAJ or your application has been rejected and no new application is allowed for at least a year. Email the [DOAJ Appeals Committee](mailto:appeals@doaj.org).
+Your journal is eligible to submit an appeal if
-The appeal should contain the following information:
+- It has been removed from DOAJ.
+- The application has been rejected, and no new application is allowed for at least one year.
+
+Email the [DOAJ Appeals Committee](mailto:appeals@doaj.org). The appeal should contain the following information:
- Journal title
- Journal ISSN
@@ -245,12 +262,7 @@ Our criteria are available in:
## Version history
-This is Version 2.2 of our Guide to applying.
+This is Version 2.3 of the DOAJ Guide to applying.
+
+For previous versions see the [Change Log](https://docs.google.com/document/d/1DW4rwQZ-16Y7M9jYOv7jVgOEUHhU0cZRhSM8lLDtwzU/edit?tab=t.0)
-*Version 2.2 (January 2024 - removed 'DOAJ will not accept a journal if all content in the last year/volume is published as special issues' from the Special Issues section of the Basic criteria.)*
-Version 2.1 (November 2023 - changed Editor-in-Chief to Head of Editorial in the Appeals section; removed the 'Updating your journal record' section as this information is now on the Publisher information page.)
-Version 2.0 (November 2023 - addition of new criteria around special issues, smaller changes for clarity and plain English.)
-Version: 1.3 (April 2023 - further clarification to endogeny, displaying journal rankings, information about author charges and reviewers, flipped journals and journals/publishers with multiple exclusions )
-Version: 1.2 (February 2022 - extra copyright and licensing information were moved to a separate page)
-Version: 1.1 (December 2021 - a clarification to endogeny criterion)
-Version 1.0 (November 1.0)
diff --git a/cms/pages/apply/publisher-responsibilities.md b/cms/pages/apply/publisher-responsibilities.md
index 007616c8d7..1eb3e84b03 100644
--- a/cms/pages/apply/publisher-responsibilities.md
+++ b/cms/pages/apply/publisher-responsibilities.md
@@ -23,6 +23,7 @@ featuremap: ~~PublisherResponsibilities:Fragment~~
- You will [keep your contact details up to date](/apply/publisher-responsibilities/#settings).
- You will inform us of changes to your journals and [keep your journal records up to date](/apply/publisher-responsibilities/#keeping-your-journal-records-up-to-date).
- You will [upload article metadata](/publisher/uploadfile) to us if you are able to.
+- You will regularly review your indexed journals and ensure their compliance with current DOAJ criteria.
We have [a zero-tolerance policy](/about/#zero-tolerance-policy). We will treat you with respect and courtesy. We expect you to do the same.
diff --git a/cms/pages/support/index.md b/cms/pages/support/index.md
index 8132c05557..4a8f180a98 100644
--- a/cms/pages/support/index.md
+++ b/cms/pages/support/index.md
@@ -22,7 +22,7 @@ For 2024, we have revised and simplified our supporter model to align with the l
| Small organisations | 2,000 | 2,200 | 1,720 |
| Organisations from [low- and middle-income countries](https://datatopics.worldbank.org/world-development-indicators/the-world-by-income-and-region.html) | 500 | 550 | 430 |
-In 2024, a 30% discount will be applied to institutions supporting us via a billing consortium. The discount will be reduced to 25% for 2025 and 2026. Please [contact us](/contact/) for further information.
+In 2025 and 2026, a 25% discount will be applied to institutions supporting us via a billing consortium. Please [contact us](/contact/) for further information.
We always have a wishlist of development projects for which we require additional funding. Please contact us if you would like to support us over and above our standard rates.
diff --git a/cms/pages/support/publisher-supporters.md b/cms/pages/support/publisher-supporters.md
index 3a4e667d73..70411f4d40 100644
--- a/cms/pages/support/publisher-supporters.md
+++ b/cms/pages/support/publisher-supporters.md
@@ -49,7 +49,7 @@ We only accept support through our publisher supporter model from publishers wit
1. Your logo on the DOAJ website
2. A blog post during the year thanking all our supporters
3. A DOAJ Supporter logo that you can use on your website
-4. Access to our Public Data Dump
+4. An option to download [a copy of all our data](/docs/public-data-dump/)
5. A personal DOAJ contact to whom all enquiries regarding your applications and updates can be directed
## Sponsorship opportunities
diff --git a/doajtest/unit/test_models.py b/doajtest/unit/test_models.py
index 80c298e9dd..b455bf31ab 100644
--- a/doajtest/unit/test_models.py
+++ b/doajtest/unit/test_models.py
@@ -1774,8 +1774,15 @@ def test_42_make_article_tombstone(self):
stone = models.ArticleTombstone.pull(a.id)
assert stone is not None
+ def test_43_add_remove_apc_bibjson(self):
+ bj = models.JournalLikeBibJSON()
+ bj.add_apc("GBP", 100)
+ assert bj.has_apc is True
+ assert bj.apc == [{"currency": "GBP", "price": 100}]
-
+ bj.has_apc = False
+ assert bj.has_apc is False
+ assert bj.apc == []
class TestAccount(DoajTestCase):
def test_get_name_safe(self):
diff --git a/portality/migrate/20241031_4005_apc_model_consistency/README.md b/portality/migrate/20241031_4005_apc_model_consistency/README.md
new file mode 100644
index 0000000000..991ace156e
--- /dev/null
+++ b/portality/migrate/20241031_4005_apc_model_consistency/README.md
@@ -0,0 +1,5 @@
+# Straightening out the APC model
+
+For each journal and application, if has_apc is false, ensure any old apc data is removed
+
+ python portality/upgrade.py -u portality/migrate/20241031_4005_apc_model_consistency/migrate.json
\ No newline at end of file
diff --git a/portality/migrate/20241031_4005_apc_model_consistency/__init__.py b/portality/migrate/20241031_4005_apc_model_consistency/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/portality/migrate/20241031_4005_apc_model_consistency/migrate.json b/portality/migrate/20241031_4005_apc_model_consistency/migrate.json
new file mode 100644
index 0000000000..7fccc0cdd0
--- /dev/null
+++ b/portality/migrate/20241031_4005_apc_model_consistency/migrate.json
@@ -0,0 +1,20 @@
+{
+ "types": [
+ {
+ "type" : "journal",
+ "init_with_model" : true,
+ "keepalive" : "20m",
+ "functions" : [
+ "portality.migrate.20241031_4005_apc_model_consistency.operations.reset_apc"
+ ]
+ },
+ {
+ "type" : "application",
+ "init_with_model" : true,
+ "keepalive" : "20m",
+ "functions" : [
+ "portality.migrate.20241031_4005_apc_model_consistency.operations.reset_apc"
+ ]
+ }
+ ]
+}
diff --git a/portality/migrate/20241031_4005_apc_model_consistency/operations.py b/portality/migrate/20241031_4005_apc_model_consistency/operations.py
new file mode 100644
index 0000000000..e652534d13
--- /dev/null
+++ b/portality/migrate/20241031_4005_apc_model_consistency/operations.py
@@ -0,0 +1,7 @@
+def reset_apc(journal_like):
+ bj = journal_like.bibjson()
+ # the `has_apc` setter has been updated to correct the state of the journal/application, so just re-running
+ # the setter with straighted out the state
+ if bj.has_apc is False:
+ bj.has_apc = False
+ return journal_like
diff --git a/portality/models/search.py b/portality/models/search.py
index 21bf9f82d8..3f8c429428 100644
--- a/portality/models/search.py
+++ b/portality/models/search.py
@@ -23,7 +23,7 @@ def site_statistics(cls):
"countries" : "0",
"abstracts" : "0",
"new_journals" : "0",
- "no_apc" : "0"
+ "no_apc" : "0" # this is now used to represent "no charges", which means no apc and no other charges
}
# get the journal data
@@ -33,16 +33,21 @@ def site_statistics(cls):
stats["journals"] = "{0:,}".format(journal_data.get("hits", {}).get("total", {}).get('value', 0))
stats["countries"] = "{0:,}".format(len(journal_data.get("aggregations", {}).get("countries", {}).get("buckets", [])))
- apc_buckets = journal_data.get("aggregations", {}).get("apcs", {}).get("buckets", [])
- for b in apc_buckets:
- if b.get("key") == "No":
- stats["no_apc"] = "{0:,}".format(b.get("doc_count"))
- break
+ # apc_buckets = journal_data.get("aggregations", {}).get("apcs", {}).get("buckets", [])
+ # for b in apc_buckets:
+ # if b.get("key") == "No":
+ # stats["no_apc"] = "{0:,}".format(b.get("doc_count"))
+ # break
nj_stat = journal_data.get("aggregations", {}).get("creation", {}).get("buckets", [])
if len(nj_stat) > 0:
stats["new_journals"] = "{0:,}".format(nj_stat[0].get("doc_count", 0))
+ # count the journals with no fees
+ qc = JournalChargesQuery()
+ no_fees = Journal.query(q=qc.query())
+ stats["no_apc"] = "{0:,}".format(no_fees.get("hits", {}).get("total", {}).get('value', 0))
+
# get the article data
qa = ArticleStatsQuery()
article_data = Article.query(q=qa.q)
@@ -54,6 +59,22 @@ def site_statistics(cls):
return stats
+class JournalChargesQuery(object):
+ def query(self):
+ return {
+ "track_total_hits": True,
+ "query": {
+ "bool": {
+ "must": [
+ {"term": {"admin.in_doaj": True}},
+ {"term": {"bibjson.apc.has_apc": False}},
+ {"term": {"bibjson.other_charges.has_other_charges": False}}
+ ]
+ }
+ },
+ "size": 0
+ }
+
class JournalStatsQuery(object):
stats = {
"track_total_hits" : True,
@@ -69,9 +90,6 @@ class JournalStatsQuery(object):
"countries" : {
"terms" : {"field" : "index.country.exact", "size" : 500}
},
- "apcs" : {
- "terms" : {"field" : "index.has_apc.exact"}
- },
"creation" : {
"date_range" : {
"field" : "created_date",
diff --git a/portality/models/v2/bibjson.py b/portality/models/v2/bibjson.py
index 99e4292982..6fd013caeb 100644
--- a/portality/models/v2/bibjson.py
+++ b/portality/models/v2/bibjson.py
@@ -212,6 +212,9 @@ def add_apc(self, currency, price):
self.__seamless__.add_to_list_with_struct("apc.max", {"currency": currency, "price" : price})
self.__seamless__.set_with_struct("apc.has_apc", True)
+ def clear_apcs(self):
+ self.__seamless__.delete("apc.max")
+
@property
def apc_url(self):
return self.__seamless__.get_single("apc.url")
@@ -227,6 +230,8 @@ def has_apc(self):
@has_apc.setter
def has_apc(self, val):
self.__seamless__.set_with_struct("apc.has_apc", val)
+ if val is False:
+ self.clear_apcs()
@property
def article_license_display(self):
diff --git a/portality/settings.py b/portality/settings.py
index 959394fd88..69619ff1ed 100644
--- a/portality/settings.py
+++ b/portality/settings.py
@@ -9,7 +9,7 @@
# Application Version information
# ~~->API:Feature~~
-DOAJ_VERSION = "7.0.3"
+DOAJ_VERSION = "7.0.4"
API_VERSION = "4.0.0"
######################################
diff --git a/portality/static/js/doaj.fieldrender.edges.js b/portality/static/js/doaj.fieldrender.edges.js
index 7eaa93ebff..3205ce9843 100644
--- a/portality/static/js/doaj.fieldrender.edges.js
+++ b/portality/static/js/doaj.fieldrender.edges.js
@@ -158,7 +158,7 @@ $.extend(true, doaj, {
id: "author_pays",
category: "facet",
field: "index.has_apc.exact",
- display: "Publication charges?",
+ display: "Has APC?",
deactivateThreshold: 1,
renderer: edges.bs3.newRefiningANDTermSelectorRenderer({
controls: true,
@@ -169,6 +169,50 @@ $.extend(true, doaj, {
})
})
},
+ adminHasAPC: function() {
+ return doaj.facets.booleanFacet({
+ id: "admin_has_apc",
+ field: "bibjson.apc.has_apc",
+ display: "Has APC?",
+ })
+ },
+ adminHasOtherCharges: function() {
+ return doaj.facets.booleanFacet({
+ id: "admin_has_other_charges",
+ field: "bibjson.other_charges.has_other_charges",
+ display: "Has Other Charges?",
+ })
+ },
+ booleanFacet : function(params) {
+ return edges.newRefiningANDTermSelector({
+ id: params.id,
+ category: "facet",
+ field: params.field,
+ display: params.display,
+ deactivateThreshold: 1,
+ valueMap: {
+ 0: "No",
+ 1: "Yes"
+ },
+ parseSelectedValueString: function(value) {
+ return value === "1"
+ },
+ filterToAggValue: function(value) {
+ if (value) {
+ return 1
+ } else {
+ return 0
+ }
+ },
+ renderer: edges.bs3.newRefiningANDTermSelectorRenderer({
+ controls: true,
+ open: false,
+ togglable: true,
+ countFormat: doaj.valueMaps.countFormat,
+ hideInactive: true
+ })
+ })
+ },
classification : function() {
return edges.newRefiningANDTermSelector({
id: "classification",
@@ -2603,28 +2647,30 @@ $.extend(true, doaj, {
// at search time
var articles = "";
- var apcs = '
- 80 + 89 languages
@@ -52,7 +52,7 @@
diff --git a/portality/ui/templates.py b/portality/ui/templates.py index 39d9f63b83..feaa99d6f3 100644 --- a/portality/ui/templates.py +++ b/portality/ui/templates.py @@ -11,6 +11,7 @@ PUBLIC_EDIT_USER = "public/account/edit.html" # Public pages +PUBLIC_INDEX = "public/index.html" PUBLIC_ARTICLE = "public/article.html" PUBLIC_ARTICLE_SEARCH = "public/articles_search.html" PUBLIC_JOURNAL_SEARCH = "public/journals_search.html" diff --git a/portality/view/doaj.py b/portality/view/doaj.py index 87f92ec4da..9776b4ca7e 100644 --- a/portality/view/doaj.py +++ b/portality/view/doaj.py @@ -28,8 +28,7 @@ def home(): news = models.News.latest(app.config.get("FRONT_PAGE_NEWS_ITEMS", 5)) recent_journals = models.Journal.recent(max=16) - # return render_template('doaj/index.html', news=news, recent_journals=recent_journals) - return render_template('public/index.html', news=news, recent_journals=recent_journals) + return render_template(templates.PUBLIC_INDEX, news=news, recent_journals=recent_journals) @blueprint.route('/login/')