Esempio n. 1
0
def main(id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=True, devel=qdict['dev'])

    # Get project name.

    name = dbutil.get_project_name(cnx, id)

    # Generate html document header.

    print 'Content-type: text/plain'
    print

    # Generate main part of html document.

    if id == 0 or name == '':
        print 'No such project.'
    else:

        # Generate POMS ini file.

        ini = StringIO.StringIO()
        dbutil.export_poms_project(cnx, id, qdict['dev'], ini)
        print ini.getvalue()
Esempio n. 2
0
def main(id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Generate html document header.

    print 'Content-type: text/html'
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<head>'
    print '<title>Dataset Editor</title>'
    print '</head>'
    print '<body>'
    print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \
        (dbconfig.base_url, dbargs.convert_args(qdict))

    # Generate main parg of html document.

    dataset_form(cnx, id, qdict)

    # Generate html document trailer.

    print '</body>'
    print '</html>'
Esempio n. 3
0
def main(dataset_id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Check access.

    if not dbconfig.restricted_access_allowed() and dbutil.restricted_access(
            cnx, 'datasets', dataset_id):
        dbutil.restricted_error()

    # Query the project id, dataset type, and sequence number.

    c = cnx.cursor()
    q = 'SELECT id,project_id,type,seqnum FROM datasets WHERE id=%s'
    c.execute(q, (dataset_id, ))
    rows = c.fetchall()
    if len(rows) == 0:
        raise IOError('Unable to fetch dataset id %d' % dataset_id)
    row = rows[0]
    project_id = row[1]
    dataset_type = row[2]
    seqnum = row[3]

    # Query the succeeding sequence number

    q = 'SELECT id, project_id, type, seqnum FROM datasets WHERE project_id=%s AND type=%s AND seqnum>%s ORDER BY seqnum'

    c.execute(q, (project_id, dataset_type, seqnum))
    rows = c.fetchall()
    if len(rows) > 0:
        row = rows[0]
        next_dataset_id = row[0]
        next_seqnum = row[3]

        # Swap sequence numbers.

        q = 'UPDATE datasets SET seqnum=%s WHERE id=%s'
        c.execute(q, (next_seqnum, dataset_id))
        q = 'UPDATE datasets SET seqnum=%s WHERE id=%s'
        c.execute(q, (seqnum, next_dataset_id))
        cnx.commit()

    # Generate redirect html document header to invoke the dataset editor for
    # the newly created document.

    url = ''
    url = '%s/edit_datasets.py?id=%d&%s' % \
          (dbconfig.base_url, project_id, dbargs.convert_args(qdict))
    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'
Esempio n. 4
0
def main(id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=True, devel=qdict['dev'])

    # Get project name.

    name = dbutil.get_project_name(cnx, id)

    # Generate document header.

    print 'Content-type: text/plain'
    print

    # Generate main part of text document.

    if id == 0 or name == '':
        print 'No such project.'
    else:

        # Generate text.

        cfg = StringIO.StringIO()
        dbutil.export_fife_project(cnx, id, cfg)
        print cfg.getvalue()
Esempio n. 5
0
def main(qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Add project and redirect to project editor.

    project_id = dbutil.insert_blank_project(cnx)
    url = '%s/edit_project.py?id=%d&%s' % \
          (dbconfig.base_url, project_id, dbargs.convert_args(qdict))

    # Generate redirect page.

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    print 'Add project.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'

    # Done.

    return
Esempio n. 6
0
def main(stage_id, name, override_type, value, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Add override and redirect to stage editor.

    override_id = dbutil.add_override(cnx, stage_id, name, override_type,
                                      value)
    url = '%s/edit_stage.py?id=%d&%s' % \
          (dbconfig.base_url, stage_id, dbargs.convert_args(qdict))

    # Generate redirect page.

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    print 'Add override.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'

    # Done.

    return
Esempio n. 7
0
def main(qdict, argdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=True, devel=qdict['dev'])

    # Generate html document header.

    print 'Content-type: text/html'
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<head>'
    print '<title>Sample Request</title>'
    print '</head>'
    print '<body>'
    print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \
        (dbconfig.base_url, dbargs.convert_args(qdict))

    # Generate main part of html document.

    request_form(cnx, qdict, argdict)

    # Generate html document trailer.

    print '</body>'
    print '</html>'

    # Done.

    return
Esempio n. 8
0
def main(group_id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Get original group name.

    group_name = dbutil.get_group_name(cnx, group_id)
    clone_id = 0

    if group_name != '':

        # Generate first candidate clone group name.

        clone_group_name = 'Clone of %s' % group_name

        # Check whether this group name is already used.

        dup_id = dbutil.get_group_id(cnx, clone_group_name)

        # Modify group name until we find one that isn't alrady used.

        ntry = 1
        while dup_id > 0:
            ntry += 1
            clone_group_name = 'Clone %d of %s' % (ntry, group_name)
            dup_id = dbutil.get_group_id(cnx, clone_group_name)

        # Now clone the group.

        clone_id = dbutil.clone_group(cnx, group_id, clone_group_name)

    # Generate redirect html document header to invoke the gropu editor for
    # the newly created document.

    url = ''
    if clone_id > 0:
        url = '%s/edit_group.py?id=%d&%s' % \
              (dbconfig.base_url, clone_id, dbargs.convert_args(qdict))
    else:
        url = '%s/query_groups.py?%s' % \
              (dbconfig.base_url, dbargs.convert_args(qdict))

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    url = ''
    if clone_id > 0:
        print 'Cloned group %s' % group_name
    else:
        print 'Group not cloned.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'
 def find_by_username(cls,username):
     try:
         conn  = connect()
         query = 'SELECT * FROM {} WHERE `username`="{}"'.format(cls.tablename,username)
         cursor = conn.cursor(pymysql.cursors.DictCursor)
         cursor.execute(query)
         res = cursor.fetchone()
         return res 
     except Exception as e:
         print(e)
         return None 
     finally:
         close(cursor,conn)
 def getByUserId(cls, user_id):
     try:
         conn = connect()
         cursor = conn.cursor(pymysql.cursors.DictCursor)
         query = "SELECT * FROM {} WHERE `user_id`={}".format(
             cls.tablename, user_id)
         cursor.execute(query)
         res = cursor.fetchall()
         return res
     except Exception as e:
         print(e)
         return None
     finally:
         close(cursor, conn)
Esempio n. 11
0
def main(substage_id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Query the stage id.

    c = cnx.cursor()
    q = 'SELECT id,fclname,stage_id FROM substages WHERE id=%s'
    c.execute(q, (substage_id, ))
    rows = c.fetchall()
    if len(rows) == 0:
        raise IOError('Unable to fetch substage id %d' % substage_id)
    row = rows[0]
    fclname = row[1]
    stage_id = row[2]

    # Now clone the substage.

    clone_id = dbutil.clone_substage(cnx, substage_id, stage_id)

    # Generate redirect html document header to invoke the substage editor for
    # the newly created document.

    url = ''
    if clone_id > 0:
        url = '%s/edit_substage.py?id=%d&%s' % \
              (dbconfig.base_url, clone_id, dbargs.convert_args(qdict))
    else:
        url = '%s/edit_stage.py?id=%d&%s' % \
              (dbconfig.base_url, stage_id, dbargs.convert_args(qdict))

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    if clone_id > 0:
        print 'Cloned substage %s' % fclname
    else:
        print 'Substage not cloned.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'
    def save(cls,data):
        try:
            conn = connect()
            cursor = conn.cursor()
            query = "INSERT INTO {}(`username`,`password`) VALUES(%s,%s)".format(cls.tablename)
            #generate password hash
            pass_hash = generate_password_hash(data["password"])
            bind  = (data["username"],pass_hash)
            cursor.execute(query,bind)
            conn.commit()
            return True

        except Exception as e:
            print(e)
            return False
        finally:
            close(cursor,conn)                  
    def save(cls, data):
        try:
            conn = connect()
            cursor = conn.cursor()
            query = "INSERT INTO {}(`user_id`,`website`,`username`,`password`) VALUES(%s,%s,%s,%s)".format(
                cls.tablename)
            bind = (data["user"], data["website"], data["username"],
                    data["password"])
            cursor.execute(query, bind)
            conn.commit()

            return True
        except Exception as e:
            print(e)
            return False
        finally:
            close(cursor, conn)
Esempio n. 14
0
def main(dataset_id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Query the project id.
    # This is only needed for the redirect page.

    c = cnx.cursor()
    q = 'SELECT id,project_id FROM datasets WHERE id=%s'
    c.execute(q, (dataset_id, ))
    rows = c.fetchall()
    if len(rows) == 0:
        raise IOError('Unable to fetch dataset id %d' % dataset_id)
    row = rows[0]
    project_id = row[1]

    # Clone the dataset row.

    clone_id = dbutil.clone_dataset(cnx, dataset_id, project_id)

    # Generate redirect html document header to invoke the dataset editor for
    # the newly created document.

    url = '%s/edit_datasets.py?id=%d&%s' % \
          (dbconfig.base_url, project_id, dbargs.convert_args(qdict))

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    if clone_id > 0:
        print 'Cloned dataset.'
    else:
        print 'Dataset not cloned.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'
Esempio n. 15
0
def main(id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly = False, devel = qdict['dev'])

    # Query the stage id.

    c = cnx.cursor()
    q = 'SELECT id,stage_id FROM overrides WHERE id=%s'
    c.execute(q, (id,))
    rows = c.fetchall()
    if len(rows) == 0:
        raise IOError('Unable to fetch override id %d' % id)
    row = rows[0]
    stage_id = row[1]

    # Delete override and redirect to stage editor.

    dbutil.delete_override(cnx, id)
    url = '%s/edit_stage.py?id=%d&%s' % \
          (dbconfig.base_url, stage_id, dbargs.convert_args(qdict))

    # Generate redirect page.

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    print 'Deleted override.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'

    # Done.

    return
Esempio n. 16
0
def main(xmldata, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly = False, devel = qdict['dev'])

    if xmldata == '':

        # If xml data is empty, generate a dialog to browse for local xml name.

        print 'Content-type: text/html'
        print
        print '<!DOCTYPE html>'
        print '<html>'
        print '<head>'
        print '<title>Import Project</title>'
        print '</head>'
        print '<body>'
        
        # Generate a form with file dialog and two buttons "Import" and "Cancel."

        print '<form action="%s/import_project.py" method="post" enctype="multipart/form-data">' % dbconfig.rel_url
        for key in qdict:
            print '<input type="hidden" name="%s" value="%s">' % (dbutil.convert_str(key),
                                                                  dbutil.convert_str(qdict[key]))
        print '<label for="xmldata">Choose input xml file: </label>'
        print '<input type="file" id="xmldata" name="data" accept=".xml">'
        print '<br>'
        print '<input type="submit" value="Import">'
        print '<input type="submit" value="Cancel" formaction="%s/query_projects.py?%s">' % \
            (dbconfig.rel_url, dbargs.convert_args(qdict))
        print '</body>'
        print '</html>'

    else:

        # Got uploaded xml data.
        # Check any project are not already in database.

        names = []
        try:
            names = dbutil.xml_project_names(xmldata)
        except:
            names = []
        if len(names) == 0:

            # XML error.

            url = '%s/query_projects.py?%s' % \
                  (dbconfig.base_url, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<head>'
            print '<title>Import Project</title>'
            print '</head>'
            print '<body>'
            print 'Initial XML parsing error.'
            print '<br><br>'
            print '<a href=%s>Return to project list</a>.' % url
            print '</body>'
            print '</html>'
            return

        # See if names already exist in database.

        ok = False
        for name in names:
            id = dbutil.get_project_id(cnx, name)
            if id == 0:
                ok = True
                break

        if not ok:

            # All project names are already in database.
            # Generate informative page.

            url = '%s/query_projects.py?%s' % \
                  (dbconfig.base_url, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<head>'
            print '<title>Import Project</title>'
            print '</head>'
            print '<body>'
            print 'Project with same name is already in database.'
            print '<br><br>'
            print '<a href=%s>Return to project list</a>.' % url
            print '</body>'
            print '</html>'
            return

        # Insert project in database.

        ids = []
        try:
            ids = dbutil.import_project(cnx, xmldata)
        except:
            #print 'Content-type: text/html'
            #print
            #ids = dbutil.import_project(cnx, xmldata)
            ids = []

        if len(ids) > 0:

            # Import successful.
            # Redirect to project editor.

            project_id = ids[0]
            url = '%s/edit_project.py?id=%d&%s' % \
                  (dbconfig.base_url, project_id, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print 'Status: 303 See Other'
            print 'Location: %s' % url
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<body>'
            print 'Import project successful.'
            print '<br><br>'
            print 'If page does not automatically reload click this <a href=%s>link</a>' % url
            print '</body>'
            print '</html>'

        else:

            # Import failed.

            url = '%s/query_projects.py?%s' % \
                  (dbconfig.base_url, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<head>'
            print '<title>Import Project</title>'
            print '</head>'
            print '<body>'
            print 'XML parsing error.'
            print '<br><br>'
            print '<a href=%s>Return to project list</a>.' % url
            print '</body>'
            print '</html>'

    # Done.

    return
Esempio n. 17
0
def submit(qdict, argdict):

    # This function is currently implemented to do the following actions.
    #
    # 1.  Add a project to the production database.
    # 2.  Optionally store a text document on the web server.
    # 3.  Optionally send an email containing a text summary.
    #
    # Whether actions 2 and 3 are taken depends on parameters "email" and "request_dir"
    # in dbconfig.py.

    # Generate a request name.
    # The request name is used to generate the name of the saved text file,
    # the subject of the email, and the project name in the database.
    # The request name is required to be different from any existing project name
    # in the database.  The request name is also required to be different from any
    # request file in the request directory.

    # Generate a base project name based on project name specified in form, if specified,
    # or based on a time stamp otherwise.

    base_name = ''
    if argdict.has_key('name'):
        base_name = argdict['name']
    else:
        base_name = 'request_%s' % datetime.datetime.now().strftime(
            '%Y%m%d_%H%M%S')

    # Generate a non-existing project name based off base name.

    n = 0
    done = False
    request_name = ''
    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])
    c = cnx.cursor()

    while not done:

        if n == 0:
            request_name = base_name
        else:
            request_name = '%s_%d' % (base_name, n)

        # See if this candidate name already exists.

        q = 'SELECT COUNT(*) FROM projects WHERE name=%s'
        c.execute(q, (request_name, ))
        row = c.fetchone()
        count = row[0]
        if count == 0:
            done = True
        else:
            n += 1

        # Check request directory.

        if done and dbconfig.request_dir != '':
            rfn = '%s/%s.txt' % (dbconfig.request_dir, request_name)
            if os.path.exists(rfn):
                done = False
                n += 1

    # Generate html document header.

    print 'Content-type: text/html'
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'

    # Maybe add request file.

    if dbconfig.request_dir != '':
        if not os.path.isdir(dbconfig.request_dir):
            os.makedirs(dbconfig.request_dir)

        # Make new request file.

        rfn = '%s/%s.txt' % (dbconfig.request_dir, request_name)
        f = open(rfn, 'w')
        f.write(gentext(argdict))
        f.close()

    # Maybe send email.

    if dbconfig.email != '':
        p = subprocess.Popen(['sendmail', dbconfig.email],
                             stdin=subprocess.PIPE)
        message = 'Subject:Sample request %s\n%s' % (request_name,
                                                     gentext(argdict))
        p.communicate(input=message)
        p.wait()

    # Construct query to add project.
    # Use values from form, or defaults.

    cols = databaseDict['projects']
    q = 'INSERT INTO projects SET name=%s'
    params = [request_name]

    # Loop over columns.

    for n in range(2, len(cols)):
        coltup = cols[n]
        colname = coltup[0]
        coltype = coltup[2]
        colarray = coltup[3]
        value = coltup[5]

        # Update default values.

        if colname == 'username' and argdict.has_key('user'):
            value = argdict['user']
        elif colname == 'description' and argdict.has_key('description'):
            value = argdict['description']
        elif colname == 'experiment' and argdict.has_key('exp'):
            value = argdict['exp']
        elif colname == 'file_type' and argdict.has_key('ftype'):
            value = argdict['ftype']
        elif colname == 'role' and argdict.has_key('role'):
            value = argdict['role']
        elif colname == 'campaign' and argdict.has_key('camp'):
            value = argdict['camp']
        elif colname == 'physics_group' and argdict.has_key('wgroup'):
            value = argdict['wgroup']
        elif colname == 'status':
            value = 'Requested'
        elif colname == 'num_events' and argdict.has_key('num_events'):
            value = argdict['num_events']
        elif colname == 'num_jobs' and argdict.has_key('num_jobs'):
            value = argdict['num_jobs']
        elif colname == 'max_files_per_job' and argdict.has_key('max_files'):
            value = argdict['max_files']
        elif colname == 'release_tag' and argdict.has_key('version'):
            value = argdict['version']
        elif colname == 'version' and argdict.has_key('version'):
            value = 'test_%s' % argdict['version']
        elif colname == 'validate_on_worker':
            value = 1

        # Update query to include this column

        if colarray:
            q += ',%s=%%s' % colname
            params.append(value)
        elif coltype[:3] == 'INT':
            q += ',%s=%%s' % colname
            params.append(value)
        elif coltype[:7] == 'VARCHAR':
            if value != None:
                q += ',%s=%%s' % colname
                params.append(value.replace('&', '&amp;'))
        elif coltype[:6] == 'DOUBLE':
            q += ',%s=%%s' % colname
            params.append(value)

    # Execute query.

    c.execute(q, params)

    # Get id of inserted row.

    q = 'SELECT LAST_INSERT_ID()'
    c.execute(q)
    row = c.fetchone()
    new_project_id = row[0]

    # Generate a list of stage keys in argdict.

    stage_keys = []
    for key in argdict:
        if key.startswith('stage_'):
            stage_keys.append(key)

    # Loop over stage keys in ascending order.

    stage_names = set()
    for stage_key in sorted(stage_keys):

        # Get the stage name for this key.

        stage_name = argdict[stage_key]

        # Only process this stage name if it hasn't already been seen.

        if stage_name not in stage_names:
            stage_names.add(stage_name)

            # Construct a query to insert a new stage row in database.

            stage_cols = databaseDict['stages']
            q = 'INSERT INTO stages SET name=%s,project_id=%s,seqnum=%s'
            params = [stage_name, new_project_id, len(stage_names)]

            # Loop over columns.

            for n in range(4, len(stage_cols)):
                stage_coltup = stage_cols[n]
                stage_colname = stage_coltup[0]
                stage_coltype = stage_coltup[2]
                stage_colarray = stage_coltup[3]
                value = stage_coltup[5]

                # Update default values.

                mem_key = 'memory_%s' % stage_key[6:]
                project_name = ''
                if argdict.has_key('name'):
                    project_name = argdict['name']
                else:
                    project_name = request_name
                if stage_colname == 'memory' and argdict.has_key(mem_key):
                    value = argdict[mem_key]
                elif stage_colname == 'inputdef' and len(
                        stage_names) == 1 and argdict.has_key('input'):
                    value = argdict['input']
                elif (stage_colname == 'outdir' or stage_colname == 'logdir') and \
                     argdict.has_key('user') and argdict.has_key('exp'):
                    value = '/pnfs/%s/scratch/users/%s/output/%s/%s' % (
                        argdict['exp'], argdict['user'], project_name,
                        stage_name)
                elif stage_colname == 'workdir' and argdict.has_key(
                        'user') and argdict.has_key('exp'):
                    value = '/pnfs/%s/resilient/users/%s/work/%s/%s' % (
                        argdict['exp'], argdict['user'], project_name,
                        stage_name)
                elif stage_colname == 'bookdir' and argdict.has_key(
                        'user') and argdict.has_key('exp'):
                    value = '/%s/data/users/%s/book/%s/%s' % (
                        argdict['exp'], argdict['user'], project_name,
                        stage_name)
                elif stage_colname == 'num_events' and argdict.has_key(
                        'num_events'):
                    value = argdict['num_events']
                elif stage_colname == 'num_jobs' and argdict.has_key(
                        'num_jobs'):
                    value = argdict['num_jobs']
                elif stage_colname == 'max_files_per_job' and argdict.has_key(
                        'max_files'):
                    value = argdict['max_files']
                elif stage_colname == 'schema_' and argdict.has_key('schema'):
                    value = argdict['schema']

                # Update query to include this column

                if stage_colarray:
                    q += ',%s=%%s' % stage_colname
                    params.append(value)
                elif stage_coltype[:3] == 'INT':
                    q += ',%s=%%s' % stage_colname
                    params.append(value)
                elif stage_coltype[:7] == 'VARCHAR':
                    if value != None:
                        q += ',%s=%%s' % stage_colname
                        params.append(value.replace('&', '&amp;'))
                elif stage_coltype[:6] == 'DOUBLE':
                    q += ',%s=%%s' % stage_colname
                    params.append(value)

            # Execute query.

            c.execute(q, params)

            # Get id of inserted row.

            q = 'SELECT LAST_INSERT_ID()'
            c.execute(q)
            row = c.fetchone()
            new_stage_id = row[0]

            # Find fcl files associated with this stage name.

            fcl_keys = []
            for key in argdict.keys():
                if key.startswith('stage_') and argdict[key] == stage_name:
                    fcl_key = 'fcl_%s' % key[6:]
                    if argdict.has_key(fcl_key):
                        fcl_keys.append(fcl_key)

            # Loop over fcl keys in ascending order.

            seq = 0
            for fcl_key in sorted(fcl_keys):
                seq += 1

                # Get fcl name for this key.

                fcl_name = argdict[fcl_key]

                # Construct a query to insert a new substage row in the database.

                substage_cols = databaseDict['substages']
                q = 'INSERT INTO substages SET fclname=%s,stage_id=%s,seqnum=%s'
                params = [fcl_name, new_stage_id, seq]

                # Loop over columns.

                for n in range(4, len(substage_cols)):
                    substage_coltup = substage_cols[n]
                    substage_colname = substage_coltup[0]
                    substage_coltype = substage_coltup[2]
                    substage_colarray = substage_coltup[3]
                    value = substage_coltup[5]

                    # Update query to include this column

                    if substage_colarray:
                        q += ',%s=%%s' % substage_colname
                        params.append(value)
                    elif substage_coltype[:3] == 'INT':
                        q += ',%s=%%s' % substage_colname
                        params.append(value)
                    elif substage_coltype[:7] == 'VARCHAR':
                        if value != None:
                            q += ',%s=%%s' % substage_colname
                            params.append(value.replace('&', '&amp;'))
                    elif substage_coltype[:6] == 'DOUBLE':
                        q += ',%s=%%s' % substage_colname
                        params.append(value)

                # Execute query.

                c.execute(q, params)

    # Commit database updates.

    cnx.commit()

    # Generate message.

    print 'Sample request %s submitted.' % request_name
    print '<br><br>'

    # Add hidden form data with some buttons.

    print '<form action="%s/request.py" method="post" target="_self">' % dbconfig.rel_url

    # Add hidden form data.

    for key in qdict:
        print '<input type="hidden" name="%s" value="%s">' % (
            dbutil.convert_str(key), dbutil.convert_str(qdict[key]))
    for key in argdict:
        if key != 'submit':
            print '<input type="hidden" name="%s" value="%s">' % (
                dbutil.convert_str(key), dbutil.convert_str(argdict[key]))

    # Add buttons.

    print '<input type="submit" name="reload" value="Back">'

    # Done with form.

    print '<form>'

    # Generate document trailer.

    print '</body>'
    print '</html>'

    # Done.

    return
Esempio n. 18
0
def main(id, confirm, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly = False, devel = qdict['dev'])

    # Query the fclname and stage id.

    c = cnx.cursor()
    q = 'SELECT id,fclname,stage_id FROM substages WHERE id=%s'
    c.execute(q, (id,))
    rows = c.fetchall()
    if len(rows) == 0:
        raise IOError('Unable to fetch substage id %d' % id)
    row = rows[0]
    fclname = row[1]
    stage_id = row[2]

    # Check confirm flag.

    if confirm == 0:

        # If confirm flag is zero, generate a confirmation page.

        print 'Content-type: text/html'
        print
        print '<!DOCTYPE html>'
        print '<html>'
        print '<head>'
        print '<title>Delete Substage</title>'
        print '</head>'
        print '<body>'

        if id == 0 or fclname == '':

            print 'No such substage.'

        else:

            print 'Delete substage %s?' % fclname

            # Generate a form with two buttons "Delete" and "Cancel."

            print '<br>'
            print '<form action="%s/delete_substage.py?id=%d&confirm=1&%s" method="post">' % \
                (dbconfig.rel_url, id, dbargs.convert_args(qdict))
            print '<input type="submit" value="Delete">'
            print '<input type="submit" value="Cancel" formaction="%s/edit_stage.py?id=%d&%s">' % \
                (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict))
            print '</form>'

        print '</body>'
        print '</html>'

    else:

        # If confirm flag is nonzero, delete substage and redirect to stage editor.

        dbutil.delete_substage(cnx, id)
        url = '%s/edit_stage.py?id=%d&%s' % \
              (dbconfig.base_url, stage_id, dbargs.convert_args(qdict))

        # Generate redirect page.

        print 'Content-type: text/html'
        print 'Status: 303 See Other'
        print 'Location: %s' % url
        print
        print '<!DOCTYPE html>'
        print '<html>'
        print '<body>'
        print 'Deleted substage %s.' % fclname
        print '<br><br>'
        print 'If page does not automatically reload click this <a href=%s>link</a>' % url
        print '</body>'
        print '</html>'

        # Done.

        return
Esempio n. 19
0
def main(qdict):

    # Extract arguments.

    results_per_page = qdict['results_per_page']
    current_page = qdict['page']
    pattern = qdict['pattern']
    devel = qdict['dev']
    sort = qdict['sort']

    # Open database connection and query groups.

    cnx = dbconfig.connect(readonly=True, devel=qdict['dev'])

    # Get list of project groups.

    groups = list_groups(cnx, pattern, sort)
    max_page = (len(groups) + results_per_page - 1) / results_per_page

    # Generate html document header.

    print 'Content-type: text/html'
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<head>'
    print '<title>Project Groups</title>'
    print '</head>'
    print '<body>'

    # Add styles.

    print '<style>'
    print '.small-btn {'
    print '  padding:0 5px;'
    print '  text-decoration:none;'
    print '  border:none;'
    print '  background-color:white;'
    print '}'
    print '</style>'

    # Add link to project full list.

    print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \
        (dbconfig.base_url, dbargs.convert_args(qdict, 'gid', 0))

    # Generate main part of html document.

    print '<h1>Project Groups</h1>'

    # Add button to create new group.

    print '<form action="%s/add_group.py?%s" method="post" target="_self">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict))
    print '<label for="submit">Generate a new empty project group: </label>'
    print '<input type="submit" id="submit" value="New Group">'
    print '</form>'
    print '<p>'

    # Generate search panel form.

    search_panel(results_per_page, pattern, devel)

    # Display number of results.

    print '<p>%d project groups found</p>' % len(groups)

    # Generate upper navigation panel.

    page_links(qdict, max_page)

    # Group table.

    print '<table border=1 style="border-collapse:collapse">'
    print '<tr>'
    print '<th nowrap>'
    print '&nbsp;Group ID&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_groups.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_u'))
    if sort == 'id_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_groups.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_d'))
    if sort == 'id_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    print '<th nowrap>'
    print '&nbsp;Group Name&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_groups.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_u'))
    if sort == 'name_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_groups.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_d'))
    if sort == 'name_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    print '</tr>'

    # Loop over groups.

    for i in range((current_page - 1) * results_per_page,
                   min(current_page * results_per_page, len(groups))):
        group = groups[i]
        print '<tr>'
        id = group[0]
        name = group[1]
        print '<td align="center">%d</td>' % id

        # Construct disabled option for restricted controls.

        disabled = ''
        if not dbconfig.restricted_access_allowed():
            disabled = 'disabled'

        # Add group name with link to projects page.

        url = '%s/query_projects.py?%s' % \
              (dbconfig.base_url, dbargs.convert_args(qdict, 'gid', id))
        print '<td>&nbsp;<a href="%s">%s</a>&nbsp;</td>' % (url, name)

        # Add Edit button/column

        print '<td>'
        print '<form target="_self" action="%s/edit_group.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Edit group">'
        print '<input type="submit" value="&#x270e;">'
        print '</div>'
        print '</form>'
        print '</td>'

        # Add Clone button/column

        print '<td>'
        print '<form target="_self" action="%s/clone_group.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Clone group">'
        print '<input type="submit" value="&#x2398;">'
        print '</div>'
        print '</form>'
        print '</td>'

        # Add Delete button/column

        print '<td>'
        print '<form action="%s/delete_group.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Delete group">'
        print '<input type="submit" value="&#x1f5d1;" %s>' % disabled
        print '</div>'
        print '</form>'
        print '</td>'
        print '</tr>'
    print '</table>'

    # Add lower navigation panel.

    page_links(qdict, max_page)

    # Generate html document trailer.

    print '</body>'
    print '</html>'
