From dc90e62f56d5280a59705f447b1533804abfda21 Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Tue, 7 Jul 2009 17:47:20 -0500
Subject: [PATCH] Changed format of dates to be "G####" instead of date based.
 Changed uid to graceid, since it's not a uid. Requires database change:    
 ALTER TABLE gracedb_event DROP INDEX uid

---
 gracedb/alert.py                  |  10 +--
 gracedb/forms.py                  |   4 +-
 gracedb/models.py                 |  56 ++++-----------
 gracedb/views.py                  | 115 ++++++++++++++++++------------
 templates/gracedb/event_list.html |   6 +-
 5 files changed, 96 insertions(+), 95 deletions(-)

diff --git a/gracedb/alert.py b/gracedb/alert.py
index 7d1ac0490..621f0f568 100644
--- a/gracedb/alert.py
+++ b/gracedb/alert.py
@@ -11,15 +11,15 @@ def issueAlert(event, location):
     issueEmailAlert(event, location)
 
 def issueEmailAlert(event, location):
-    subject = "[gracedb] New %s event. ID: %s" % (event.get_analysisType_display(), event.uid)
+    subject = "[gracedb] New %s event. ID: %s" % (event.get_analysisType_display(), event.graceid())
     message = """
     New Event
     %s / %s
-    UID:        %s
+    GRACEID:    %s
     Location:   %s
     TWiki Page: %s
 """
-    message %= (event.group.name, event.get_analysisType_display(), event.uid, location, event.wikiurl())
+    message %= (event.group.name, event.get_analysisType_display(), event.graceid(), location, event.wikiurl())
     fromaddress = settings.ALERT_EMAIL_FROM
     to = settings.ALERT_EMAIL_TO
     send_mail(subject, message, fromaddress, to)
@@ -45,7 +45,7 @@ def issueXMPPAlert(event, location):
         stdout=null,
         stderr=STDOUT,
         env=env)
-    msg = createPayload(event.uid, location)
+    msg = createPayload(event.graceid(), location)
     p.stdin.write(msg)
     p.stdin.close()
     for i in range(1,10):
@@ -61,7 +61,7 @@ def issueXMPPAlert(event, location):
 #    resource = "sender"
 #    password = "w4k3upal1ve"
 #    node = "cbc_mbta_online"
-#    voevent = createPayload(event.uid, location)
+#    voevent = createPayload(event.graceid(), location)
 #
 #    myjid=JID(username+"@"+server+"/"+resource)
 #    recpt=JID("pubsub."+server)
diff --git a/gracedb/forms.py b/gracedb/forms.py
index ca54bbae7..739b76442 100644
--- a/gracedb/forms.py
+++ b/gracedb/forms.py
@@ -17,8 +17,8 @@ class EventSearchForm(forms.Form):
     submitterList = User.objects.filter(id__in=submitterIds).order_by('name')
     submitterChoices = [("","")]+ [ (u.id, u.name) for u in submitterList]
 
-    uidStart = forms.CharField(required=False)
-    uidEnd = forms.CharField(required=False)
+    graceidStart = forms.CharField(required=False)
+    graceidEnd = forms.CharField(required=False)
     group = forms.ChoiceField(choices=groupChoices, required=False)
     type = forms.ChoiceField(choices=typeChoices, required=False)
     submitter = forms.ChoiceField(choices=submitterChoices, required=False)
diff --git a/gracedb/models.py b/gracedb/models.py
index 41b93c771..c840702ae 100644
--- a/gracedb/models.py
+++ b/gracedb/models.py
@@ -14,42 +14,6 @@ def intToLetters( i, str='' ):
     else:
         return intToLetters( i/26, string.lowercase[i%26] + str )
 
-class Genid:
-    # XXX dear heaven this is awful.
-    def __init__(self):
-        self.lastCalledDate = datetime.datetime.now().date()
-
-        # XXX Find latest suffix from Event table
-        self.next = 0
-        self.lock = thread.allocate_lock()
-        prefix = self.lastCalledDate.strftime('%y%m%d')
-        plen = len(prefix)
-        analyses = Event.objects.filter(uid__contains=prefix)
-        if len(analyses) >0:
-            self.next = 1 + max([lettersToInt(a.uid[plen:]) for a in analyses])
-    
-    def __call__(self):
-        self.lock.acquire()
-        today = datetime.datetime.now().date()
-        assert (today >= self.lastCalledDate)
-        if today != self.lastCalledDate:
-            self.next = 0
-            self.lastCalledDate = today
-        prefix = datetime.datetime.now().strftime('%y%m%d')
-        rv = prefix + intToLetters(self.next)
-        self.next += 1
-        self.lock.release()
-        return rv
-
-# XXX Yarg.
-_genid = None
-def genid():
-    global _genid
-    if not _genid: _genid = Genid()
-    return _genid()
-
-
-
 class User(models.Model):
     name = models.CharField(max_length=100)
     email = models.EmailField()
