diff --git a/hepdata/cli.py b/hepdata/cli.py index d0b9c64f..36b4d54f 100644 --- a/hepdata/cli.py +++ b/hepdata/cli.py @@ -223,9 +223,9 @@ def do_unload(records_to_unload): @utils.command() @with_appcontext -@click.option('--endpoint', '-e', type=str, help='Specific endpoint to update (e.g. "rivet" or "MadAnalysis"). Omit for all.') +@click.option('--endpoint', '-e', type=str, help='Specific endpoint to update (e.g. "rivet" or "MadAnalysis" or "SModelS"). Omit for all.') def find_and_add_record_analyses(endpoint): - """Finds analyses such as Rivet and MadAnalysis 5 and adds them to records.""" + """Finds analyses such as Rivet, MadAnalysis 5 and SModelS and adds them to records.""" update_analyses(endpoint) diff --git a/hepdata/config.py b/hepdata/config.py index 5f411529..713693dd 100644 --- a/hepdata/config.py +++ b/hepdata/config.py @@ -327,6 +327,11 @@ def _(x): 'endpoint_url': 'https://madanalysis.irmp.ucl.ac.be/raw-attachment/wiki/MA5SandBox/analyses.json', 'url_template': 'https://doi.org/{0}' }, + 'SModelS': { + 'endpoint_url': 'https://zenodo.org/records/13952092/files/smodels-analyses.hepdata.json?download=1', + 'url_template': '{0}', + 'subscribe_user_id': 7766 + } #'ufo': {}, #'xfitter': {}, #'applgrid': {}, diff --git a/hepdata/ext/opensearch/document_enhancers.py b/hepdata/ext/opensearch/document_enhancers.py index 1f1a0dd7..6ca9173a 100644 --- a/hepdata/ext/opensearch/document_enhancers.py +++ b/hepdata/ext/opensearch/document_enhancers.py @@ -94,7 +94,7 @@ def add_shortened_authors(doc): def add_analyses(doc): """ - Add analyses links such as Rivet, MadAnalysis 5, HistFactory and NUISANCE to the index. + Add analyses links such as Rivet, MadAnalysis 5, SModelS, HistFactory and NUISANCE to the index. :param doc: :return: diff --git a/hepdata/modules/records/assets/js/hepdata_common.js b/hepdata/modules/records/assets/js/hepdata_common.js index 70b4f2d7..a55d6963 100644 --- a/hepdata/modules/records/assets/js/hepdata_common.js +++ b/hepdata/modules/records/assets/js/hepdata_common.js @@ -45,6 +45,7 @@ HEPDATA.file_type_to_details = { "fastnlo": {"icon": "area-chart", "description": "fastNLO Analysis"}, "rivet": {"icon": "area-chart", "description": "Rivet Analysis"}, "madanalysis": {"icon": "area-chart", "description": "MadAnalysis 5 Analysis"}, + "smodels": {"icon": "area-chart", "description": "SModelS Analysis"}, "xfitter": {"icon": "area-chart", "description": "xFitter Analysis"}, "applgrid": {"icon": "area-chart", "description": "APPLgrid Analysis"}, "ufo": {"icon": "rocket", "description": "Universal Feynrules Output (UFO)"}, diff --git a/hepdata/modules/records/subscribers/api.py b/hepdata/modules/records/subscribers/api.py index 7aad6f03..feeebe8b 100644 --- a/hepdata/modules/records/subscribers/api.py +++ b/hepdata/modules/records/subscribers/api.py @@ -31,12 +31,14 @@ from .models import Subscribers -def is_current_user_subscribed_to_record(recid): - if not current_user.is_authenticated: - return False +def is_current_user_subscribed_to_record(recid, user=None): + if not user: + user = current_user + if not current_user.is_authenticated: + return False return Subscribers.query.filter(Subscribers.publication_recid == recid, - Subscribers.subscribers.contains(current_user)).count() > 0 + Subscribers.subscribers.contains(user)).count() > 0 def get_users_subscribed_to_record(recid): diff --git a/hepdata/modules/records/subscribers/rest.py b/hepdata/modules/records/subscribers/rest.py index 1312f657..78c0f2d2 100644 --- a/hepdata/modules/records/subscribers/rest.py +++ b/hepdata/modules/records/subscribers/rest.py @@ -34,13 +34,17 @@ def list_subscriptions_for_user(): @blueprint.route('/subscribe/', methods=['POST']) -@login_required -def subscribe(recid): +def subscribe(recid, user=None): + if not user: + user = current_user + if not current_user.is_authenticated: + return jsonify({"success": False, "status_code": 500}) + record_subscribers = get_or_create(db.session, Subscribers, publication_recid=recid) try: - if not current_user in record_subscribers.subscribers: - record_subscribers.subscribers.append(current_user) + if not user in record_subscribers.subscribers: + record_subscribers.subscribers.append(user) db.session.add(record_subscribers) db.session.commit() diff --git a/hepdata/modules/records/templates/hepdata_records/components/resources-widget.html b/hepdata/modules/records/templates/hepdata_records/components/resources-widget.html index 396017f4..17c295b5 100644 --- a/hepdata/modules/records/templates/hepdata_records/components/resources-widget.html +++ b/hepdata/modules/records/templates/hepdata_records/components/resources-widget.html @@ -40,6 +40,7 @@

