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