@@ -83,20 +47,30 @@ class Event(models.Model):
         ("CWB", "CWB"),
         ("MBTA", "MBTA Online"),
     )
-    uid = models.CharField(max_length=20, unique=True, default=genid)
     submitter = models.ForeignKey(User)
     created = models.DateTimeField(auto_now_add=True)
     group = models.ForeignKey(Group)
     analysisType = models.CharField(max_length=20, choices=ANALYSIS_TYPE_CHOICES)
+
+    # XXX Deprecated.  Only useful for old test data.
+    # Remove this when it won't freak people out to lose
+    # old date encoded uids.
+    uid = models.CharField(max_length=20, unique=False, default="")
+
+    def graceid(self):
+        if self.uid:
+            return self.uid
+        return "G%04d" % self.id
+
     def weburl(self):
-        return "https://ldas-jobs.phys.uwm.edu/gracedb/data/%s" % self.uid
+        return "https://ldas-jobs.phys.uwm.edu/gracedb/data/%s" % self.graceid()
 
     def wikiurl(self):
-        return "https://www.lsc-group.phys.uwm.edu/twiki/bin/view/Sandbox/%s" % self.uid
+        return "https://www.lsc-group.phys.uwm.edu/twiki/bin/view/Sandbox/%s" % self.graceid()
 
     def clusterurl(self):
-        #return "pcdev1.phys.uwm.edu:/archive/gracedb/data/%s" % self.uid
-        return "file://pcdev1.phys.uwm.edu/archive/gracedb/data/%s" % self.uid
+        #return "pcdev1.phys.uwm.edu:/archive/gracedb/data/%s" % self.graceid()
+        return "file://pcdev1.phys.uwm.edu/archive/gracedb/data/%s" % self.graceid()
 
     def ligoApproved(self):
         return self.approval_set.filter(approvingCollaboration='L').count()
diff --git a/gracedb/views.py b/gracedb/views.py
index 3613da24d..937bfebd5 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -27,43 +27,56 @@ def create(request):
         form = CreateEventForm()
     else:
         form = CreateEventForm(request.POST, request.FILES)
+        saved = False
         if form.is_valid():
-            group = Group.objects.filter(name=form.cleaned_data['group'])
-            type = form.cleaned_data['type']
-            # Create Event
-            event = Event()
-            event.submitter = request.ligouser
-            event.group = group[0]
-            event.analysisType = type
-            # Create data directory/directories
-            #    Save uploaded file.
-            dirPrefix = "/mnt/gracedb-web/data"
-            eventDir = os.path.join(dirPrefix, event.uid)
-            os.mkdir( eventDir )
-            os.mkdir( os.path.join(eventDir,"private") )
-            os.mkdir( os.path.join(eventDir,"general") )
-            #os.chmod( os.path.join(eventDir,"general"), int("041777",8) )
-            os.chmod( os.path.join(eventDir,"general"), 041777 )
-            f = request.FILES['eventFile']
-            uploadDestination = os.path.join(eventDir, "private", f.name)
-            fdest = open(uploadDestination, 'w')
-            # XXX probably want to check exit code
-            # Oh.  and it doesn't work.
-            os.system("/usr/bin/sudo /usr/local/bin/fixgracedirs %s >/dev/null" % event.uid)
-            #fdest.write("[%s] %s bytes\n" % (f.name, f.size))
-
-            # Save uploaded file into user private area.
-            for chunk in f.chunks():
-                fdest.write(chunk)
-            fdest.close()
-            # Create WIKI page
-            createWikiPage(event.uid)
-            event.save()  # if everything worked... save.
-            # Send an alert.
-            issueAlert(event, os.path.join(event.clusterurl(), "private", f.name))
-            #return HttpResponseRedirect(reverse(view, args=[event.uid]))
+            try:
+                group = Group.objects.filter(name=form.cleaned_data['group'])
+                type = form.cleaned_data['type']
+                # Create Event
+                event = Event()
+                event.submitter = request.ligouser
+                event.group = group[0]
+                event.analysisType = type
+                #  ARGH.  We don't get a graceid until we save,
+                #  but we don't know in advance if we can actually
+                #  create all the things we need for success!
+                #  What to do?!
+                event.save()
+                saved = True  # in case we have to undo this.
+                # Create data directory/directories
+                #    Save uploaded file.
+                dirPrefix = "/mnt/gracedb-web/data"
+                eventDir = os.path.join(dirPrefix, event.graceid())
+                os.mkdir( eventDir )
+                os.mkdir( os.path.join(eventDir,"private") )
+                os.mkdir( os.path.join(eventDir,"general") )
+                #os.chmod( os.path.join(eventDir,"general"), int("041777",8) )
+                os.chmod( os.path.join(eventDir,"general"), 041777 )
+                f = request.FILES['eventFile']
+                uploadDestination = os.path.join(eventDir, "private", f.name)
+                fdest = open(uploadDestination, 'w')
+                # XXX probably want to check exit code
+                # Oh.  and it doesn't work.
+                os.system("/usr/bin/sudo /usr/local/bin/fixgracedirs %s >/dev/null" % event.graceid())
+                #fdest.write("[%s] %s bytes\n" % (f.name, f.size))
+
+                # Save uploaded file into user private area.
+                for chunk in f.chunks():
+                    fdest.write(chunk)
+                fdest.close()
+                # Create WIKI page
+                createWikiPage(event.graceid())
+                # Send an alert.
+                issueAlert(event, os.path.join(event.clusterurl(), "private", f.name))
+                #return HttpResponseRedirect(reverse(view, args=[event.graceid()]))
+            except:
+                # something went wrong.
+                if saved:
+                    # undo save.
+                    event.delete()
+                raise
             if 'cli' in request.POST:
