예제 #1
0
    def test_spawnHTML(self):
        # arrange
        spawnName = "testspawn"
        s = ghObjects.resourceSpawn()
        s.spawnID = 42
        s.spawnName = spawnName
        s.spawnGalaxy = 1
        s.resourceType = "wood_deciduous_yavin4"
        s.resourceTypeName = "Yavinian Deciduous Wood"
        s.containerType = "flora_structural"
        s.stats.CR = 0
        s.stats.CD = 0
        s.stats.DR = 780
        s.stats.FL = 0
        s.stats.HR = 0
        s.stats.MA = 560
        s.stats.PE = 0
        s.stats.OQ = 656
        s.stats.SR = 450
        s.stats.UT = 800
        s.stats.ER = 0

        s.percentStats.CR = None
        s.percentStats.CD = None
        s.percentStats.DR = 780.0 / 800
        s.percentStats.FL = None
        s.percentStats.HR = None
        s.percentStats.MA = 160.0 / 400
        s.percentStats.PE = None
        s.percentStats.OQ = 656.0 / 1000
        s.percentStats.SR = 150.0 / 400
        s.percentStats.UT = 800.0 / 800
        s.percentStats.ER = None
        s.entered = daysago = datetime.now() - timedelta(4)
        s.enteredBy = "ioscode"
        s.verified = daysago = datetime.now() - timedelta(3)
        s.verifiedBy = "tester"
        s.unavailable = None
        s.unavailableBy = None
        s.maxWaypointConc = None

        # act
        mobileHTML = s.getMobileHTML("", 0, 0)
        normalHTML = s.getHTML(0, "", "", 0, 0)
        rowHTML = s.getRow(False)
        invHTML = s.getInventoryObject()
        spawnJSON = s.getJSON()
        spawnJSON = "{ " + spawnJSON[:-2] + " }"

        #assert
        self.assertIn("ioscode", mobileHTML, "Username not in mobile HTML.")
        self.assertIn("ioscode", normalHTML, "Username not in normal HTML.")
        self.assertIn(spawnName, rowHTML, "No spawn name in row HTML.")
        self.assertIn(spawnName, invHTML, "No spawn name in inventory HTML.")

        try:
            jsonObject = json.loads(spawnJSON)
            jsonValid = True
        except ValueError, e:
            jsonValid = False
예제 #2
0
def getResourceData(conn, resSQL, userReputation, activeUser, formatType):
	# get resource data for given criteria
	resourceHTML = ''
	s = None

	cursor = conn.cursor()
	if (cursor):
		lastValue = None
		cursor.execute(resSQL)
		row = cursor.fetchone()
		if row == None:
			resourceHTML = 'No resources found!'
		while (row != None):
			if s == None:
				if formatType == 'json':
					resourceHTML = '  [\n'
				else:
					resourceHTML = '<table width="100%" class=resourceStats>'

			# populate this resource to object and print it
			s = ghObjects.resourceSpawn()
			s.spawnID = row[0]
			s.spawnName = row[1]
			s.spawnGalaxy = row[2]
			s.resourceType = row[5]
			s.resourceTypeName = row[6]
			s.containerType = row[30]
			s.stats.CR = row[8]
			s.stats.CD = row[9]
			s.stats.DR = row[10]
			s.stats.FL = row[11]
			s.stats.HR = row[12]
			s.stats.MA = row[13]
			s.stats.PE = row[14]
			s.stats.OQ = row[15]
			s.stats.SR = row[16]
			s.stats.UT = row[17]
			s.stats.ER = row[18]

			s.percentStats.CR = row[19]
			s.percentStats.CD = row[20]
			s.percentStats.DR = row[21]
			s.percentStats.FL = row[22]
			s.percentStats.HR = row[23]
			s.percentStats.MA = row[24]
			s.percentStats.PE = row[25]
			s.percentStats.OQ = row[26]
			s.percentStats.SR = row[27]
			s.percentStats.UT = row[28]
			s.percentStats.ER = row[29]

			s.entered = row[3]
			s.enteredBy = row[4]
			s.verified = row[31]
			s.verifiedBy = row[32]
			s.unavailable = row[33]
			s.unavailableBy = row[34]
			s.maxWaypointConc = row[39]
			if row[40] != None:
				s.favorite = 1
				s.despawnAlert = row[41]
			if sort == "quality":
				s.overallScore = row[42]
			s.planets = dbShared.getSpawnPlanets(conn, row[0], False, row[2])

			if formatType == 'json':
				resourceHTML += '    {'
			else:
				resourceHTML += '  <tr><td>'

			if formatType == 'mobile':
				resourceHTML += s.getMobileHTML(activeUser)
			elif formatType == 'compare':
				resourceHTML += s.getHTML(1, '', activeUser, userReputation)
			elif formatType == 'json':
				resourceHTML += s.getJSON()
			else:
				resourceHTML += s.getHTML(0, '', activeUser, userReputation)

			if formatType == 'json':
				resourceHTML += '    }'
			else:
				resourceHTML += '</td></tr>'

			lastValue = row[42]

			row = cursor.fetchone()

			if formatType == 'json':
				resourceHTML += '  ,\n'
			else:
				resourceHTML += '  </table>'

		if fetchSize.isdigit() and cursor.rowcount == int(fetchSize):
			if formatType == 'json':
				resourceHTML += '],\n  "last_value" : ' + str(lastValue)
			else:
				resourceHTML += '<div style="display:none;">maxRowsReached' + str(lastValue) + '</div>'

		cursor.close()
	return resourceHTML