Esempio n. 20
0
def main(project_id, dataset_name, dataset_type, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])
    c = cnx.cursor()

    if dataset_name == '':

        # If dataset name is empty, generate a dialog to query the dataset name.

        print 'Content-type: text/html'
        print
        print '<!DOCTYPE html>'
        print '<html>'
        print '<head>'
        print '<title>Add Dataset</title>'
        print '</head>'
        print '<body>'

        # Generate a form with file dialog and two buttons "Import" and "Cancel."

        print '<h2>Add %s dataset</h2>' % dataset_type
        print '<form action="%s/add_dataset.py" method="post">' % dbconfig.rel_url
        for key in qdict:
            print '<input type="hidden" name="%s" value="%s">' % (
                dbutil.convert_str(key), dbutil.convert_str(qdict[key]))
        print '<input type="hidden" name="id" value=%d>' % project_id
        print '<input type="hidden" name="type" value=\'%s\'>' % dataset_type
        print '<label for="dataset_name">Dataset Name: </label>'
        print '<input type="text" id="dataset_name" name="name">'
        print '<br>'
        print '<input type="submit" value="Add">'
        print '<input type="submit" value="Cancel" formaction="%s/edit_datasets.py">' % dbconfig.rel_url
        print '</form>'
        print '</body>'
        print '</html>'

    else:

        # Maybe insert dataset.

        dataset_id = dbutil.add_dataset(cnx, project_id, dataset_type,
                                        dataset_name)
        if dataset_id == 0:

            # This dataset name is already used.
            # Generate informative page.

            url = '%s/edit_datasets.py?id=%d&%s' % \
                  (dbconfig.base_url, project_id, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<head>'
            print '<title>Add Dataset</title>'
            print '</head>'
            print '<body>'
            print 'Dataset with same name is already in database.'
            print '<br><br>'
            print '<a href=%s>Return to dataset list</a>.' % url
            print '</body>'
            print '</html>'
            return

        else:

            # Insert succeeded.
            # Redirect to dataset list.

            url = '%s/edit_datasets.py?id=%d&%s' % \
                  (dbconfig.base_url, project_id, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print 'Status: 303 See Other'
            print 'Location: %s' % url
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<body>'
            print 'Dataset addition successful.'
            print '<br><br>'
            print 'If page does not automatically reload click this <a href=%s>link</a>' % url
            print '</body>'
            print '</html>'

    # Done.

    return
Esempio n. 21
0
def main(project_id, update_id, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # See if we want to update any dataset.

    if update_id != 0:

        update_ok = False

        # Query dataset name.

        c = cnx.cursor()
        q = 'SELECT name FROM datasets WHERE id=%s'
        c.execute(q, (update_id, ))
        rows = c.fetchall()
        if len(rows) == 0:
            raise IOError('Unable to fetch dataset id %d' % update_id)
        dataset_name = rows[0][0]

        # Query experiment name.

        q = 'SELECT experiment FROM projects WHERE id=%s'
        c.execute(q, (project_id, ))
        rows = c.fetchall()
        if len(rows) == 0:
            raise IOError('Unable to fetch project id %d' % project_id)
        row = rows[0]
        experiment = row[0]

        # Query event count form sam.

        files = 0
        events = 0
        parent_files = 0
        parent_events = 0
        update_ok = True
        r = dbutil.get_stats(dbconfig.samweb_url[experiment], dataset_name)
        if r == None:
            update_ok = False
        else:
            files = r[0]
            events = r[1]
            r = dbutil.get_parent_stats(dbconfig.samweb_url[experiment],
                                        dataset_name)
            if r == None:
                update_ok = False
            else:
                parent_files = r[0]
                parent_events = r[1]

        # Do update.

        if update_ok:

            # Check access.

            if not dbconfig.restricted_access_allowed(
            ) and dbutil.restricted_access(cnx, 'datasets', dataset_id):
                dbutil.restricted_error()

            # Update database.

            q = 'UPDATE datasets SET events=%s, files=%s, parent_events=%s, parent_files=%s WHERE id=%s'
            c.execute(q,
                      (events, files, parent_events, parent_files, update_id))
            cnx.commit()

        else:

            url = '%s/edit_datasets.py?id=%d&%s' % \
                  (dbconfig.base_url, project_id, dbargs.convert_args(qdict))
            print 'Content-type: text/html'
            print
            print '<!DOCTYPE html>'
            print '<html>'
            print '<head>'
            print '<title>Update Datasets</title>'
            print '</head>'
            print '<body>'
            print 'Failed to update dataset statistics.'
            print '<br><br>'
            print '<a href=%s>Return to dataset list</a>.' % url
            print '</body>'
            print '</html>'
            return

    # Generate html document header.

    print 'Content-type: text/html'
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<head>'
    print '<title>Project Datasets Editor</title>'
    print '</head>'
    print '<body>'
    print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \
        (dbconfig.base_url, dbargs.convert_args(qdict))

    # Generate main parg of html document.

    datasets_form(cnx, project_id, qdict)

    # Generate html document trailer.

    print '</body>'
    print '</html>'
Esempio n. 22
0
def main(argdict):

    # Open database connection.

    qdict = dbargs.extract_qdict(argdict)
    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Get table name and id (primary key).
    # Both of these values should exist and be non-null, or else operation will fail.

    table = ''
    id = 0
    saveurl = ''
    update_db = False
    if 'table' in argdict:
        table = argdict['table']
    if 'id' in argdict:
        id = int(argdict['id'])
    if 'saveurl' in argdict and 'submit' in argdict and \
       (argdict['submit'] == 'Save' or argdict['submit'] == 'Back'):
        saveurl = argdict['saveurl']
    if 'submit' in argdict and (argdict['submit'] == 'Save'
                                or argdict['submit'] == 'Update'):
        update_db = True

    # Check access restrictions.

    if not dbconfig.restricted_access_allowed():

        # Check whether this table/id is restricted access.

        if dbutil.restricted_access(cnx, table, id):
            dbutil.restricted_error()

        # If the projects table is being updated to a status which is anything other
        # than '' or 'Requested', it is an error.

        if table == 'projects' and 'status' in argdict and \
           argdict['status'] != '' and argdict['status'] != 'Requested':
            dbutil.restricted_error()

    if update_db:

        # Update database.

        c = cnx.cursor()
        q = 'UPDATE %s SET ' % table
        params = []

        # Loop over columns of this table.

        cols = databaseDict[table]
        first = True
        for n in range(len(cols)):
            coltup = cols[n]
            colname = coltup[0]
            coltype = coltup[2]
            colarray = coltup[3]
            coldesc = coltup[4]

            if colname != '' and colname != 'id':

                # Did form supply a value for this column?

                if colname in argdict:

                    # Maybe add separator.

                    if first:
                        first = False
                    else:
                        q += ', '

                    # Add value.

                    if colarray == 0:

                        # Scalar column.

                        if coltype[0:3] == 'INT':
                            q += '%s=%%s' % colname
                            params.append(int(argdict[colname]))
                        elif coltype[0:6] == 'DOUBLE':
                            q += '%s=%%s' % colname
                            params.append(float(argdict[colname]))
                        elif coltype[0:7] == 'VARCHAR':
                            q += '%s=%%s' % colname
                            params.append(argdict[colname])

                    else:

                        # String array.

                        strs = argdict[colname].split()
                        strid = dbutil.update_strings(cnx, strs)
                        q += '%s=%%s' % colname
                        params.append(strid)

        # Add where clause.

        q += ' WHERE id=%s'
        params.append(id)

        # Run query.

        c.execute(q, params)

        # Special handling for table groups.

        if table == 'groups':

            # Loop over arguments to find projects to add to this group.

            project_ids = []
            for k in argdict:
                if k.startswith('add'):
                    project_ids.append(int(argdict[k]))

            # Loop over projects.

            for project_id in project_ids:
                q = 'INSERT INTO group_project SET group_id=%s,project_id=%s'
                c.execute(q, (id, project_id))

            # Loop over arguments to find projects to remove from this group.

            project_ids = []
            for k in argdict:
                if k.startswith('remove'):
                    project_ids.append(int(argdict[k]))

            # Loop over projects.

            for project_id in project_ids:
                q = 'DELETE FROM group_project WHERE group_id=%s AND project_id=%s'
                c.execute(q, (id, project_id))

        # Commit updates.

        cnx.commit()

    # Calculate redirect url.

    url = '%s/query_projects.py' % dbconfig.base_url
    if saveurl != '':
        url = saveurl
    elif 'HTTP_REFERER' in os.environ:
        url = os.environ['HTTP_REFERER']

    # Generate html redirect document.

    print 'Content-type: text/html'
    print 'Status: 303 See Other'
    print 'Location: %s' % url
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<body>'
    if table != '':
        print 'Database table "%s" updated.' % table
    else:
        print 'Database not updated.'
    print '<br><br>'
    print 'If page does not automatically reload click this <a href=%s>link</a>' % url
    print '</body>'
    print '</html>'
Esempio n. 23
0
def main(qdict):

    # Extract arguments.

    results_per_page = qdict['results_per_page']
    current_page = qdict['page']
    pattern = qdict['pattern']
    group = qdict['group']
    status = qdict['status']
    devel = qdict['dev']
    gid = qdict['gid']
    file_type = qdict['file_type']
    campaign = qdict['campaign']
    sort = qdict['sort']
    experiment = qdict['experiment']

    # Open database connection and query projects.

    cnx = dbconfig.connect(readonly = True, devel = qdict['dev'])

    # Get list of projects.

    prjs = list_projects(cnx, pattern, group, status, gid, experiment, file_type, campaign, sort)
    max_page = (len(prjs) + results_per_page - 1) / results_per_page

    # Generate html document header.

    print 'Content-type: text/html'
    print
    print '<!DOCTYPE html>'
    print '<html>'
    print '<head>'
    print '<title>Projects</title>'
    print '</head>'
    print '<body>'

    # Add styles.

    print '<style>'
    print '.small-btn {'
    print '  padding:0 5px;'
    print '  text-decoration:none;'
    print '  border:none;'
    print '  background-color:white;'
    print '}'
    print '</style>'

    # Add link to project group list.

    print '<a href=%s/query_groups.py?%s>Group list</a><br>' % \
        (dbconfig.base_url, dbargs.convert_args(qdict))

    # Generate main part of html document.

    print '<h1>Projects</h1>'

    # Add button to request a new sample.

    print '<form action="%s/request.py?%s" method="post" target="_self">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict))
    print '<label for="submit">Request a sample: </label>'
    print '<input type="submit" id="submit" value="Request">'
    print '</form>'
    print '<p>'

    # Add button to create new project.

    print '<form action="%s/add_project.py?%s" method="post" target="_self">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict))
    print '<label for="submit">Generate a new empty project: </label>'
    print '<input type="submit" id="submit" value="New Project">'
    print '</form>'
    print '<p>'

    # Add button to import a project from local xml file.

    print '<form action="%s/import_project.py?%s" method="post" target="_self">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict))
    print '<label for="submit">Import project from local XML file: </label>'
    print '<input type="submit" id="submit" value="Import Project">'
    print '</form>'
    print '<p>'

    # Generate search panel form.

    search_panel(results_per_page, pattern, group, status, gid, experiment, file_type, campaign, devel)

    # Display number of results.

    print '<p>%d projects found</p>' % len(prjs)

    # Generate upper navigation panel.

    page_links(qdict, max_page)

    # Project table.

    print '<table border=1 style="border-collapse:collapse">'
    print '<tr>'

    # Project ID column.

    print '<th nowrap>'
    print '&nbsp;Project ID&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_u'))
    if sort == 'id_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_d'))
    if sort == 'id_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    # Project name column.

    print '<th nowrap>'
    print '&nbsp;Project Name (Datasets)&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_u'))
    if sort == 'name_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_d'))
    if sort == 'name_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    # Experiment column.

    print '<th nowrap>'
    print '&nbsp;Experiment&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'experiment_u'))
    if sort == 'experiment_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'experiment_d'))
    if sort == 'experiment_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    # File type column.

    print '<th nowrap>'
    print '&nbsp;File Type&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'file_type_u'))
    if sort == 'file_type_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'file_type_d'))
    if sort == 'file_type_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    # Campaign column.

    print '<th nowrap>'
    print '&nbsp;Campaign&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'campaign_u'))
    if sort == 'campaign_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'campaign_d'))
    if sort == 'campaign_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    # Physics group column.

    print '<th nowrap>'
    print '&nbsp;Physics&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'group_u'))
    if sort == 'group_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'group_d'))
    if sort == 'group_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'

    # Status column.

    print '<th nowrap>'
    print '&nbsp;Status&nbsp;'

    # Add sort buttons.

    print '<div style="display:inline-block">'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'status_u'))
    if sort == 'status_u':
        print '<input class="small-btn" type="submit" value="&#x25b2;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25b3;">'
    print '</form>'
    print '<form action="%s/query_projects.py?%s" method="post">' % \
        (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'status_d'))
    if sort == 'status_d':
        print '<input class="small-btn" type="submit" value="&#x25bc;">'
    else:
        print '<input class="small-btn" type="submit" value="&#x25bd;">'
    print '</form>'
    print '</div>'
    print '</th>'
    print '</tr>'

    # Loop over projects.

    for i in range((current_page-1) * results_per_page, 
                   min(current_page * results_per_page, len(prjs))):
        prj = prjs[i]
        print '<tr>'
        id = prj[0]
        name = prj[1]
        file_type = prj[2]
        experiment = prj[3]
        campaign = prj[4]
        physics_group = prj[5]
        status = prj[6]
        color_style = ''
        if status in colors:
            color_style = 'style="background-color: %s"' % colors[status]
        print '<td align="center" %s>%d</td>' % (color_style, id)

        # Construct disabled option for restricted controls.

        disabled = ''
        if not dbconfig.restricted_access_allowed() and dbutil.restricted_access(cnx, 'projects', id):
            disabled = 'disabled'
        

        # Add link to datasets page with project name.

        print '<td %s>&nbsp;<a target=_self href=%s/edit_datasets.py?id=%d&%s>%s</a>&nbsp;</td>' % \
            (color_style, dbconfig.base_url, id, dbargs.convert_args(qdict), name)

        # Add middle columns

        print '<td align="center" %s>&nbsp;%s&nbsp;</td>' % (color_style, experiment)
        print '<td align="center" %s>&nbsp;%s&nbsp;</td>' % (color_style, file_type)
        print '<td align="center" %s>&nbsp;%s&nbsp;</td>' % (color_style, campaign)
        print '<td align="center" %s>&nbsp;%s&nbsp;</td>' % (color_style, physics_group)
        print '<td align="center" %s>&nbsp;%s&nbsp;</td>' % (color_style, status)

        # Add XML button/column

        xml_disabled = ''
        if dbutil.xml_disabled(cnx, id):
            xml_disabled = 'disabled'
        print '<td>'
        print '<form target="_self" action="%s/export_project.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Generate project.py XML">'
        print '<input type="submit" value="XML" %s>' % xml_disabled
        print '</div>'
        print '</form>'
        print '</td>'        

        # Add FIFE button/column

        fife_disabled = ''
        if dbutil.xml_disabled(cnx, id):
            fife_disabled = 'disabled'
        print '<td>'
        print '<form target="_self" action="%s/export_fife.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Generate fife_launch config">'
        print '<input type="submit" value="FIFE" %s>' % xml_disabled
        print '</div>'
        print '</form>'
        print '</td>'        

        # Add POMS button/column

        print '<td>'
        print '<form target="_self" action="%s/export_poms.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Generate POMS .ini file">'
        print '<input type="submit" value="POMS">'
        print '</form>'
        print '</td>'        

        # Add Edit button/column

        print '<td>'
        print '<form target="_self" action="%s/edit_project.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Edit project">'
        print '<input type="submit" value="&#x270e;">'
        print '</div>'
        print '</form>'
        print '</td>'        

        # Add Clone button/column

        print '<td>'
        print '<form target="_self" action="%s/clone_project.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Clone project">'
        print '<input type="submit" value="&#x2398;">'
        print '</div>'
        print '</form>'
        print '</td>'        

        # Add Delete button/column

        print '<td>'
        print '<form action="%s/delete_project.py?id=%d&%s" method="post">' % \
            (dbconfig.rel_url, id, dbargs.convert_args(qdict))
        print '<div title="Delete project">'
        print '<input type="submit" value="&#x1f5d1;" %s>' % disabled
        print '</div>'
        print '</form>'
        print '</td>'        
        print '</tr>'
    print '</table>'

    # Add lower navigation panel.

    page_links(qdict, max_page)

    # Generate html document trailer.
    
    print '</body>'
    print '</html>'
