def modifyCampaign(self, idCampaign, columna, inputUser): c = Connector.retornarCampaignBD(idCampaign) if c == []: return 404 #No existe if c.isActive(): return 412 #Campaign activa #Campaign NO esta activa: wasModified = Connector.modificarCampaignBD(idCampaign, columna, inputUser) if wasModified: return 200 #OK return 400 #Columna inexistente
def deleteCampaignporid(self, idCampaign): #Se puede eliminar la campaña sólo si esta NO está iniciada: campaignRetornada = Connector.retornarCampaignBD(idCampaign) if campaignRetornada == []: return 404 if campaignRetornada.isActive(): return 412 else: Connector.eliminarTweetsxIDC(idCampaign) Connector.eliminarCampaignBDxID(idCampaign) return 200
def reportRawData(self, idC): #OK campaign = Connector.retornarCampaignBD( idC ) #Objeto campaign, NO desempaquetamos el JSON, esto lo hace directamente flask. tweets = Connector.returnTweetsByIDC( idC) #Busca tweets de determinada campaña if (campaign == [] or tweets == []): #Revisa que exista campaña con esa ID return 404 if (campaign.finDate > datetime.now()): #la campana no finalizo aun return 412 rawData = {"campaign": campaign.to_dict(), "tweets": tweets} return (rawData)
def returnCampaignsInProgress(self): #Obtenemos TODAS las Campañas y vemos una por una si la fecha de inicio de campaign es MENOR a #la fecha actual y la fecha de fin de la campaña es MAYOR a la fecha actual. Y si sucede esto la agregamos a una nueva lista. listaCampaigns = configTables.session.query( configTables.Campaign).all() print(listaCampaigns) listaNuevaCampaigns = [] for c in listaCampaigns: #Cada c es un: <Campaign(idC='1', startDate='28 11 2018 18:02:00', finDate='02 12 2018 19:26:22', email='*****@*****.**', hashtags='#test-#mock', mentions='@testCampaign-@mockOK')> #Y accedo a los atributos con c.atributo (el atributo está en la tabla Campaign dentro de configTables), osea asi: print (c.id) idCampaign = c.id print(idCampaign) campaignRetornada = Connector.retornarCampaignBD(idCampaign) fecha_inicio_campaign = campaignRetornada.startDate fecha_fin_campaign = campaignRetornada.finDate fecha_actual = datetime.now() if ( (fecha_inicio_campaign < fecha_actual) and (fecha_fin_campaign > fecha_actual) ): #La campaña está en curso. Agrego la campaña a la nueva lista a devolver. listaNuevaCampaigns.append(c) #Si la campaña no inició no hago nada. return ( listaNuevaCampaigns ) #Devolvemos la lista de campañas en curso (que todavía no finalizaron)
def deleteCampaignporuser(self, email_user): campaigns = Connector.retornarCampaignsBDxEmail(email_user) if campaigns == []: #No hubo campaigns con ese e-mail return 404 haveDeleted = False #flag for c in campaigns: if not c.isActive(): Connector.eliminarTweetsxIDC(c.idC) Connector.eliminarCampaignBDxID(c.idC) haveDeleted = True if haveDeleted: #Borro una o mas campaigns return 200 else: return 412 #No borro nada porque todas estaban activas
def insertCampaign(self, userInputs): #Con los nombres de los campos correspondientes a los del json que nos llegan armamos un objeto campaña. #Pero antes de esto como fields["hashtags"] y fields["mentions"] son LISTAS, tenemos que pasarlas a un string para poder añadirlo a la BD como un varchar: stringHashtag = self.listaAString(userInputs["hashtags"]) # #donaldTrump-#G20 stringMention = self.listaAString(userInputs["mentions"]) # @donaldTrump-@miauricioOK ObjetoCampaign = Campaign(1, userInputs["email"], stringHashtag, stringMention, userInputs["startDate"], userInputs["endDate"]) #Llamamos a un metodo de Connector para agregar la campaña a la BD junto con las mentions y los hashtags: return Connector.insertarCampaignBD(ObjetoCampaign)
def test_InsertTweets(self): #Precondición: deben haber 3 campañas creadas e insertadas en la BD. configTables.BD.metadata.create_all( configTables.engine ) #Se crea la BD (en caso que ya está creada no hace nada) userInputs = '{"email":"*****@*****.**","hashtags": ["#test", "#mock"], "mentions": ["@testCampaign", "@mockOK"], "startDate":"28 11 2018 18:02:00", "endDate":"25 12 2018 19:26:22"}' fields = json.loads( userInputs ) #Pasa de json a diccionario, esto lo hace flask por eso no hace falta hacerlo en el insertCampaign() del manager. #Insertamos 3 campañas en la BD: manager.Manager().insertCampaign(fields) manager.Manager().insertCampaign(fields) id3erCampaign = manager.Manager().insertCampaign(fields) #Ejemplo de los lista de diccionario de tweets en formato JSON que el Fetcher le manda a Manager (tweetsJson). self.tweet1 = { "id_str": "12366", "user": { "name": "NASAOk", "id_str": "789456" }, "entities": { "hashtags": ["#mars", "#venus", "#earth"], "user_mentions": ["@NASA", "@planets"] }, "created_at": "Sun Mar 20 15:11:01 +0000 2018" } self.tweet2 = { "id_str": "12477", "user": { "name": "MiauricioOK", "id_str": "451325" }, "entities": { "hashtags": ["#DonaldNoMeDejes"], "user_mentions": ["@donaldTrump", "@G20"] }, "created_at": "Sun Mar 20 21:08:01 +0000 2018" } tweetsJson = [json.dumps(self.tweet1), json.dumps(self.tweet2)] #Insertamos 2 tweets en la 3er campaign. manager.Manager().insertTweets(tweetsJson, id3erCampaign) #Obtengo el 2do Tweet: tweetRetornado = Connector.returnTweetByIDT("12477") #Asserto los datos del 2do Tweet: print(tweetRetornado.ID) self.assertEqual(tweetRetornado.ID, "12477") self.assertEqual(tweetRetornado.userName, "MiauricioOK") self.assertEqual(tweetRetornado.userid, "451325") self.assertEqual(tweetRetornado.hashtags, "#DonaldNoMeDejes") self.assertEqual(tweetRetornado.mentions, "@donaldTrump-@G20") self.assertEqual(tweetRetornado.date, "Sun Mar 20 21:08:01 +0000 2018")
def reportSummary(self, idC): #OK campaign = Connector.retornarCampaignBD( idC ) #Objeto campaign, NO desempaquetamos el JSON, esto lo hace directamente flask. tweets = Connector.returnTweetsByIDC(idC) #Lista de diccionarios tweet if (campaign == [] or tweets == []): #Revisa que exista campaña con esa ID return 404 if (campaign.finDate > datetime.now()): #la campana no finalizo aun return 412 summary = { "campaign": campaign.to_dict( ), #como diccionario para que se pueda acceder a los campos mas facil "cant_tweets": len(tweets), "moreTwUser": self.getUserWithMoreTw(tweets), #Autor con mas tweets "userQuantity": self.getUserQuantity(tweets), #Cantidad diferente de usuarios } return (summary)
def test_InsertCampaign(self): #Entrada de ejemplo, lo que el usuario ingresa en la Interfaz Web en Alta Campaña (en formato JSON llegaria): userInputs = '{"email":"*****@*****.**","hashtags": ["#test", "#mock"], "mentions": ["@testCampaign", "@mockOK"], "startDate":"28 11 2018 18:02:00", "endDate":"25 12 2018 19:26:22"}' fields = json.loads( userInputs ) #Pasa de json a diccionario, esto lo hace flask por eso no hace falta hacerlo en el insertCampaign() del manager. idCampaign = manager.Manager().insertCampaign(fields) campaignRetornada = Connector.retornarCampaignBD(idCampaign) #Asserto todos los atributos del objeto Campaign: self.assertEqual(campaignRetornada.emailDueño, "*****@*****.**") self.assertEqual(campaignRetornada.hashtags, "#test-#mock") self.assertEqual(campaignRetornada.mentions, "@testCampaign-@mockOK") self.assertEqual(campaignRetornada.startDate, datetime(2018, 11, 28, 18, 2)) self.assertEqual(campaignRetornada.finDate, datetime(2018, 12, 25, 19, 26, 22))
def test_ModifyCampaign(self): #Precondicion: tener 2 campaigns en la BD. userInputs = '{"email":"*****@*****.**","hashtags": ["#test", "#mock"], "mentions": ["@testCampaign", "@mockOK"], "startDate":"18 12 2018 18:02:00", "endDate":"02 12 2018 19:26:22"}' fields = json.loads( userInputs ) #Pasa de json a diccionario, esto lo hace flask por eso no hace falta hacerlo en el insertCampaign() del manager. #Creamos e insertamos 2 campaign: manager.Manager().insertCampaign(fields) id2daCampaign = manager.Manager().insertCampaign(fields) #Datos que ingresara el usuario (además de la id2daCampaign): columna = "email" inputUser = "******" manager.Manager().modifyCampaign(id2daCampaign, columna, inputUser) campaignRetornada = Connector.retornarCampaignBD(id2daCampaign) #Si imprimo (campaignRetornada.startDate) me imprime: 2018-11-28 18:02:00. #Pero si lo retorno es este tipo de dato--> datetime.datetime(2018, 11, 28, 18, 2) self.assertEqual(campaignRetornada.emailDueño, "*****@*****.**")
def returnCampaign(self, idCampaign): return Connector.retornarCampaignBD(idCampaign)
def insertTweet(self, TweetInput, idC): Connector.insertTweet(TweetInput, idC)
def test_ReturnTweetsByIDC(self): #Retornamos los tuits con IDC 3 (de la 3ra campaña) tweets = Connector.returnTweetsByIDC(3) print(tweets)
def test_ReturnCampaignBD(self): #Le pasamos la ID de Campaign 2 objetoCampaign = Connector.retornarCampaignBD(2) print(objetoCampaign)