예제 #3
0
def getResource(conn, logged_state, currentUser, spawnID, galaxy, spawnName):
    if logged_state == 1:
        favJoin = ' LEFT JOIN (SELECT itemID, favGroup FROM tFavorites WHERE userID="' + currentUser + '" AND favType=1) favs ON tResources.spawnID = favs.itemID'
        favCols = ', favGroup'
    else:
        favJoin = ''
        favCols = ', NULL'
    if spawnID != None:
        criteriaStr = 'spawnID=' + str(spawnID)
    else:
        criteriaStr = 'galaxy=' + galaxy + ' AND spawnName="' + spawnName + '"'

    try:
        cursor = conn.cursor()
    except Exception:
        errorstr = "Error: could not connect to database"

    if (cursor):
        sqlStr = 'SELECT spawnID, spawnName, galaxy, entered, enteredBy, tResources.resourceType, rt1.resourceTypeName, rt1.resourceGroup,'
        sqlStr += ' CR, CD, DR, FL, HR, MA, PE, OQ, SR, UT, ER,'
        sqlStr += ' CASE WHEN rt1.CRmax > 0 THEN ((CR-rt1.CRmin) / (rt1.CRmax-rt1.CRmin))*100 ELSE NULL END AS CRperc,'
        sqlStr += ' CASE WHEN rt1.CDmax > 0 THEN ((CD-rt1.CDmin) / (rt1.CDmax-rt1.CDmin))*100 ELSE NULL END AS CDperc,'
        sqlStr += ' CASE WHEN rt1.DRmax > 0 THEN ((DR-rt1.DRmin) / (rt1.DRmax-rt1.DRmin))*100 ELSE NULL END AS DRperc,'
        sqlStr += ' CASE WHEN rt1.FLmax > 0 THEN ((FL-rt1.FLmin) / (rt1.FLmax-rt1.FLmin))*100 ELSE NULL END AS FLperc,'
        sqlStr += ' CASE WHEN rt1.HRmax > 0 THEN ((HR-rt1.HRmin) / (rt1.HRmax-rt1.HRmin))*100 ELSE NULL END AS HRperc,'
        sqlStr += ' CASE WHEN rt1.MAmax > 0 THEN ((MA-rt1.MAmin) / (rt1.MAmax-rt1.MAmin))*100 ELSE NULL END AS MAperc,'
        sqlStr += ' CASE WHEN rt1.PEmax > 0 THEN ((PE-rt1.PEmin) / (rt1.PEmax-rt1.PEmin))*100 ELSE NULL END AS PEperc,'
        sqlStr += ' CASE WHEN rt1.OQmax > 0 THEN ((OQ-rt1.OQmin) / (rt1.OQmax-rt1.OQmin))*100 ELSE NULL END AS OQperc,'
        sqlStr += ' CASE WHEN rt1.SRmax > 0 THEN ((SR-rt1.SRmin) / (rt1.SRmax-rt1.SRmin))*100 ELSE NULL END AS SRperc,'
        sqlStr += ' CASE WHEN rt1.UTmax > 0 THEN ((UT-rt1.UTmin) / (rt1.UTmax-rt1.UTmin))*100 ELSE NULL END AS UTperc,'
        sqlStr += ' CASE WHEN rt1.ERmax > 0 THEN ((ER-rt1.ERmin) / (rt1.ERmax-rt1.ERmin))*100 ELSE NULL END AS ERperc,'
        sqlStr += ' rt1.containerType, verified, verifiedBy, unavailable, unavailableBy, rg1.groupName, rt1.resourceCategory, rg2.groupName AS categoryName' + favCols + ', (SELECT GROUP_CONCAT(resourceGroup SEPARATOR ",") FROM tResourceTypeGroup rtg WHERE rtg.resourceType=tResources.resourceType) FROM tResources INNER JOIN tResourceType rt1 ON tResources.resourceType = rt1.resourceType INNER JOIN tResourceGroup rg1 ON rt1.resourceGroup = rg1.resourceGroup INNER JOIN tResourceGroup rg2 ON rt1.resourceCategory = rg2.resourceGroup' + favJoin + ' WHERE ' + criteriaStr + ';'
        cursor.execute(sqlStr)
        row = cursor.fetchone()

        # get resource box if the spawn was found
        if (row != None):
            s = ghObjects.resourceSpawn()
            s.spawnID = row[0]
            s.spawnName = row[1]
            s.spawnGalaxy = row[2]
            s.resourceType = row[5]
            s.resourceTypeName = row[6]
            s.containerType = row[30]
            s.stats.CR = row[8]
            s.stats.CD = row[9]
            s.stats.DR = row[10]
            s.stats.FL = row[11]
            s.stats.HR = row[12]
            s.stats.MA = row[13]
            s.stats.PE = row[14]
            s.stats.OQ = row[15]
            s.stats.SR = row[16]
            s.stats.UT = row[17]
            s.stats.ER = row[18]

            s.percentStats.CR = row[19]
            s.percentStats.CD = row[20]
            s.percentStats.DR = row[21]
            s.percentStats.FL = row[22]
            s.percentStats.HR = row[23]
            s.percentStats.MA = row[24]
            s.percentStats.PE = row[25]
            s.percentStats.OQ = row[26]
            s.percentStats.SR = row[27]
            s.percentStats.UT = row[28]
            s.percentStats.ER = row[29]

            s.entered = row[3]
            s.enteredBy = row[4]
            s.verified = row[31]
            s.verifiedBy = row[32]
            s.unavailable = row[33]
            s.unavailableBy = row[34]
            if row[38] != None:
                s.favorite = 1
            if row[39] != None:
                s.groupList = ',' + row[39] + ','
            s.planets = dbShared.getSpawnPlanets(conn, row[0], True, row[2])
        else:
            s = None

        cursor.close()

    return s
