Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
cli_views.py 7.88 KiB

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
#from django.contrib.sites.models import Site
from django.utils.html import strip_tags

from models import Event, EventLog
from forms import SimpleSearchForm

from utils.vfile import VersionedFile

from view_logic import create_label, _createLog
from view_utils import assembleLigoLw
from permission_utils import filter_events_for_user, user_has_perm

import os
from django.conf import settings

# XXX This should be configurable / moddable or something
MAX_QUERY_RESULTS = 1000

GRACEDB_DATA_DIR = settings.GRACEDB_DATA_DIR

import json

def cli_search(request):
    assert request.user
    form = SimpleSearchForm(request.POST)
    if form.is_valid():
        objects = form.cleaned_data['query']
        objects = filter_events_for_user(objects, request.user, 'view') 

        if 'ligolw' in request.POST or 'ligolw' in request.GET:
            from glue.ligolw import utils
            if objects.count() > 1000:
                return HttpResponseBadRequest("Too many events.")
            xmldoc = assembleLigoLw(objects)
            response = HttpResponse(mimetype='application/xml')
            response['Content-Disposition'] = 'attachment; filename=gracedb-query.xml'
            utils.write_fileobj(xmldoc, response)
            return response

        accessFun = {
            "labels" : lambda e: \
                ",".join([labelling.label.name for labelling in e.labelling_set.all()]),
            "pipeline" : lambda e: e.pipeline.name,
            "search"  : lambda e: e.search.name or "",
            "gpstime" : lambda e: str(e.gpstime) or "",
            "created" : lambda e: e.created.isoformat(),
            "dataurl" : lambda e: e.weburl(),
            "graceid" : lambda e: e.graceid(),
            "group" : lambda e: e.group.name,
        }
        defaultAccess = lambda e, a: str(getattr(e,a,None) or "")

        defaultColumns = "graceid,labels,group,pipeline,search,far,gpstime,created,dataurl"
        columns = request.POST.get('columns')
        if not columns:
            columns = defaultColumns
        columns = columns.split(',')

        header = "#" + "\t".join(columns)
        outTable = [header]
        for e in objects:
            row = [ accessFun.get(column, lambda e: defaultAccess(e,column))(e) for column in columns ]
            outTable.append("\t".join(row))
        d = {'output': "\n".join(outTable)}
    else:
        d = {'error': ""}
        for key in form.errors:
            d['error'] += "%s: %s\n" % (key, strip_tags(form.errors[key]))
    response = HttpResponse(mimetype='application/javascript')
    msg = json.dumps(d)
    response['Content-length'] = len(msg)
    response.write(msg)
    return response

def cli_label(request):
    graceid = request.POST.get('graceid')
    labelName = request.POST.get('label')

    doxmpp = request.POST.get('alert') == "True"
    event = graceid and Event.getByGraceid(graceid)

    if not user_has_perm(request.user, 'change', event):
        return HttpResponseForbidden()

    d = create_label(event, labelName, request.user, doXMPP=doxmpp)

    msg = str(d)
    response = HttpResponse(mimetype='application/json')
    response.write(msg)
    response['Content-length'] = len(msg)

    return response

def cli_tag(request):
    raise Exception("tag is not implemented.  Maybe you're thinking of 'label'?")
    graceid = request.POST.get('graceid')
    tagname = request.POST.get('tag')

    event = graceid and Event.getByGraceid(graceid)

    if not user_has_perm(request.user, 'change', event):
        return HttpResponseForbidden()

    event.add_tag(tagname)
    msg = str({})
    response = HttpResponse(mimetype='application/json')
    response.write(msg)
    response['Content-length'] = len(msg)

    return response

def ping(request):
    #ack = "(%s) " % Site.objects.get_current()
    ack = "(%s/%s) " % (request.META['SERVER_NAME'], settings.CONFIG_NAME)
    ack += request.POST.get('ack', None) or request.GET.get('ack','ACK')

    from templatetags.timeutil import utc
    if 'cli_version' in request.POST:
        response = HttpResponse(mimetype='application/json')
        d = {'output': ack}
        if 'extended' in request.POST:
            latest = Event.objects.order_by("-id")[0]
            if user_has_perm(request.user, 'view', latest):
                d['latest'] = {}
                d['latest']['id'] = latest.graceid()
                d['latest']['created'] = str(utc(latest.created))
        d =  json.dumps(d)
        response.write(d)
        response['Content-length'] = len(d)
    else:
        # Old client
        response = HttpResponse(mimetype='text/plain')
        response.write(ack)
        response['Content-length'] = len(ack)
    return response

def upload(request):
    graceid = request.POST.get('graceid', None)
    comment = request.POST.get('comment', None)
    uploadedfile = request.FILES['upload']

    try:
        event = graceid and Event.getByGraceid(graceid)
    except Event.DoesNotExist:
        event = None

    if not event:
        return HttpResponseBadRequest("Event does not exist.")
    if not user_has_perm(request.user, 'change', event):
        return HttpResponseForbidden()

    if 'cli_version' in request.POST:
        return _createLog(request, graceid, comment, uploadedfile)

    # else: old, old client
    response = HttpResponse(mimetype='text/plain')
    # uploadedFile.{name/chunks()}
    try:
        event = graceid and Event.getByGraceid(graceid)
    except Event.DoesNotExist:
        event = None
    if not (comment and uploadedfile and graceid):
        msg = "ERROR: missing arg(s)"
    elif not event:
        msg = "ERROR: Event '%s' does not exist" % graceid
    else:
        #event issuer comment
        # XXX Note:  filename or comment oughta have a version
        log = EventLog(event=event,
                       issuer=request.user,
                       filename=uploadedfile.name,
                       comment=comment)
        try:
            log.save()
            msg = "OK"
        except:
            msg = "ERROR: problem creating log entry"
        try:
            # XXX
            # Badnesses:
            #   Same hardcoded path in multiple places.
            fname = os.path.join(GRACEDB_DATA_DIR, event.graceid(), "private", uploadedfile.name)
            f = VersionedFile(fname, 'w')
            for chunk in uploadedfile.chunks():
                f.write(chunk)
            f.close()
            log.file_version = f.version
            log.save()
        except Exception, e:
            msg = "ERROR: could not save file " + fname + " " + str(e)
            log.delete()
    response = HttpResponse(mimetype='text/plain')
    response.write(msg)
    response['Content-length'] = len(msg)
    return response

def log(request):
    message = request.POST.get('message')
    graceid = request.POST.get('graceid')

    try:
        event = graceid and Event.getByGraceid(graceid)
    except Event.DoesNotExist:
        event = None

    if not event:
        return HttpResponseBadRequest("Event does not exist.")
    if not user_has_perm(request.user, 'change', event):
        return HttpResponseForbidden()

    if 'cli_version' in request.POST:
        return _createLog(request, graceid, message)

    # old, old client only
    response = HttpResponse(mimetype='text/plain')
    try:
        event = graceid and Event.getByGraceid(graceid)
    except Event.DoesNotExist:
        event = None

    if not (message and graceid):
        msg = "ERROR: missing arg(s)"
    elif not event:
        msg = "ERROR: Event '%s' does not exist" % graceid
    else:
        #event issuer comment
        log = EventLog(event=event, issuer=request.user, comment=message)
        try:
            log.save()
            msg = "OK"
        except:
            msg = "ERROR: problem creating log entry"

    response = HttpResponse(mimetype='text/plain')
    response.write(msg)
    response['Content-length'] = len(msg)
    return response