Add Resource for Submission

+ diff --git a/hepdata/modules/records/utils/analyses.py b/hepdata/modules/records/utils/analyses.py index 983a407f..35b4b730 100644 --- a/hepdata/modules/records/utils/analyses.py +++ b/hepdata/modules/records/utils/analyses.py @@ -32,6 +32,9 @@ from hepdata.ext.opensearch.api import index_record_ids from hepdata.modules.submission.api import get_latest_hepsubmission, is_resource_added_to_submission from hepdata.modules.submission.models import DataResource, HEPSubmission, data_reference_link +from hepdata.utils.users import get_user_from_id +from hepdata.modules.records.subscribers.rest import subscribe +from hepdata.modules.records.subscribers.api import is_current_user_subscribed_to_record logging.basicConfig() log = logging.getLogger(__name__) @@ -40,9 +43,10 @@ @shared_task def update_analyses(endpoint=None): """ - Update (Rivet and MadAnalysis 5) analyses and remove outdated resources. + Update (Rivet, MadAnalysis 5 and SModelS) analyses and remove outdated resources. + Allow bulk subscription to record update notifications if "subscribe_user_id" in endpoint. - :param endpoint: either "Rivet" or "MadAnalysis" or None (default) for both + :param endpoint: either "rivet" or "MadAnalysis" or "SModelS" or None (default) for both """ endpoints = current_app.config["ANALYSES_ENDPOINTS"] for analysis_endpoint in endpoints: @@ -137,5 +141,14 @@ def update_analyses(endpoint=None): db.session.rollback() log.error(e) + # Allow bulk subscription to record update notifications. + if "subscribe_user_id" in endpoints[analysis_endpoint]: + user = get_user_from_id(endpoints[analysis_endpoint]["subscribe_user_id"]) + if user: + for record in analyses: + submission = get_latest_hepsubmission(inspire_id=record, overall_status='finished') + if submission and not is_current_user_subscribed_to_record(submission.publication_recid, user): + subscribe(submission.publication_recid, user) + else: log.debug("No endpoint url configured for {0}".format(analysis_endpoint)) diff --git a/hepdata/modules/search/templates/hepdata_search/modals/search_help.html b/hepdata/modules/search/templates/hepdata_search/modals/search_help.html index 4352e11b..357661b1 100644 --- a/hepdata/modules/search/templates/hepdata_search/modals/search_help.html +++ b/hepdata/modules/search/templates/hepdata_search/modals/search_help.html @@ -236,6 +236,13 @@

Other useful searches

(MadAnalysis 5 analysis) +
  • + analysis:SModelS + + (SModelS analysis) + +
  • analysis:HistFactory diff --git a/hepdata/version.py b/hepdata/version.py index ab77b827..fb6b9e2b 100644 --- a/hepdata/version.py +++ b/hepdata/version.py @@ -28,4 +28,4 @@ and parsed by ``setup.py``. """ -__version__ = "0.9.4dev20241003" +__version__ = "0.9.4dev20241031" diff --git a/tests/records_test.py b/tests/records_test.py index 22c10fea..988f7692 100644 --- a/tests/records_test.py +++ b/tests/records_test.py @@ -68,6 +68,7 @@ get_inspire_records_updated_on, update_record_info, RECORDS_PER_PAGE from hepdata.modules.inspire_api.views import get_inspire_record_information from hepdata.config import CFG_TMPDIR +from hepdata.modules.records.subscribers.api import is_current_user_subscribed_to_record def test_record_creation(app): @@ -1030,7 +1031,7 @@ def test_create_breadcrumb_text(): def test_update_analyses(app): - """ Test update of Rivet analyses """ + """ Test update of Rivet, MadAnalyses 5 and SModelS analyses """ # Import a record that already has a Rivet analysis attached (but with '#' in the URL) import_records(['ins1203852'], synchronous=True) @@ -1059,6 +1060,20 @@ def test_update_analyses(app): assert len(analysis_resources) == 1 assert analysis_resources[0].file_location == 'https://doi.org/10.14428/DVN/I2CZWU' + # Import a record that has an associated SModelS analysis + import_records(['ins1847779'], synchronous=True) + analysis_resources = DataResource.query.filter_by(file_type='SModelS').all() + assert len(analysis_resources) == 0 + user = User(email='test@test.com', password='hello1', active=True, id=7766) + db.session.add(user) + db.session.commit() + update_analyses('SModelS') + analysis_resources = DataResource.query.filter_by(file_type='SModelS').all() + assert len(analysis_resources) == 1 + assert analysis_resources[0].file_location == 'https://smodels.github.io/docs/ListOfAnalyses#ATLAS-EXOT-2018-06' + submission = get_latest_hepsubmission(inspire_id='1847779', overall_status='finished') + assert is_current_user_subscribed_to_record(submission.publication_recid, user) + def test_generate_license_data_by_id(app): """