def getResourceData(conn, resSQL, logged_state, galaxyState, resourceFormat,
                    reputation):
    # get resource data for given criteria
    resourceHTML = '<table width="100%" class=resourceStats>'
    cursor = conn.cursor()

    if (cursor):
        cursor.execute(resSQL)
        row = cursor.fetchone()
        # check first row to see if all quality stats do not belong to resource type
        if (row != None):
            if (row[35] == 0):
                resourceHTML += '<tr><td>Stats do not matter</td></tr>'
            else:
                # print resource rows if stats matter
                while (row != None):
                    s = ghObjects.resourceSpawn()
                    s.spawnID = row[0]
                    s.spawnName = row[1]
                    s.spawnGalaxy = row[2]
                    s.resourceType = row[5]
                    s.resourceTypeName = row[6]
                    s.containerType = row[30]
                    s.stats.CR = row[8]
                    s.stats.CD = row[9]
                    s.stats.DR = row[10]
                    s.stats.FL = row[11]
                    s.stats.HR = row[12]
                    s.stats.MA = row[13]
                    s.stats.PE = row[14]
                    s.stats.OQ = row[15]
                    s.stats.SR = row[16]
                    s.stats.UT = row[17]
                    s.stats.ER = row[18]

                    s.percentStats.CR = row[19]
                    s.percentStats.CD = row[20]
                    s.percentStats.DR = row[21]
                    s.percentStats.FL = row[22]
                    s.percentStats.HR = row[23]
                    s.percentStats.MA = row[24]
                    s.percentStats.PE = row[25]
                    s.percentStats.OQ = row[26]
                    s.percentStats.SR = row[27]
                    s.percentStats.UT = row[28]
                    s.percentStats.ER = row[29]

                    s.entered = row[3]
                    s.enteredBy = row[4]
                    s.verified = row[31]
                    s.verifiedBy = row[32]
                    s.unavailable = row[33]
                    s.unavailableBy = row[34]
                    if row[36] != None:
                        s.favorite = 1
                    if row[37] != None:
                        s.overallScore = row[37] * 1000
                    s.planets = dbShared.getSpawnPlanets(
                        conn, row[0], True, row[2])

                    resourceHTML += '  <tr><td>'
                    if logged_state > 0 and galaxyState == 1:
                        controlsUser = currentUser
                    else:
                        controlsUser = ''
                    resourceHTML += s.getHTML(
                        resourceFormat, "", controlsUser, reputation,
                        dbShared.getUserAdmin(conn, currentUser, galaxy))
                    resourceHTML += '  </td></tr>'
                    row = cursor.fetchone()
        else:
            resourceHTML += '<tr><td>Not Available</td></tr>'
        cursor.close()
    resourceHTML += '</table>'
    return resourceHTML
