diff --git a/gracedb/superevents/api/view_templates.py b/gracedb/superevents/api/view_templates.py index 7aba61e66ff2c8b54dcb18d33bcbf6b810b0a009..2b3f5537c5c08bf9d66a4192fec984e66f48ad92 100644 --- a/gracedb/superevents/api/view_templates.py +++ b/gracedb/superevents/api/view_templates.py @@ -7,7 +7,7 @@ from .views import SupereventViewSet, SupereventEventViewSet, \ # Placeholder parameters for getting URLs with reverse PH = { - SupereventViewSet.lookup_field: 'S800106', # superevent_id + SupereventViewSet.lookup_field: 'S800106a', # superevent_id SupereventEventViewSet.lookup_field: 'G1234', # graceid SupereventLabelViewSet.lookup_field: 'LABEL_NAME', # label name SupereventLogViewSet.lookup_field: '3333', # log number (N) diff --git a/gracedb/superevents/migrations/0011_superevent_suffix_required.py b/gracedb/superevents/migrations/0011_superevent_suffix_required.py new file mode 100644 index 0000000000000000000000000000000000000000..7a396df5ae4368cf6f54d5ac3fae8d52cf658193 --- /dev/null +++ b/gracedb/superevents/migrations/0011_superevent_suffix_required.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.14 on 2018-07-25 20:24 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('superevents', '0010_superevent_category'), + ] + + operations = [ + migrations.AlterField( + model_name='superevent', + name='base_letter_suffix', + field=models.CharField(default='a', editable=False, max_length=10), + preserve_default=False, + ), + ] diff --git a/gracedb/superevents/models.py b/gracedb/superevents/models.py index 80d2509ef03c0e62c13e6338d87af823150a2252..453229773b1bf9853fa00f983925a0d5d6f86a40 100644 --- a/gracedb/superevents/models.py +++ b/gracedb/superevents/models.py @@ -38,10 +38,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): """ Superevent date-based IDs: - Initially, a superevent has an ID like 'Syymmdd' (S180101) - If there are multiple superevents on the same date, a letter prefix is - added: S180101a, S180101b, etc., based on how many other - superevents exist for the given date. + Initially, a superevent has an ID like 'S180725a' Once a superevent is confirmed as a GW, its prefix is changed to 'GW' and its suffix is recalculated in terms of how many confirmed GWs exist for the given date. Ex: S180101b -> GW180101A @@ -65,8 +62,8 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): # Full date-based ID regex: # (T|M)?S180709abc OR (T|M)?GW180709ABC - ID_REGEX = (r'(({test}|{mdc})?({0})(\d{{6}})([a-z]*)|' - '({test}|{mdc})?({1})(\d{{6}})([A-Z]*))').format(DEFAULT_ID_PREFIX, + ID_REGEX = (r'(({test}|{mdc})?({0})(\d{{6}})([a-z]+)|' + '({test}|{mdc})?({1})(\d{{6}})([A-Z]+))').format(DEFAULT_ID_PREFIX, GW_ID_PREFIX, test=SUPEREVENT_CATEGORY_TEST, mdc=SUPEREVENT_CATEGORY_MDC) @@ -103,7 +100,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): # Fields for handling date-based IDs t_0_date = models.DateField(null=False, editable=False) base_date_number = models.PositiveIntegerField(null=False, editable=False) - base_letter_suffix = models.CharField(max_length=10, null=True, + base_letter_suffix = models.CharField(max_length=10, null=False, editable=False) gw_date_number = models.PositiveIntegerField(null=True, editable=False) gw_letter_suffix = models.CharField(max_length=10, null=True, @@ -169,23 +166,9 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): # Update letter suffix from date number if not pk_set: - if self.base_date_number == 1: - # No letter suffix for only one superevent on a given date - self.base_letter_suffix = "" - else: - self.base_letter_suffix = int_to_letters(self.base_date_number) + self.base_letter_suffix = int_to_letters(self.base_date_number) self.save(update_fields=['base_letter_suffix']) - # If a second superevent is found on a given date, update the first - # one from that date to now use a letter suffix for the ID. - if self.base_date_number == 2: - first_for_date = self.__class__.objects.get( - t_0_date=self.t_0_date, category=self.category, - base_date_number=1) - first_for_date.base_letter_suffix = int_to_letters( - first_for_date.base_date_number) - first_for_date.save(update_fields=['base_letter_suffix']) - # Add preferred event to events list. Have to do this after base save # because the superevent needs a pk to be used as a foreign key in the # event table @@ -258,24 +241,11 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): self.auto_increment_update('gw_date_number', constraint_fields) # Update gw_letter_suffix from gw_date_number - if self.gw_date_number == 1: - # No letter suffix for only one confirmed GW on a given date - self.gw_letter_suffix = "" - else: - self.gw_letter_suffix = int_to_letters(self.gw_date_number).upper() + self.gw_letter_suffix = int_to_letters(self.gw_date_number).upper() # Save the fields which have changed self.save(update_fields=['is_gw', 'gw_letter_suffix']) - # If a second confirmed GW is found for a given date, update the first - # one from that date to now use a letter suffix for the ID. - if self.gw_date_number == 2: - first_for_date = self.__class__.objects.get(is_gw=True, - t_0_date=self.t_0_date, gw_date_number=1) - first_for_date.gw_letter_suffix = int_to_letters( - first_for_date.gw_date_number).upper() - first_for_date.save(update_fields=['gw_letter_suffix']) - def get_absolute_url(self): return self.get_web_url() @@ -335,7 +305,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): d = datetime.datetime.strptime(date_str, cls.DATE_STR_FMT).date() except ValueError as e: # Catch error for bad date string (i.e., month=13 or something) - raise cls.DateIdError(_('Bad superevent date string')) + raise cls.DateIdError(_('Bad superevent date string.')) # FIXME: someone will have to deal with this in 2080 # Safety check for 2 digit years: enforce year range of [1980 - 2079), @@ -353,10 +323,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel): d = d.replace(year=replace_yr) # Determine date_number from letter suffix - if suffix == "": - date_number = 1 - else: - date_number = letters_to_int(suffix.lower()) + date_number = letters_to_int(suffix.lower()) # Compile query kwargs - we don't have to be too careful here # since the regex match above will filter out any issues diff --git a/gracedb/superevents/query.py b/gracedb/superevents/query.py index f5918980db20cd925f1157b64ceab575a59271ef..e2077907541409f98f7eca484cf01e89b9d94258 100644 --- a/gracedb/superevents/query.py +++ b/gracedb/superevents/query.py @@ -33,9 +33,9 @@ superevent_preprefix = Optional(Or([CaselessLiteral(pref) for pref in superevent_prefix = Or([CaselessLiteral(pref) for pref in Superevent.DEFAULT_ID_PREFIX, Superevent.GW_ID_PREFIX]) superevent_date = Word(nums, exact=6) -superevent_suffix = Optional(Word(alphas)) -superevent_expr = Combine(superevent_prefix + superevent_date + - superevent_suffix) +superevent_suffix = Word(alphas) +superevent_expr = Combine(superevent_preprefix + superevent_prefix + + superevent_date + superevent_suffix) # Dict of queryable parameters which are compiled into a pyparsing # expression below diff --git a/gracedb/templates/search/query_help_frag.html b/gracedb/templates/search/query_help_frag.html index 558b1da58e710ee0a11ca0082c95882e25cf8f2a..9e4477a6422cf95d148adf432ac84d9f29f10257 100644 --- a/gracedb/templates/search/query_help_frag.html +++ b/gracedb/templates/search/query_help_frag.html @@ -97,7 +97,7 @@ <h4>By id</h4> The keywords <code>id:</code> or <code>superevent_id:</code> are optional. <ul> - <li>id: S180525</li> + <li>id: S180525a</li> <li>superevent_id: S170817b</li> <li>GW180428C</li> </ul>