-                msg = str(event.uid)
+                msg = str(event.graceid())
                 response = HttpResponse(mimetype='text/xml')
                 response.write(msg)
                 response['Content-length'] = len(msg)
@@ -98,15 +111,29 @@ def search(request):
         form = EventSearchForm(request.POST)
         if form.is_valid():
             objects = Event.objects.all()
-            start = form.cleaned_data['uidStart']
-            end = form.cleaned_data['uidEnd']
+            start = form.cleaned_data['graceidStart']
+            end = form.cleaned_data['graceidEnd']
             submitter = form.cleaned_data['submitter']
             groupname = form.cleaned_data['group']
             typename = form.cleaned_data['type']
+
             if start:
-                objects = objects.filter(uid__gte=start)
+                if start[0] != 'G':
+                    # XXX This is the deprecated uid stuff. Take it out when uid is gone.
+                    objects = objects.filter(uid__gte=start)
+                    objects = objects.filter(uid__startswith="0")
+                else:
+                    objects = objects.filter(id__gte=int(start[1:]))
+                    objects = objects.filter(uid="")
             if end:
-                objects = objects.filter(uid__lte=end)
+                if end[0] != 'G':
+                    # XXX This is the deprecated uid stuff. Take it out when uid is gone.
+                    objects = objects.filter(uid__lte=end)
+                    objects = objects.filter(uid__startswith="0")
+                else:
+                    objects = objects.filter(id__lte=int(end[1:]))
+                    objects = objects.filter(uid="")
+
             if submitter:
                 objects = objects.filter(submitter=submitter)
             if groupname:
@@ -130,13 +157,13 @@ def search(request):
 # Things that aren't views and should really be elsewhere.
 #-----------------------------------------------------------------
 
-def createWikiPage(uid):
+def createWikiPage(graceid):
     twikiroot = "/mnt/htdocs/uwmlsc/secure/twiki/data/Sandbox/"
     plainFile = """
 Initial Entry for %s
 
 %%TOC{depth="2"}%%
-""" % uid
+""" % graceid
     rcsFile = """head    1.1;
 access; 
 symbols;
@@ -166,9 +193,9 @@ Initial Entry for %s
 
 %%TOC{depth="2"}%%
 @
-""" % uid
-    pname = os.path.join(twikiroot, uid+".txt")
-    rcsname = os.path.join(twikiroot, uid+".txt,r")
+""" % graceid
+    pname = os.path.join(twikiroot, graceid+".txt")
+    rcsname = os.path.join(twikiroot, graceid+".txt,r")
     f = open(pname, "w")
     f.write(plainFile)
     f.close()
diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html
index 0309d9c13..2a6205597 100644
--- a/templates/gracedb/event_list.html
+++ b/templates/gracedb/event_list.html
@@ -41,12 +41,12 @@
                 <img src="/media/img/admin/icon-no.gif"/>
             {% endif %}
         </td>
-        <td>{{ obj.uid }}</td>
+        <td>{{ obj.graceid }}</td>
         <td>{{ obj.submitter }} </td>
         <td>{{ obj.group }} </td>
         <td>{{ obj.get_analysisType_display }} </td>
-        <td><a href="{{ obj.weburl }}">Web: {{ obj.uid }}</a></td>
-        <td><a href="{{ obj.wikiurl }}">Wiki: {{ obj.uid }}</a></td>
+        <td><a href="{{ obj.weburl }}">Web: {{ obj.graceid }}</a></td>
+        <td><a href="{{ obj.wikiurl }}">Wiki: {{ obj.graceid }}</a></td>
     </tr>
 {% endfor %}
 </table>
-- 
GitLab