예제 #5
0
 sqlStr1 += ' CASE WHEN CRmax > 0 THEN (((CASE WHEN CR IS NULL THEN 0 ELSE CR END)-CRmin) / (CRmax-CRmin))*100 ELSE NULL END AS CRperc,'
 sqlStr1 += ' CASE WHEN CDmax > 0 THEN (((CASE WHEN CD IS NULL THEN 0 ELSE CD END)-CDmin) / (CDmax-CDmin))*100 ELSE NULL END AS CDperc,'
 sqlStr1 += ' CASE WHEN DRmax > 0 THEN (((CASE WHEN DR IS NULL THEN 0 ELSE DR END)-DRmin) / (DRmax-DRmin))*100 ELSE NULL END AS DRperc,'
 sqlStr1 += ' CASE WHEN FLmax > 0 THEN (((CASE WHEN FL IS NULL THEN 0 ELSE FL END)-FLmin) / (FLmax-FLmin))*100 ELSE NULL END AS FLperc,'
 sqlStr1 += ' CASE WHEN HRmax > 0 THEN (((CASE WHEN HR IS NULL THEN 0 ELSE HR END)-HRmin) / (HRmax-HRmin))*100 ELSE NULL END AS HRperc,'
 sqlStr1 += ' CASE WHEN MAmax > 0 THEN (((CASE WHEN MA IS NULL THEN 0 ELSE MA END)-MAmin) / (MAmax-MAmin))*100 ELSE NULL END AS MAperc,'
 sqlStr1 += ' CASE WHEN PEmax > 0 THEN (((CASE WHEN PE IS NULL THEN 0 ELSE PE END)-PEmin) / (PEmax-PEmin))*100 ELSE NULL END AS PEperc,'
 sqlStr1 += ' CASE WHEN OQmax > 0 THEN (((CASE WHEN OQ IS NULL THEN 0 ELSE OQ END)-OQmin) / (CASE WHEN OQmax-OQmin < 1 THEN 1 ELSE OQmax-OQmin END))*100 ELSE NULL END AS OQperc,'
 sqlStr1 += ' CASE WHEN SRmax > 0 THEN (((CASE WHEN SR IS NULL THEN 0 ELSE SR END)-SRmin) / (SRmax-SRmin))*100 ELSE NULL END AS SRperc,'
 sqlStr1 += ' CASE WHEN UTmax > 0 THEN (((CASE WHEN UT IS NULL THEN 0 ELSE UT END)-UTmin) / (UTmax-UTmin))*100 ELSE NULL END AS UTperc,'
 sqlStr1 += ' CASE WHEN ERmax > 0 THEN (((CASE WHEN ER IS NULL THEN 0 ELSE ER END)-ERmin) / (ERmax-ERmin))*100 ELSE NULL END AS ERperc,'
 sqlStr1 += ' containerType, verified, verifiedBy, unavailable, unavailableBy' + favCols + ' FROM tResources INNER JOIN tResourceType ON tResources.resourceType = tResourceType.resourceType' + favJoin + ' WHERE galaxy=' + galaxy + ' AND unavailable IS NULL ORDER BY entered DESC LIMIT 5;'
 cursor.execute(sqlStr1)
 row = cursor.fetchone()
 while (row != None):
     s = ghObjects.resourceSpawn()
     s.spawnID = row[0]
     s.spawnName = row[1]
     s.spawnGalaxy = row[2]
     s.resourceType = row[5]
     s.resourceTypeName = row[6]
     s.containerType = row[30]
     s.stats.CR = row[8]
     s.stats.CD = row[9]
     s.stats.DR = row[10]
     s.stats.FL = row[11]
     s.stats.HR = row[12]
     s.stats.MA = row[13]
     s.stats.PE = row[14]
     s.stats.OQ = row[15]
     s.stats.SR = row[16]
