diff --git a/gracedb/admin.py b/gracedb/admin.py index 5ece5c4d9c1e8e95e7c4e910ce49a26183030096..7e36d454e8d2ad5b3a2c1897a2a1bd103bf5505a 100644 --- a/gracedb/admin.py +++ b/gracedb/admin.py @@ -1,6 +1,6 @@ from models import Event, EventLog, User, Group -from models import Label, Labelling, Slot, Tag +from models import Label, Labelling, Tag from django.contrib import admin class EventAdmin(admin.ModelAdmin): @@ -30,9 +30,6 @@ class LabellingAdmin(admin.ModelAdmin): list_display = [ 'event', 'label', 'creator' ] search_fields = [ 'event__id', 'label__name', 'creator__name' ] -class SlotAdmin(admin.ModelAdmin): - list_display = [ 'event', 'name', 'value' ] - class TagAdmin(admin.ModelAdmin): list_display = [ 'name', 'displayName' ] filter_vertical = [ 'eventlogs' ] @@ -43,5 +40,4 @@ admin.site.register(User, UserAdmin) admin.site.register(Group) admin.site.register(Label, LabelAdmin) admin.site.register(Labelling, LabellingAdmin) -admin.site.register(Slot, SlotAdmin) admin.site.register(Tag, TagAdmin) diff --git a/gracedb/api.py b/gracedb/api.py index 8130843b67473d8ae1afe47a02990e429e45549d..f1b75c85287b33894a5b269f46156bf78f780ae0 100644 --- a/gracedb/api.py +++ b/gracedb/api.py @@ -8,7 +8,7 @@ from django.conf import settings import json -from gracedb.models import Event, Group, EventLog, Slot, Tag +from gracedb.models import Event, Group, EventLog, Tag from gracedb.views import create_label from translator import handle_uploaded_data @@ -117,11 +117,6 @@ def eventToDict(event, columns=None, request=None): "self" : reverse("event-detail", args=[graceid], request=request), "tags" : reverse("eventtag-list", args=[graceid], request=request), } - # XXX Jam the slots in here? Could just have a list of slot names instead of - # all these links. But the links might be useful?? - rv['slots'] = {} - for slot in Slot.objects.filter(event=event).order_by('name'): - rv['slots'][slot.name] = reverse("slot", args=[graceid, slot.name], request=request) return rv @@ -854,10 +849,6 @@ class GracedbRoot(APIView): labels = labels.replace("G1200", "{graceid}") labels = labels.replace("thelabel", "{label}") - slot = reverse("slot", args=["G1200", "slotname"], request=request) - slot = slot.replace("G1200", "{graceid}") - slot = slot.replace("slotname", "{slotname}") - taglist = reverse("eventlogtag-list", args=["G1200", "0"], request=request) taglist = taglist.replace("G1200", "{graceid}") taglist = taglist.replace("0", "{n}") @@ -875,7 +866,6 @@ class GracedbRoot(APIView): "event-label-template" : labels, "files-template" : files, "filemeta-template" : filemeta, - "slot-template" : slot, "tag-template" : tag, "taglist-template" : taglist, } @@ -1104,120 +1094,3 @@ class FileMeta(APIView): permission_classes = (IsAuthenticated,) pass -#================================================================== -# Slots - -class EventSlot(APIView): - """A slot associated with an event. - """ - - # Get the value of a slot. This will be a filename. - def get(self, request, graceid, slotname): - try: - event = Event.getByGraceid(graceid) - except Event.DoesNotExist: - # XXX Real error message. - return Response("Event does not exist.", - status=status.HTTP_404_NOT_FOUND) - - if not slotname: - return Response(dict([(s.name, s.value) - for s in Slot.objects.filter(event=event)])) - - try: - slot = Slot.objects.filter(event=event).filter(name=slotname)[0] - except: - # Okay, no slot yet. Probably want an error message. - # Try looking for files that contain the slot name. - return Response("No slot. Search based on slotname not implemented yet.", - status=status.HTTP_404_NOT_FOUND) - filename = slot.value - rv = {} - rv['value'] = filename - return Response(rv) - - # Create a slot. The slot's value will be a filename. - # This file is assumed to have already been uploaded. - def put(self, request, graceid, slotname): - try: - event = Event.getByGraceid(graceid) - except Event.DoesNotExist: - # XXX Real error message. - return Response("Event does not exist.", - status=status.HTTP_404_NOT_FOUND) - filename = request.DATA.get('filename') - # Interestingly, the None object seems to be converted to a string - # when encoded in the HTTP request body. Hence the 'None' string - # below. If somebody intentionally named a file 'None', then - # they deserve to get this error message. - if filename=='' or filename=='None' or filename==None: - return Response("Please submit a filename or upload a file.", - status=status.HTTP_400_BAD_REQUEST) - - # UGLY hack to deal with /private vs /general dirs - general = False - tmpFilename = filename - if filename.startswith("general/"): - tmpFilename = filename[len("general/"):] - general = True - filepath = os.path.join(event.datadir(general), tmpFilename) - - # Check for existence of the file. - if not os.path.exists(filepath): - return Response("No slot created because file does not exist", - status=status.HTTP_404_NOT_FOUND) - # Check for existence of the slot. If it exists, simply update the - # existing slot. - try: - slot = Slot.objects.filter(event=event).filter(name=slotname)[0] - slot.value = filename - slot.save() - # Create a log entry to document the slot update. - msg = "Updated slot %s with file " % slotname - logentry = EventLog(event=event, - issuer=request.ligouser, - filename=tmpFilename, - comment=msg) - logentry.save() - except: - # Create the slot. - slot = Slot(event=event,name=slotname,value=filename) - slot.save() - # Create a log entry to document the slot creation. - msg = "Created slot %s with file " % slotname - logentry = EventLog(event=event, - issuer=request.ligouser, - filename=tmpFilename, - comment=msg) - logentry.save() - - return Response("Slot created or updated.",status=status.HTTP_201_CREATED) - - # Delete a slot. - def delete(self, request, graceid, slotname): - try: - event = Event.getByGraceid(graceid) - except Event.DoesNotExist: - # XXX Real error message. - return Response("Event does not exist.", - status=status.HTTP_404_NOT_FOUND) - - # Gotta find the poor devil before we can delete him. - try: - slot = Slot.objects.filter(event=event).filter(name=slotname)[0] - except: - # Okay, no slot yet. Probably want an error message. - # Try looking for files that contain the slot name. - return Response("No such slot.", - status=status.HTTP_404_NOT_FOUND) - - slot.delete() - # Create a log entry to document the slot destruction. - msg = "Deleted slot %s " % slotname - logentry = EventLog(event=event, - issuer=request.ligouser, - comment=msg) - logentry.save() - - return Response("Slot deleted.",status=status.HTTP_200_OK) - diff --git a/gracedb/migrations/0003_auto__del_slot__del_unique_slot_event_name.py b/gracedb/migrations/0003_auto__del_slot__del_unique_slot_event_name.py new file mode 100644 index 0000000000000000000000000000000000000000..066c22bff6271796213757f1de8e4df130409556 --- /dev/null +++ b/gracedb/migrations/0003_auto__del_slot__del_unique_slot_event_name.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing unique constraint on 'Slot', fields ['event', 'name'] + db.delete_unique('gracedb_slot', ['event_id', 'name']) + + # Deleting model 'Slot' + db.delete_table('gracedb_slot') + + + def backwards(self, orm): + # Adding model 'Slot' + db.create_table('gracedb_slot', ( + ('value', self.gf('django.db.models.fields.CharField')(max_length=100)), + ('event', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gracedb.Event'])), + ('name', self.gf('django.db.models.fields.CharField')(max_length=100)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('gracedb', ['Slot']) + + # Adding unique constraint on 'Slot', fields ['event', 'name'] + db.create_unique('gracedb_slot', ['event_id', 'name']) + + + models = { + 'gracedb.approval': { + 'Meta': {'object_name': 'Approval'}, + 'approvedEvent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.Event']"}), + 'approver': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.User']"}), + 'approvingCollaboration': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'gracedb.coincinspiralevent': { + 'Meta': {'ordering': "['-id']", 'object_name': 'CoincInspiralEvent', '_ormbases': ['gracedb.Event']}, + 'combined_far': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'end_time': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'end_time_ns': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'event_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gracedb.Event']", 'unique': 'True', 'primary_key': 'True'}), + 'false_alarm_rate': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'ifos': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20'}), + 'mass': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'mchirp': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'minimum_duration': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'snr': ('django.db.models.fields.FloatField', [], {'null': 'True'}) + }, + 'gracedb.event': { + 'Meta': {'ordering': "['-id']", 'object_name': 'Event'}, + 'analysisType': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'far': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'gpstime': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.Group']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'instruments': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20'}), + 'labels': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gracedb.Label']", 'through': "orm['gracedb.Labelling']", 'symmetrical': 'False'}), + 'likelihood': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'nevents': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'submitter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.User']"}), + 'uid': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20'}) + }, + 'gracedb.eventlog': { + 'Meta': {'ordering': "['-created']", 'object_name': 'EventLog'}, + 'comment': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.Event']"}), + 'filename': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'issuer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.User']"}) + }, + 'gracedb.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'managers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gracedb.User']", 'symmetrical': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}) + }, + 'gracedb.label': { + 'Meta': {'object_name': 'Label'}, + 'defaultColor': ('django.db.models.fields.CharField', [], {'default': "'black'", 'max_length': '20'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}) + }, + 'gracedb.labelling': { + 'Meta': {'object_name': 'Labelling'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.User']"}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.Event']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gracedb.Label']"}) + }, + 'gracedb.multiburstevent': { + 'Meta': {'ordering': "['-id']", 'object_name': 'MultiBurstEvent', '_ormbases': ['gracedb.Event']}, + 'amplitude': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'bandwidth': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'central_freq': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'confidence': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'duration': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'event_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gracedb.Event']", 'unique': 'True', 'primary_key': 'True'}), + 'false_alarm_rate': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'ifos': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20'}), + 'ligo_angle': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'ligo_angle_sig': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'ligo_axis_dec': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'ligo_axis_ra': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'peak_time': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'peak_time_ns': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'snr': ('django.db.models.fields.FloatField', [], {'null': 'True'}), + 'start_time': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'start_time_ns': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}) + }, + 'gracedb.tag': { + 'Meta': {'object_name': 'Tag'}, + 'displayName': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'eventlogs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gracedb.EventLog']", 'symmetrical': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'gracedb.user': { + 'Meta': {'ordering': "['name']", 'object_name': 'User'}, + 'dn': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'principal': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'unixid': ('django.db.models.fields.CharField', [], {'max_length': '25'}) + } + } + + complete_apps = ['gracedb'] \ No newline at end of file diff --git a/gracedb/models.py b/gracedb/models.py index cb6dd80b22c8531ae596407d6e70f3a68df6994c..e7c3afea9911fd1fd5ef80f43b0e404ada77f659 100644 --- a/gracedb/models.py +++ b/gracedb/models.py @@ -271,7 +271,7 @@ class MultiBurstEvent(Event): ## Tags (user-defined log message attributes) class Tag(models.Model): - """Slot Model""" + """Tag Model""" # XXX Does the tag need to have a submitter column? # No, because creating a tag will generate a log message. # For the same reason, a timstamp is not necessary. @@ -291,23 +291,4 @@ class Tag(models.Model): # # set of log messages in the event with the set of log # # messages in the tag. # eventlist = [log.event for log in self.eventlogs.all()] -# return list(set(eventlist)) - - -## XXX Get rid of the slots. Probably. -class Slot(models.Model): - """Slot Model""" - # Does the slot need to have a submitter column? - class Meta: - unique_together = (('event', 'name')) - event = models.ForeignKey(Event) - name = models.CharField(max_length=100) - value = models.CharField(max_length=100) - - # In case the slot value is not a filename, this will just return None. - def fileurl(self): - if self.value: - return reverse('file', args=[self.event.graceid(), self.value]) - else: - return None diff --git a/gracedb/templatetags/slot.py b/gracedb/templatetags/slot.py deleted file mode 100644 index 63e7b16827c8d94711d2563cde26fb788f473ebd..0000000000000000000000000000000000000000 --- a/gracedb/templatetags/slot.py +++ /dev/null @@ -1,21 +0,0 @@ - -from django import template -from django.utils.encoding import force_unicode -from django.utils.safestring import mark_safe -from ..models import Slot, EventLog -register = template.Library() - -@register.filter("slot") -def slot(event,name=None): - if event is None: - return None - try: - if name: - return Slot.objects.filter(event=event).filter(name__exact=name)[0] - else: - return Slot.objects.filter(event=event) - except: - # Either there is no such slot or something went wrong. - # In either case, we want the template to just ignore it. - return None - diff --git a/gracedb/urls_rest.py b/gracedb/urls_rest.py index e8a48236b573361cee398e64227eac6263dd7aaf..828bfec477bde347f8b5592539e343a79e6f9209 100644 --- a/gracedb/urls_rest.py +++ b/gracedb/urls_rest.py @@ -9,7 +9,6 @@ from gracedb.api import TagList # from gracedb.api import TagDetail from gracedb.api import EventTagList, EventTagDetail from gracedb.api import EventLogTagList, EventLogTagDetail -from gracedb.api import EventSlot from gracedb.api import Files, FileMeta from gracedb.api import EventNeighbors, EventLabel @@ -59,11 +58,6 @@ urlpatterns = patterns('gracedb.api', url (r'^events/(?P<graceid>\w[\d]+)/labels/(?P<label>.+)?$', EventLabel.as_view(), name="labels"), - # Event Slots - # events/{graceid}/slot/[{slotname}] - url (r'^events/(?P<graceid>[GEHT]\d+)/slot/(?P<slotname>.+)?$', - EventSlot.as_view(), name="slot"), - # Event Neighbors # events/{graceid}/neighbors/[?delta=(N|(N,N))] url (r'^events/(?P<graceid>\w[\d]+)/neighbors/$',