Esempio n. 24
0
def main(id, confirm, qdict):

    # Open database connection.

    cnx = dbconfig.connect(readonly=False, devel=qdict['dev'])

    # Get project name.

    name = dbutil.get_project_name(cnx, id)

    # Check confirm flag.

    if confirm == 0:

        # If confirm flag is zero, generate a confirmation page.

        print 'Content-type: text/html'
        print
        print '<!DOCTYPE html>'
        print '<html>'
        print '<head>'
        print '<title>Delete Project</title>'
        print '</head>'
        print '<body>'
        if id == 0 or name == '':

            print 'No such project.'

        else:

            print 'Delete project %s?' % name

            # Generate a form with two buttons "Delete" and "Cancel."

            print '<br>'
            print '<form action="%s/delete_project.py?id=%d&confirm=1&%s" method="post">' % \
                (dbconfig.rel_url, id, dbargs.convert_args(qdict))
            print '<input type="submit" value="Delete">'
            print '<input type="submit" value="Cancel" formaction="%s/query_projects.py?%s">' % \
                (dbconfig.rel_url, dbargs.convert_args(qdict))
            print '</form>'

        print '</body>'
        print '</html>'

    else:

        # If confirm flag is nonzero, delete project and redirect to project list.

        dbutil.delete_project(cnx, id)
        url = '%s/query_projects.py?%s' % \
              (dbconfig.base_url, dbargs.convert_args(qdict))

        # Generate redirect page.

        print 'Content-type: text/html'
        print 'Status: 303 See Other'
        print 'Location: %s' % url
        print
        print '<!DOCTYPE html>'
        print '<html>'
        print '<body>'
        print 'Deleted project %s.' % name
        print '<br><br>'
        print 'If page does not automatically reload click this <a href=%s>link</a>' % url
        print '</body>'
        print '</html>'