예제 #6
0
def getResource(conn, logged_state, currentUser, spawnID, galaxy, spawnName):
	if logged_state == 1:
		favJoin = ' LEFT JOIN (SELECT itemID, favGroup FROM tFavorites WHERE userID="' + currentUser + '" AND favType=1) favs ON tResources.spawnID = favs.itemID'
		favCols = ', favGroup'
	else:
		favJoin = ''
		favCols = ', NULL'
	if spawnID != None:
		criteriaStr = 'spawnID=' + str(spawnID)
	else:
		criteriaStr = 'galaxy=' + galaxy + ' AND spawnName="' + spawnName + '"'

	try:
		cursor = conn.cursor()
	except Exception:
		errorstr = "Error: could not connect to database"

	if (cursor):
		sqlStr = 'SELECT spawnID, spawnName, galaxy, entered, enteredBy, tResources.resourceType, rt1.resourceTypeName, rt1.resourceGroup,'
		sqlStr += ' CR, CD, DR, FL, HR, MA, PE, OQ, SR, UT, ER,'
		sqlStr += ' CASE WHEN rt1.CRmax > 0 THEN ((CR-rt1.CRmin) / (rt1.CRmax-rt1.CRmin))*100 ELSE NULL END AS CRperc, CASE WHEN rt1.CDmax > 0 THEN ((CD-rt1.CDmin) / (rt1.CDmax-rt1.CDmin))*100 ELSE NULL END AS CDperc, CASE WHEN rt1.DRmax > 0 THEN ((DR-rt1.DRmin) / (rt1.DRmax-rt1.DRmin))*100 ELSE NULL END AS DRperc, CASE WHEN rt1.FLmax > 0 THEN ((FL-rt1.FLmin) / (rt1.FLmax-rt1.FLmin))*100 ELSE NULL END AS FLperc, CASE WHEN rt1.HRmax > 0 THEN ((HR-rt1.HRmin) / (rt1.HRmax-rt1.HRmin))*100 ELSE NULL END AS HRperc, CASE WHEN rt1.MAmax > 0 THEN ((MA-rt1.MAmin) / (rt1.MAmax-rt1.MAmin))*100 ELSE NULL END AS MAperc, CASE WHEN rt1.PEmax > 0 THEN ((PE-rt1.PEmin) / (rt1.PEmax-rt1.PEmin))*100 ELSE NULL END AS PEperc, CASE WHEN rt1.OQmax > 0 THEN ((OQ-rt1.OQmin) / (rt1.OQmax-rt1.OQmin))*100 ELSE NULL END AS OQperc, CASE WHEN rt1.SRmax > 0 THEN ((SR-rt1.SRmin) / (rt1.SRmax-rt1.SRmin))*100 ELSE NULL END AS SRperc, CASE WHEN rt1.UTmax > 0 THEN ((UT-rt1.UTmin) / (rt1.UTmax-rt1.UTmin))*100 ELSE NULL END AS UTperc, CASE WHEN rt1.ERmax > 0 THEN ((ER-rt1.ERmin) / (rt1.ERmax-rt1.ERmin))*100 ELSE NULL END AS ERperc,'
		sqlStr += ' rt1.containerType, verified, verifiedBy, unavailable, unavailableBy, rg1.groupName, rt1.resourceCategory, rg2.groupName AS categoryName' + favCols + ', (SELECT GROUP_CONCAT(resourceGroup SEPARATOR ",") FROM tResourceTypeGroup rtg WHERE rtg.resourceType=tResources.resourceType) FROM tResources INNER JOIN tResourceType rt1 ON tResources.resourceType = rt1.resourceType INNER JOIN tResourceGroup rg1 ON rt1.resourceGroup = rg1.resourceGroup INNER JOIN tResourceGroup rg2 ON rt1.resourceCategory = rg2.resourceGroup' + favJoin + ' WHERE ' + criteriaStr + ';'
		cursor.execute(sqlStr)
		row = cursor.fetchone()

		# get resource box if the spawn was found
		if (row != None):
			s = ghObjects.resourceSpawn()
			s.spawnID = row[0]
			s.spawnName = row[1]
			s.spawnGalaxy = row[2]
			s.resourceType = row[5]
			s.resourceTypeName = row[6]
			s.containerType = row[30]
			s.stats.CR = row[8]
			s.stats.CD = row[9]
			s.stats.DR = row[10]
			s.stats.FL = row[11]
			s.stats.HR = row[12]
			s.stats.MA = row[13]
			s.stats.PE = row[14]
			s.stats.OQ = row[15]
			s.stats.SR = row[16]
			s.stats.UT = row[17]
			s.stats.ER = row[18]
		
			s.percentStats.CR = row[19]
			s.percentStats.CD = row[20]
			s.percentStats.DR = row[21]
			s.percentStats.FL = row[22]
			s.percentStats.HR = row[23]
			s.percentStats.MA = row[24]
			s.percentStats.PE = row[25]
			s.percentStats.OQ = row[26]
			s.percentStats.SR = row[27]
			s.percentStats.UT = row[28]
			s.percentStats.ER = row[29]

			s.entered = row[3]
			s.enteredBy = row[4]
			s.verified = row[31]
			s.verifiedBy = row[32]
			s.unavailable = row[33]
			s.unavailableBy = row[34]
			if row[38] != None:
				s.favorite = 1
			s.groupList = ',' + row[39] + ','
			s.planets = dbShared.getSpawnPlanets(conn, row[0], True)
		else:
			s = None

		cursor.close()

	return s
