Skip to content
Snippets Groups Projects
Commit 18213f71 authored by Tanner Prestegard's avatar Tanner Prestegard Committed by GraceDB
Browse files

Superevents now always have a letter suffix

Superevent now always have a letter suffix - remove the logic
which gives the first superevent on a date no letter suffix and
allows it to be looked up without the letter suffix even after
it receives one.
parent f1264528
No related branches found
No related tags found
1 merge request!8Superevents
......@@ -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)
......
# -*- 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,
),
]
......@@ -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
......
......@@ -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
......
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment