diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5a20caf47b9698349a20ce69cffbc7bb4342e111..c92010a470656ac845822406ec1787ea2274c850 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,9 +17,9 @@ before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY .test: &test - image: ligo/base:stretch + image: igwn/base:stretch services: - - mysql:5.5 + - mysql:5.6 variables: AWS_SES_ACCESS_KEY_ID: "fake_aws_id" AWS_SES_SECRET_ACCESS_KEY: "fake_aws_key" diff --git a/config/gunicorn_config.py b/config/gunicorn_config.py index 507ab2262366309cd10bedcf0463fd80dd04ffad..af605e29aaa808c49888a0bb54b9d47a26c623e5 100644 --- a/config/gunicorn_config.py +++ b/config/gunicorn_config.py @@ -19,15 +19,15 @@ workers = multiprocessing.cpu_count()*2 + 1 # Worker class. # -worker_class = 'gthread' -threads = 2 +worker_class = 'sync' +#threads = 2 # Adding options for timeout. Not specified, the timeout default # is 30 seconds. Source: # # https://gunicorn-docs.readthedocs.io/en/stable/settings.html#worker-processes # -timeout = 120 +timeout = 300 # Max requests settings - a worker restarts after handling this many # requests. May be useful if we have memory leak problems. diff --git a/config/settings/base.py b/config/settings/base.py index 33149a3386bddd516e9c1e6f2c0f2b8979769ab1..72ee6f067e395fe1d43d06ec7137a84459ea6598 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -319,6 +319,7 @@ MIDDLEWARE = [ 'django.middleware.common.CommonMiddleware', 'core.middleware.proxy.XForwardedForMiddleware', 'user_sessions.middleware.SessionMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'ligoauth.middleware.ShibbolethWebAuthMiddleware', diff --git a/config/settings/container/base.py b/config/settings/container/base.py index 97c75a62c263e164781d67e6f9498a3608370647..8c5fdd699fd737cebb5f7cabccd07b2cef152302 100644 --- a/config/settings/container/base.py +++ b/config/settings/container/base.py @@ -119,6 +119,7 @@ MIDDLEWARE = [ + # Priority server settings ---------------------------------------------------- PRIORITY_SERVER = False is_priority_server = get_from_env('DJANGO_PRIORITY_SERVER', None, @@ -172,10 +173,14 @@ try: # and then it should skip the rest: try: - AWS_ELASTICACHE_TIMEOUT = get_from_env('DJANGO_AWS_ELASTICACHE_TIMEOUT') + # This has to be an int, but it gets it from then env as a string. + AWS_ELASTICACHE_TIMEOUT = int(get_from_env('DJANGO_AWS_ELASTICACHE_TIMEOUT')) except: AWS_ELASTICACHE_TIMEOUT = 30 + # Set the middleware timeout equal to the cache timeout: + CACHE_MIDDLEWARE_SECONDS = AWS_ELASTICACHE_TIMEOUT + # Load modified caching middleware: MIDDLEWARE = [ 'core.middleware.maintenance.MaintenanceModeMiddleware', @@ -187,6 +192,7 @@ try: 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', 'core.middleware.proxy.XForwardedForMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', 'user_sessions.middleware.SessionMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', diff --git a/config/settings/container/dev.py b/config/settings/container/dev.py index b3ce05c527af22d7433b5277eaeceb3231d81e95..bbc4109c591a35374bf714f424b8a608c583752c 100644 --- a/config/settings/container/dev.py +++ b/config/settings/container/dev.py @@ -91,3 +91,4 @@ Events and associated data may change or be removed at any time. if AWS_ELASTICACHE_ADDR: CACHES['default']['KEY_PREFIX'] = '1' + CACHE_MIDDLEWARE_KEY_PREFIX = '1' diff --git a/config/settings/container/playground.py b/config/settings/container/playground.py index 6ff537127263032d87ca78251a7a803cd9820266..ce764332cadad77120af6100c5433f4f455f6d89 100644 --- a/config/settings/container/playground.py +++ b/config/settings/container/playground.py @@ -46,3 +46,4 @@ if (DEBUG == True): # Set elasticache prefix if the correct variables are set. if AWS_ELASTICACHE_ADDR: CACHES['default']['KEY_PREFIX'] = '3' + CACHE_MIDDLEWARE_KEY_PREFIX = '3' diff --git a/config/settings/container/production.py b/config/settings/container/production.py index 60ad8fa62b67e86094e7055ae16bde7a28d57473..8a8fe25c62df46f7b17d8dbdc2d6ea037be9b750 100644 --- a/config/settings/container/production.py +++ b/config/settings/container/production.py @@ -65,3 +65,4 @@ if (DEBUG == True): # Set elasticache prefix if the correct variables are set. if AWS_ELASTICACHE_ADDR: CACHES['default']['KEY_PREFIX'] = '4' + CACHE_MIDDLEWARE_KEY_PREFIX = '4' diff --git a/config/settings/container/test.py b/config/settings/container/test.py index a03510bf7b4ae06cb1a480b557bdaf4cd9be675a..291086cbbba53cc20364f11a3857215a42c8bfb5 100644 --- a/config/settings/container/test.py +++ b/config/settings/container/test.py @@ -91,3 +91,4 @@ to Playground or Production. Note, on this GraceDB instance: if AWS_ELASTICACHE_ADDR: CACHES['default']['KEY_PREFIX'] = '2' + CACHE_MIDDLEWARE_KEY_PREFIX = '2' diff --git a/gracedb/alerts/models.py b/gracedb/alerts/models.py index ab4bc8858f8ad80c939ae97611899aa618bdd98d..e7c24a66f805206d5a3ef7072de2f53487f99f60 100644 --- a/gracedb/alerts/models.py +++ b/gracedb/alerts/models.py @@ -42,7 +42,7 @@ class Contact(CleanSaveModel): CODE_DIGITS = 6 # Fields - user = models.ForeignKey(UserModel, null=False) + user = models.ForeignKey(UserModel, null=False, on_delete=models.CASCADE) description = models.CharField(max_length=30, blank=False, null=False) email = models.EmailField(blank=True, null=True) phone = PhoneNumberField(blank=True, max_length=255, null=True) @@ -177,7 +177,7 @@ class Notification(models.Model): (NOTIFICATION_CATEGORY_EVENT, 'Event'), (NOTIFICATION_CATEGORY_SUPEREVENT, 'Superevent'), ) - user = models.ForeignKey(UserModel, null=False) + user = models.ForeignKey(UserModel, null=False, on_delete=models.CASCADE) contacts = models.ManyToManyField(Contact) description = models.CharField(max_length=40, blank=False, null=False) far_threshold = models.FloatField(blank=True, null=True) diff --git a/gracedb/api/v1/superevents/views.py b/gracedb/api/v1/superevents/views.py index 86e36582a5eeae5fdb0e243456316a0eba1129ff..6b544174f1d255afe183ef7ac58f34c63dcd7dc3 100644 --- a/gracedb/api/v1/superevents/views.py +++ b/gracedb/api/v1/superevents/views.py @@ -51,6 +51,9 @@ from ..paginators import BasePaginationFactory, CustomLabelPagination, \ CustomLogTagPagination from ...utils import api_reverse +# Import rety decorator +from retry import retry + # Set up logger logger = logging.getLogger(__name__) @@ -253,6 +256,14 @@ class SupereventFileViewSet(InheritDefaultPermissionsMixin, return get_objects_for_user(self.request.user, 'superevents.view_log', log_queryset) + # This is a bandaid to overcome some very very + # intermittent errors we've been seeing on AWS. + # I'm going to let this play on playground and test + # and if it doesn't fail castastropically, I'll + # move it into production before the root cause + # can be determined. + + @retry(tries=5, delay=1.0, logger=logger) def list(self, request, *args, **kwargs): # Get logs which are viewable by the current user and # have files attached @@ -270,6 +281,14 @@ class SupereventFileViewSet(InheritDefaultPermissionsMixin, return Response(file_dict) + # This is a bandaid to overcome some very very + # intermittent errors we've been seeing on AWS. + # I'm going to let this play on playground and test + # and if it doesn't fail castastropically, I'll + # move it into production before the root cause + # can be determined. + + @retry(tries=5, delay=1.0, logger=logger) def retrieve(self, request, *args, **kwargs): # Get parent superevent parent_superevent = self.get_parent_object() diff --git a/gracedb/core/file_utils.py b/gracedb/core/file_utils.py index c38a97c418f1fd1d2051550ad1474c83b020d3c0..813e2dda945103ec13ecff05afe0e37e167b7378 100644 --- a/gracedb/core/file_utils.py +++ b/gracedb/core/file_utils.py @@ -1,6 +1,5 @@ import os - def get_file_list(logs, file_dir): """ For a queryset of logs (corresponding to a single event or superevent), diff --git a/gracedb/core/models.py b/gracedb/core/models.py index 7d346f658520fd4dd199eb374fed57a715abd162..ceb3239952d93a34c8507a47815f919220d92d2d 100644 --- a/gracedb/core/models.py +++ b/gracedb/core/models.py @@ -233,7 +233,7 @@ class LogBase(models.Model): Used in events.EventLog, superevents.Log """ created = models.DateTimeField(auto_now_add=True) - issuer = models.ForeignKey(UserModel, null=False) + issuer = models.ForeignKey(UserModel, null=False, on_delete=models.CASCADE) filename = models.CharField(max_length=100, default="", blank=True) file_version = models.IntegerField(null=True, default=None, blank=True) comment = models.TextField(null=False) @@ -275,7 +275,7 @@ class m2mThroughBase(models.Model): creation time. """ creator = models.ForeignKey(UserModel, null=False, related_name= - '%(app_label)s_%(class)s_set') + '%(app_label)s_%(class)s_set', on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True) class Meta: diff --git a/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py b/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py index 4ce9a33f5b1aa09c8f31cdd4b104129edf067066..b81fb2a938fe12a886a59b3b2099f47562a79b23 100644 --- a/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py +++ b/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py @@ -26,7 +26,8 @@ class Migration(migrations.Migration): ), migrations.AlterModelOptions( name='pipeline', - options={'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)}, + #options={'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)}, + options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)}, ), migrations.AddField( model_name='pipeline', diff --git a/gracedb/events/migrations/0048_auto_20200303_0151.py b/gracedb/events/migrations/0048_auto_20200303_0151.py new file mode 100644 index 0000000000000000000000000000000000000000..3ae63d8422a28494e9b6bd2854050b1a937b150b --- /dev/null +++ b/gracedb/events/migrations/0048_auto_20200303_0151.py @@ -0,0 +1,42 @@ +# Generated by Django 2.2 on 2020-03-03 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0047_specify_integralagile_pipeline_types'), + ] + + operations = [ + migrations.AlterModelOptions( + name='pipeline', + options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)}, + ), + migrations.AlterField( + model_name='voevent', + name='coinc_comment', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='voevent', + name='hardware_inj', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='voevent', + name='internal', + field=models.BooleanField(blank=True, default=True), + ), + migrations.AlterField( + model_name='voevent', + name='open_alert', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='voevent', + name='raven_coinc', + field=models.BooleanField(blank=True, default=False), + ), + ] diff --git a/gracedb/events/migrations/0049_add_subgrbtargeted_search.py b/gracedb/events/migrations/0049_add_subgrbtargeted_search.py new file mode 100644 index 0000000000000000000000000000000000000000..7a34b6439e6f35dc6391e81de9b36a5199c8acb9 --- /dev/null +++ b/gracedb/events/migrations/0049_add_subgrbtargeted_search.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-10-25 19:16 +from __future__ import unicode_literals + +from django.db import migrations + +# Creates initial search instances + +# Search names and descriptions +SEARCH_TYPES = [ + {'name': 'SubGRBTargeted', 'description': 'Sub-Threshold Targeted GRB Search'}, +] + +def add_searches(apps, schema_editor): + Search = apps.get_model('events', 'Search') + + # Create searches + for search_dict in SEARCH_TYPES: + search, created = Search.objects.get_or_create(name=search_dict['name']) + if 'description' in search_dict: + search.description = search_dict['description'] + search.save() + +def remove_searches(apps, schema_editor): + Search = apps.get_model('events', 'Search') + + # Delete searches + Search.objects.filter(name__in=[s['name'] for s in SEARCH_TYPES]).delete() + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0048_auto_20200303_0151'), + ] + + operations = [ + migrations.RunPython(add_searches, remove_searches), + ] diff --git a/gracedb/events/models.py b/gracedb/events/models.py index 6413e548d44b7d5a5eed2e58f6d0c452ec786c39..4b4f19d72dfec1a2de39e732eccbbdfafeb2c7cd 100644 --- a/gracedb/events/models.py +++ b/gracedb/events/models.py @@ -90,6 +90,7 @@ class Pipeline(models.Model): external_objects = ExternalPipelineManager() class Meta: + default_permissions = ('add', 'change', 'delete') permissions = ( ('manage_pipeline', 'Can enable or disable pipeline'), ) @@ -105,8 +106,8 @@ class PipelineLog(models.Model): (PIPELINE_LOG_ACTION_DISABLE, 'disable'), (PIPELINE_LOG_ACTION_ENABLE, 'enable'), ) - creator = models.ForeignKey(UserModel) - pipeline = models.ForeignKey(Pipeline) + creator = models.ForeignKey(UserModel, on_delete=models.CASCADE) + pipeline = models.ForeignKey(Pipeline, on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True) action = models.CharField(max_length=10, choices=PIPELINE_LOG_ACTION_CHOICES) @@ -173,9 +174,9 @@ class Event(models.Model): # ) DEFAULT_EVENT_NEIGHBORHOOD = (-5,5) - submitter = models.ForeignKey(UserModel) + submitter = models.ForeignKey(UserModel, on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True) - group = models.ForeignKey(Group) + group = models.ForeignKey(Group, on_delete=models.CASCADE) #uid = models.CharField(max_length=20, default="") # XXX deprecated. should be removed. #analysisType = models.CharField(max_length=20, choices=ANALYSIS_TYPE_CHOICES) @@ -188,8 +189,8 @@ class Event(models.Model): # that creates this column. After that, we can safely remove it. # The presence or absence of the default value has no effect on the DB # tables, so removing it does not necessitate a migration. - pipeline = models.ForeignKey(Pipeline) - search = models.ForeignKey(Search, null=True) + pipeline = models.ForeignKey(Pipeline, on_delete=models.CASCADE) + search = models.ForeignKey(Search, null=True, on_delete=models.CASCADE) # from coinc_event instruments = models.CharField(max_length=20, default="") @@ -471,7 +472,7 @@ class EventLog(CleanSaveModel, LogBase, AutoIncrementModel): AUTO_CONSTRAINTS = ('event',) # Extra fields - event = models.ForeignKey(Event, null=False) + event = models.ForeignKey(Event, null=False, on_delete=models.CASCADE) tags = models.ManyToManyField('Tag', related_name='event_logs') class Meta(LogBase.Meta): @@ -509,11 +510,11 @@ class EMObservationBase(models.Model): N = models.IntegerField(null=False, editable=False) created = models.DateTimeField(auto_now_add=True) submitter = models.ForeignKey(UserModel, null=False, - related_name='%(app_label)s_%(class)s_set') + related_name='%(app_label)s_%(class)s_set', on_delete=models.CASCADE) # The MOU group responsible group = models.ForeignKey(EMGroup, null=False, - related_name='%(app_label)s_%(class)s_set') + related_name='%(app_label)s_%(class)s_set', on_delete=models.CASCADE) # The following fields should be calculated from the footprint info # provided by the user. These fields are just for convenience and @@ -635,8 +636,8 @@ class Labelling(m2mThroughBase): """ Model which provides the "through" relationship between Events and Labels. """ - event = models.ForeignKey(Event) - label = models.ForeignKey(Label) + event = models.ForeignKey(Event, on_delete=models.CASCADE) + label = models.ForeignKey(Label, on_delete=models.CASCADE) def __str__(self): return six.text_type( @@ -711,7 +712,7 @@ class LalInferenceBurstEvent(Event): frequency_median = models.FloatField(null=True) class SingleInspiral(models.Model): - event = models.ForeignKey(Event, null=False) + event = models.ForeignKey(Event, null=False, on_delete=models.CASCADE) ifo = models.CharField(max_length=20, null=True) search = models.CharField(max_length=20, null=True) channel = models.CharField(max_length=100, blank=True) @@ -970,7 +971,7 @@ class VOEventBase(CleanSaveModel): # Fields created = models.DateTimeField(auto_now_add=True) issuer = models.ForeignKey(UserModel, null=False, - related_name='%(app_label)s_%(class)s_set') + related_name='%(app_label)s_%(class)s_set', on_delete=models.CASCADE) ivorn = models.CharField(max_length=200, default="", blank=True, editable=False) filename = models.CharField(max_length=100, default="", blank=True, @@ -1088,7 +1089,7 @@ class SignoffBase(models.Model): # Field definitions submitter = models.ForeignKey(UserModel, related_name= - '%(app_label)s_%(class)s_set') + '%(app_label)s_%(class)s_set', on_delete=models.CASCADE) comment = models.TextField(blank=True) instrument = models.CharField(max_length=2, blank=True, choices=INSTRUMENT_CHOICES) @@ -1150,7 +1151,7 @@ class SignoffBase(models.Model): class Signoff(SignoffBase): """Class for Event signoffs""" - event = models.ForeignKey(Event) + event = models.ForeignKey(Event, on_delete=models.CASCADE) class Meta: unique_together = ('event', 'instrument') @@ -1249,13 +1250,13 @@ class EMBBEventLog(AutoIncrementModel): created = models.DateTimeField(auto_now_add=True) # The gracedb event that this Eel relates to - event = models.ForeignKey(Event) + event = models.ForeignKey(Event, on_delete=models.CASCADE) # The responsible author of this communication - submitter = models.ForeignKey(UserModel) # from a table of people + submitter = models.ForeignKey(UserModel, on_delete=models.CASCADE) # from a table of people # The MOU group responsible - group = models.ForeignKey(EMGroup) # from a table of facilities + group = models.ForeignKey(EMGroup, on_delete=models.CASCADE) # from a table of facilities # The instrument used or intended for the imaging implied by this footprint instrument = models.CharField(max_length=200, blank=True) diff --git a/gracedb/events/translator.py b/gracedb/events/translator.py index dfaba25be5979de0c8ce5bf380be20e98af17bd0..9bce5fd7ec449f50518cba282c01495202dd6ce9 100644 --- a/gracedb/events/translator.py +++ b/gracedb/events/translator.py @@ -646,5 +646,12 @@ def populateGrbEventFromVOEventFile(filename, event): break event.trigger_id = trigger_id + # Check for the existance of FAR in the VOEvent_params. if it exists, + # Then add it to the event. This change was made on 2/7/2020 in support + # of SWIFT event uploads. Note: FAR is in Hz. + + if ('FAR' in VOEvent_params): + event.far = float(VOEvent_params.get('FAR').get('value')) + # Save event event.save() diff --git a/gracedb/ligoauth/models.py b/gracedb/ligoauth/models.py index 9a3d18461a1bead652b8115c03fa1257d5880eef..1e2c727044c83fb0f4de66f0b5fa4c0d066ea08d 100644 --- a/gracedb/ligoauth/models.py +++ b/gracedb/ligoauth/models.py @@ -19,7 +19,7 @@ class LigoLdapUser(User): class X509Cert(models.Model): """Model for storing X.509 certificate subjects for API access""" subject = models.CharField(max_length=255, unique=True, null=False) - user = models.ForeignKey(User) + user = models.ForeignKey(User, on_delete=models.CASCADE) class AuthGroup(Group): """Enhanced version of Django Group model""" @@ -33,7 +33,7 @@ class AuthGroup(Group): ldap_name = models.CharField(max_length=50, unique=True, null=True) # Tag used to expose access to log messages for group; if null, there is no # such tag and access is not granted via this mechanism - tag = models.ForeignKey('events.Tag', null=True) + tag = models.ForeignKey('events.Tag', null=True, on_delete=models.CASCADE) # Add custom managers, must manually define objects as well objects = models.Manager() @@ -47,7 +47,7 @@ class AuthorizedLdapMember(models.Model): ldap_gname = models.CharField(max_length=50, unique=True, null=True) # Add support for authorized membership: - ldap_authgroup = models.ForeignKey(AuthGroup, null=True) + ldap_authgroup = models.ForeignKey(AuthGroup, null=True, on_delete=models.CASCADE) # Give it a name: name = models.CharField(max_length=50, unique=True, null=True) diff --git a/gracedb/migrations/auth/0001_initial.py b/gracedb/migrations/auth/0001_initial.py index 6fbd7fd0b4eea11d72c061926e596608ae309dad..74e636674ee23485b7e6d85986a82bf49a1e4ca8 100644 --- a/gracedb/migrations/auth/0001_initial.py +++ b/gracedb/migrations/auth/0001_initial.py @@ -54,7 +54,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=50, verbose_name='name')), ('codename', models.CharField(max_length=100, verbose_name='codename')), - ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), ], options={ 'ordering': ('content_type__app_label', 'content_type__model', 'codename'), diff --git a/gracedb/migrations/auth/0025_auto_20200229_1957.py b/gracedb/migrations/auth/0025_auto_20200229_1957.py new file mode 100644 index 0000000000000000000000000000000000000000..1490df1bdce1e661ecf1a769b6cbc0870b4a601b --- /dev/null +++ b/gracedb/migrations/auth/0025_auto_20200229_1957.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0 on 2020-02-29 19:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0024_auto_20190919_1957'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='last_name', + field=models.CharField(blank=True, max_length=150, verbose_name='last name'), + ), + ] diff --git a/gracedb/migrations/auth/0026_auto_20200303_0151.py b/gracedb/migrations/auth/0026_auto_20200303_0151.py new file mode 100644 index 0000000000000000000000000000000000000000..c2b95f1cc00f99e77986b3268107193e5fb5486e --- /dev/null +++ b/gracedb/migrations/auth/0026_auto_20200303_0151.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2 on 2020-03-03 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0025_auto_20200229_1957'), + ] + + operations = [ + migrations.AlterField( + model_name='group', + name='name', + field=models.CharField(max_length=150, unique=True, verbose_name='name'), + ), + ] diff --git a/gracedb/migrations/guardian/0011_auto_20200303_0151.py b/gracedb/migrations/guardian/0011_auto_20200303_0151.py new file mode 100644 index 0000000000000000000000000000000000000000..6572ad5ba99c23d4325c3bdf660bf1597d49e310 --- /dev/null +++ b/gracedb/migrations/guardian/0011_auto_20200303_0151.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2 on 2020-03-03 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('guardian', '0010_authorize_raven_users_to_populate_new_pipelines'), + ] + + operations = [ + migrations.AddIndex( + model_name='userobjectpermission', + index=models.Index(fields=['content_type', 'object_pk'], name='guardian_us_content_179ed2_idx'), + ), + migrations.AddIndex( + model_name='groupobjectpermission', + index=models.Index(fields=['content_type', 'object_pk'], name='guardian_gr_content_ae6aec_idx'), + ), + ] diff --git a/gracedb/superevents/migrations/0001_initial.py b/gracedb/superevents/migrations/0001_initial.py index 613b981596398b4bc98d8bd9e6e6a6fc9ab48f7f..3c78a8a9183bd0ae750bcec79218f4fa34502fae 100644 --- a/gracedb/superevents/migrations/0001_initial.py +++ b/gracedb/superevents/migrations/0001_initial.py @@ -76,6 +76,7 @@ class Migration(migrations.Migration): options={ 'ordering': ['-created', '-N'], 'abstract': False, + 'default_permissions': ('add', 'change', 'delete'), 'permissions': (('expose_log', 'Can expose a log to be viewed by external users'), ('hide_log', 'Can hide a log from external users'), ('tag_log', 'Add tag to log'), ('untag_log', 'Remove tag from log'), ('view_log', 'Can view log')), }, ), @@ -114,6 +115,7 @@ class Migration(migrations.Migration): ('submitter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='superevents_signoff_set', to=settings.AUTH_USER_MODEL)), ], options={ + 'default_permissions': ('add', 'change', 'delete'), 'permissions': (('view_signoff', 'Can view signoff'), ('do_H1_signoff', 'Can interact with H1 signoffs'), ('do_L1_signoff', 'Can interact with L1 signoffs'), ('do_V1_signoff', 'Can interact with V1 signoffs'), ('do_adv_signoff', 'Can interact with advocate signoffs')), }, ), @@ -139,6 +141,7 @@ class Migration(migrations.Migration): ], options={ 'ordering': ['-id'], + 'default_permissions': ('add', 'change', 'delete'), 'permissions': (('add_test_superevent', 'Can add test superevent'), ('add_mdc_superevent', 'Can add MDC superevent'), ('change_test_superevent', 'Can change test superevent'), ('change_mdc_superevent', 'Can change MDC superevent'), ('confirm_gw_superevent', 'Can confirm superevent as GW'), ('confirm_gw_test_superevent', 'Can confirm test superevent as GW'), ('confirm_gw_mdc_superevent', 'Can confirm MDC superevent as GW'), ('annotate_superevent', 'Can add log messages and EM observation data to uperevent'), ('expose_superevent', 'Can expose a superevent to be viewed by external users'), ('hide_superevent', 'Can hide a superevent from external users'), ('view_superevent', 'Can view superevent')), }, ), @@ -152,6 +155,7 @@ class Migration(migrations.Migration): ], options={ 'abstract': False, + 'default_permissions': ('add', 'change', 'delete'), 'permissions': (('view_supereventgroupobjectpermission', 'Can view superevent groupobjectpermission'),), }, ), diff --git a/gracedb/superevents/migrations/0007_auto_20200303_0151.py b/gracedb/superevents/migrations/0007_auto_20200303_0151.py new file mode 100644 index 0000000000000000000000000000000000000000..4f002170b2ded7b3f87581696b352fb7056af069 --- /dev/null +++ b/gracedb/superevents/migrations/0007_auto_20200303_0151.py @@ -0,0 +1,54 @@ +# Generated by Django 2.2 on 2020-03-03 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('superevents', '0006_add_raven_voevent_sevent_fields'), + ] + + operations = [ + migrations.AlterModelOptions( + name='log', + options={'default_permissions': ('add', 'change', 'delete'), 'ordering': ['-created', '-N'], 'permissions': (('expose_log', 'Can expose a log to be viewed by external users'), ('hide_log', 'Can hide a log from external users'), ('tag_log', 'Add tag to log'), ('untag_log', 'Remove tag from log'), ('view_log', 'Can view log'))}, + ), + migrations.AlterModelOptions( + name='signoff', + options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('view_signoff', 'Can view signoff'), ('do_H1_signoff', 'Can interact with H1 signoffs'), ('do_L1_signoff', 'Can interact with L1 signoffs'), ('do_V1_signoff', 'Can interact with V1 signoffs'), ('do_adv_signoff', 'Can interact with advocate signoffs'))}, + ), + migrations.AlterModelOptions( + name='superevent', + options={'default_permissions': ('add', 'change', 'delete'), 'ordering': ['-id'], 'permissions': (('add_test_superevent', 'Can add test superevent'), ('add_mdc_superevent', 'Can add MDC superevent'), ('change_test_superevent', 'Can change test superevent'), ('change_mdc_superevent', 'Can change MDC superevent'), ('confirm_gw_superevent', 'Can confirm superevent as GW'), ('confirm_gw_test_superevent', 'Can confirm test superevent as GW'), ('confirm_gw_mdc_superevent', 'Can confirm MDC superevent as GW'), ('annotate_superevent', 'Can add log messages and EM observation data to superevent'), ('expose_superevent', 'Can expose a superevent to be viewed by external users'), ('hide_superevent', 'Can hide a superevent from external users'), ('view_superevent', 'Can view superevent'))}, + ), + migrations.AlterModelOptions( + name='supereventgroupobjectpermission', + options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('view_supereventgroupobjectpermission', 'Can view superevent groupobjectpermission'),)}, + ), + migrations.AlterField( + model_name='voevent', + name='coinc_comment', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='voevent', + name='hardware_inj', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='voevent', + name='internal', + field=models.BooleanField(blank=True, default=True), + ), + migrations.AlterField( + model_name='voevent', + name='open_alert', + field=models.BooleanField(blank=True, default=False), + ), + migrations.AlterField( + model_name='voevent', + name='raven_coinc', + field=models.BooleanField(blank=True, default=False), + ), + ] diff --git a/gracedb/superevents/models.py b/gracedb/superevents/models.py index ca3bdff0cc8f094b9fea4a1aaceec64036c7baa6..658bdd8e13e715a5d0c165a3bf99ebfbcf81801c 100644 --- a/gracedb/superevents/models.py +++ b/gracedb/superevents/models.py @@ -78,7 +78,7 @@ class Superevent(CleanSaveModel, AutoIncrementModel): AUTO_CONSTRAINTS = ('t_0_date', 'category',) # Fields ------------------------------------------------------------------ - submitter = models.ForeignKey(UserModel) + submitter = models.ForeignKey(UserModel, on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True) # Type of superevent (Production, Test, MDC) @@ -132,6 +132,11 @@ class Superevent(CleanSaveModel, AutoIncrementModel): ('t_0_date', 'gw_letter_suffix', 'category'), ) + # New in django 2.2: adds a view_* permission, so add the following + # line so the new default doesn't override the existing permission: + + default_permissions = ('add', 'change', 'delete') + # Extra permissions beyond the standard add, change, delete perms permissions = ( ('add_test_superevent', 'Can add test superevent'), @@ -467,6 +472,9 @@ class SupereventGroupObjectPermission(GroupObjectPermissionBase): content_object = models.ForeignKey(Superevent, on_delete=models.CASCADE) class Meta(GroupObjectPermissionBase.Meta): + + default_permissions = ('add', 'change', 'delete') + permissions = ( ('view_supereventgroupobjectpermission', 'Can view superevent groupobjectpermission'), @@ -489,6 +497,7 @@ class Log(CleanSaveModel, LogBase, AutoIncrementModel): class Meta(LogBase.Meta): unique_together = (('superevent', 'N'),) + default_permissions = ('add', 'change', 'delete') permissions = ( ('expose_log', 'Can expose a log to be viewed by external users'), ('hide_log', 'Can hide a log from external users'), @@ -555,6 +564,7 @@ class Signoff(CleanSaveModel, SignoffBase): class Meta: unique_together = (('superevent', 'instrument'),) + default_permissions = ('add', 'change', 'delete') permissions = ( ('view_signoff', 'Can view signoff'), ('do_H1_signoff', 'Can interact with H1 signoffs'), diff --git a/gracedb/templates/gracedb/event_detail_GRB.html b/gracedb/templates/gracedb/event_detail_GRB.html index 29f3aba0b3310e75bb31d7192350a2ca162af768..11ced3472a77226860525a1b807a3bcc52649e2c 100644 --- a/gracedb/templates/gracedb/event_detail_GRB.html +++ b/gracedb/templates/gracedb/event_detail_GRB.html @@ -74,6 +74,9 @@ {% if object.trigger_duration %} <tr><th>Trigger duration</th><td colspan="2">{{object.trigger_duration}}</td></tr> {% endif %} + {% if object.far %} + <tr><th>FAR (Hz)</th><td colspan="2">{{object.far}}</td></tr> + {% endif %} {% if object.t90 %} <tr><th>T90</th><td colspan="2">{{object.t90}}</td></tr> {% endif %} diff --git a/requirements.txt b/requirements.txt index 82001af7d1466f0895ac39f35e17700b2cef5c03..dae66809e84f50394cfd6ccf9e02d517a7e7269d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ ConcurrentLogHandler==0.9.1 -Django==1.11.23 +Django==2.2.10 django-debug-toolbar==1.9.1 django-extensions==2.0.5 -django-guardian==1.4.9 +django-guardian==2.2.0 django-model-utils==3.1.1 django-ses==0.8.10 django-silk==3.0.1 @@ -57,3 +57,5 @@ pyasn1==0.3.6 pyasn1-modules==0.1.5 # Installing futures for gunicorn gthreads (Python 2 only): futures==3.2.0; python_version < '3' +# retry bandaid for efs errors: +retry==0.9.2