예제 #7
0
						currentLevel = i+1
					if currentGroups[i] != typeGroups[i]:
						print '<tr><td><div class="surveyGroup" style="margin-left:' + str(i * 16) + 'px;"><a href="' + ghShared.BASE_SCRIPT_URL + 'resourceType.py/' + typeGroups[i][:typeGroups[i].find('|')] + '" title="View schematics and recent spawns of this type" class="nameLink" style="color:#999999;">' + typeGroups[i][typeGroups[i].find('|')+1:] + '</a></div></td></tr>'
				currentGroups = typeGroups
				if currentType != row[5]:
					print '<tr><td><div class="surveyGroup" style="margin-left:' + str(currentLevel * 16) + 'px;"><a href="' + ghShared.BASE_SCRIPT_URL + 'resourceType.py/' + row[5] + '" title="View schematics and recent spawns of this type" class="nameLink" style="color:#999999;">' + row[6] + '</a></div></td></tr>'
					currentType = row[5]
				resBoxMargin = str((currentLevel+2) * 16) + 'px'
			# no grouping for others
			else:
				if s == None:
					print '<table width="100%" class=resourceStats>'


			# populate this resource to object and print it
			s = ghObjects.resourceSpawn()
			s.spawnID = row[0]
			s.spawnName = row[1]
			s.spawnGalaxy = row[2]
			s.resourceType = row[5]
			s.resourceTypeName = row[6]
			s.containerType = row[30]
			s.stats.CR = row[8]
			s.stats.CD = row[9]
			s.stats.DR = row[10]
			s.stats.FL = row[11]
			s.stats.HR = row[12]
			s.stats.MA = row[13]
			s.stats.PE = row[14]
			s.stats.OQ = row[15]
			s.stats.SR = row[16]
예제 #8
0
def getResourceData(conn, resSQL, editable, galaxyState, formatType):
	# get resource data for given criteria
	resourceHTML = ''
	s = None
	sys.stderr.write(resSQL)
	cursor = conn.cursor()
	if (cursor):
		lastValue = None
		cursor.execute(resSQL)
		row = cursor.fetchone()
		if row == None:
			resourceHTML = 'No resources found!'
		while (row != None):
			if s == None:
				resourceHTML = '<table width="100%" class=resourceStats>'

			# populate this resource to object and print it
			s = ghObjects.resourceSpawn()
			s.spawnID = row[0]
			s.spawnName = row[1]
			s.spawnGalaxy = row[2]
			s.resourceType = row[5]
			s.resourceTypeName = row[6]
			s.containerType = row[30]
			s.stats.CR = row[8]
			s.stats.CD = row[9]
			s.stats.DR = row[10]
			s.stats.FL = row[11]
			s.stats.HR = row[12]
			s.stats.MA = row[13]
			s.stats.PE = row[14]
			s.stats.OQ = row[15]
			s.stats.SR = row[16]
			s.stats.UT = row[17]
			s.stats.ER = row[18]
		
			s.percentStats.CR = row[19]
			s.percentStats.CD = row[20]
			s.percentStats.DR = row[21]
			s.percentStats.FL = row[22]
			s.percentStats.HR = row[23]
			s.percentStats.MA = row[24]
			s.percentStats.PE = row[25]
			s.percentStats.OQ = row[26]
			s.percentStats.SR = row[27]
			s.percentStats.UT = row[28]
			s.percentStats.ER = row[29]

			s.entered = row[3]
			s.enteredBy = row[4]
			s.verified = row[31]
			s.verifiedBy = row[32]
			s.unavailable = row[33]
			s.unavailableBy = row[34]
			s.maxWaypointConc = row[39]
			if row[40] != None:
				s.favorite = 1
			s.overallScore = row[41]
			s.planets = dbShared.getSpawnPlanets(conn, row[0], False)

			resourceHTML += '  <tr><td>'

			if formatType == 'mobile':
				resourceHTML += s.getMobileHTML(editable)
			elif formatType == 'compare':
				resourceHTML += s.getHTML(editable, 1, '')
			else:
				resourceHTML += s.getHTML(editable, 0, '')

			resourceHTML += '</td></tr>'
			
			lastValue = row[41]
				
			row = cursor.fetchone()
		
		resourceHTML += '  </table>'
		if cursor.rowcount == ROW_LIMIT:
			resourceHTML += '<div style="display:none;">maxRowsReached' + str(lastValue) + '</div>'
			
		cursor.close()
	return resourceHTML
def getResourceData(conn, resSQL, logged_state, galaxyState, resourceFormat):
	# get resource data for given criteria
	resourceHTML = '<table width="100%" class=resourceStats>'
	cursor = conn.cursor()
	if (cursor):
		cursor.execute(resSQL)
		row = cursor.fetchone()
		# check first row to see if all quality stats do not belong to resource type
		if (row != None):
			if (row[35] == 0):
				resourceHTML += '<tr><td>Stats do not matter</td></tr>'
			else:
				# print resource rows if stats matter
				while (row != None):
					s = ghObjects.resourceSpawn()
					s.spawnID = row[0]
					s.spawnName = row[1]
					s.spawnGalaxy = row[2]
					s.resourceType = row[5]
					s.resourceTypeName = row[6]
					s.containerType = row[30]
					s.stats.CR = row[8]
					s.stats.CD = row[9]
					s.stats.DR = row[10]
					s.stats.FL = row[11]
					s.stats.HR = row[12]
					s.stats.MA = row[13]
					s.stats.PE = row[14]
					s.stats.OQ = row[15]
					s.stats.SR = row[16]
					s.stats.UT = row[17]
					s.stats.ER = row[18]
		
					s.percentStats.CR = row[19]
					s.percentStats.CD = row[20]
					s.percentStats.DR = row[21]
					s.percentStats.FL = row[22]
					s.percentStats.HR = row[23]
					s.percentStats.MA = row[24]
					s.percentStats.PE = row[25]
					s.percentStats.OQ = row[26]
					s.percentStats.SR = row[27]
					s.percentStats.UT = row[28]
					s.percentStats.ER = row[29]

					s.entered = row[3]
					s.enteredBy = row[4]
					s.verified = row[31]
					s.verifiedBy = row[32]
					s.unavailable = row[33]
					s.unavailableBy = row[34]
					if row[36] != None:
						s.favorite = 1
					s.overallScore = row[37]*1000
					s.planets = dbShared.getSpawnPlanets(conn, row[0], True)

					resourceHTML += '  <tr><td>'
					if galaxyState == 1:
						resourceHTML += s.getHTML(logged_state, resourceFormat, "")
					else:
						rsourceHTML += s.getHTML(0, resourceFormat, "")
					resourceHTML += '  </td></tr>'
					row = cursor.fetchone()
		else:
			resourceHTML += '<tr><td>Not Available</td></tr>'
		cursor.close()
	resourceHTML += '</table>'
	return resourceHTML
def main():
    # Get current url
    try:
        url = os.environ['SCRIPT_NAME']
    except KeyError:
        url = ''

    form = cgi.FieldStorage()
    # Get Cookies
    useCookies = 1
    cookies = Cookie.SimpleCookie()
    try:
        cookies.load(os.environ['HTTP_COOKIE'])
    except KeyError:
        useCookies = 0

    if useCookies:
        try:
            currentUser = cookies['userID'].value
        except KeyError:
            currentUser = ''
        try:
            loginResult = cookies['loginAttempt'].value
        except KeyError:
            loginResult = 'success'
        try:
            sid = cookies['gh_sid'].value
        except KeyError:
            sid = form.getfirst('gh_sid', '')
    else:
        currentUser = ''
        loginResult = 'success'
        sid = form.getfirst('gh_sid', '')

    errstr = ''

    if not form.has_key("reportFile"):
        errstr = "No report file sent."
    else:
        rpt_data = form["reportFile"]
        if not rpt_data.file: errstr = "report data is not a file."

    src_url = form.getfirst('src_url', '/surveyList.py')
    galaxyID = form.getfirst('reportGalaxy', '')
    dataAction = form.getfirst('dataAction', '')
    # escape input to prevent sql injection
    sid = dbShared.dbInsertSafe(sid)
    galaxyID = dbShared.dbInsertSafe(galaxyID)

    # Get a session
    logged_state = 0
    linkappend = ''

    sess = dbSession.getSession(sid)
    if (sess != ''):
        logged_state = 1
        currentUser = sess
        if (useCookies == 0):
            linkappend = 'gh_sid=' + sid

    #  Check for errors
    if not galaxyID.isdigit():
        errstr = errstr + "Galaxy ID must be a valid number. \r\n"
    if errstr == '':
        rptName = rpt_data.filename
    if (logged_state == 0):
        errstr = errstr + "You must be logged in to post resources. \r\n"

    if (errstr != ''):
        result = "Your report could not be posted because of the following errors:\r\n" + errstr
    else:
        result = ''
        isNGE = False

        # process file
        thisSpawn = ghObjects.resourceSpawn()
        resourcesFound = []
        planetID = 0
        classID = ''
        headerMatch = None
        planetMatch = None
        classMatch = None
        resourceStart = None
        typeMatch = None
        nameMatch = None
        statMatch = None
        conn = dbShared.ghConn()
        cursor = conn.cursor()
        if (cursor):
            cursor.execute(
                'SELECT galaxyNGE FROM tGalaxy WHERE galaxyID={0};'.format(
                    str(galaxyID)))
            row = cursor.fetchone()
            if (row != None) and (row[0] > 0):
                isNGE = True
            cursor.close()
        # NGE version of droid report has different format with more indent and group levels
        if isNGE:
            typePattern = ' +([a-zA-Z][a-zA-Z0-9\- ]+)'
            namePattern = ' +\\\#pcontrast1 (\w+)\\\#'
        else:
            typePattern = '\t([a-zA-Z0-9\- ]+)'
            namePattern = '\t\t\\\#pcontrast1 (\w+)\\\#'

        while 1:
            line = rpt_data.file.readline()
            if not line: break
            if headerMatch == None and (planetMatch == None
                                        or classMatch == None):
                headerMatch = re.match("Interplanetary Survey: (\w+) - (\w+)",
                                       line)
                planetMatch = re.match(
                    "\\\#pcontrast\d\sPlanet: \\\#pcontrast\d\s(.+)", line)
                classMatch = re.match(
                    "\\\#pcontrast\d\sResource Class: \\\#pcontrast\d\s(.+)",
                    line)
            else:
                if resourceStart == None:
                    resourceStart = re.match(
                        "\\\#pcontrast\d\sResources located.*", line)
                else:
                    typeMatch = re.match(typePattern, line)
                    nameMatch = re.match(namePattern, line)
                    if typeMatch:
                        thisType = dbShared.getResourceTypeID(
                            conn, typeMatch.group(1))
                        thisTypeName = typeMatch.group(1)
                    if nameMatch:
                        if thisSpawn.spawnName != '':
                            resourcesFound.append(thisSpawn)
                        thisName = nameMatch.group(1)
                        thisSpawn = ghObjects.resourceSpawn()
                        thisSpawn.spawnName = thisName.lower()
                        thisSpawn.resourceType = thisType
                        thisSpawn.resourceTypeName = thisTypeName
                    # Check for resource stats from enhanced droid reports
                    statMatch = re.match(
                        "\t\t\t(ER|CR|CD|DR|FL|HR|MA|PE|OQ|SR|UT): (\d+)",
                        line)
                    if statMatch:
                        setattr(thisSpawn.stats, statMatch.group(1),
                                int(statMatch.group(2)))

        conn.close()

        if thisSpawn.spawnName != '':
            resourcesFound.append(thisSpawn)

        # Update planet data if valid results
        if headerMatch:
            planetID = dbShared.getPlanetID(headerMatch.group(1))
            classID = headerMatch.group(2).lower()
        elif planetMatch:
            planetID = dbShared.getPlanetID(planetMatch.group(1))
        else:
            result = "Error: No planet found in file header."
        if classMatch:
            classID = classMatch.group(1).lower()

        if planetID > 0:
            if dataAction == 'returnJSON':
                result = getSpawnsJSON(
                    planetID,
                    resourcesFound, "{0} spawns loaded from report".format(
                        len(resourcesFound)))
            else:
                result = updatePlanetSpawns(planetID, classID, resourcesFound,
                                            galaxyID, currentUser)
        else:
            result = "Error: Could not determine planet from file header."

    if dataAction == 'returnJSON':
        # add resources page uses json data to populate grid
        print "Content-Type: text/json\n"
        print result
    else:
        # survey list page will load result message from cookie after redirect
        if useCookies:
            cookies['surveyReportAttempt'] = result
            cookies['surveyReportAttempt']['max-age'] = 60
            print cookies
        else:
            linkappend = linkappend + '&surveyReportAttempt=' + urllib.quote(
                result)

        print "Content-Type: text/html\n"
        if src_url != None:
            print '<html><head><script type=text/javascript>document.location.href="' + src_url + linkappend + '"</script></head><body></body></html>'
        else:
            print result

    if result.find("Error:") > -1:
        sys.exit(500)
    else:
        sys.exit(200)