replace source with clients

activity_mapper
Clemens Klug 2018-03-14 18:03:13 +01:00
parent 2c8eea0e6f
commit d9fa60dfe5
6 changed files with 13 additions and 115 deletions

View File

@ -1,12 +1,12 @@
import json import json
import sys import sys
from analysis.sources import SOURCES from clients.webclients import CLIENTS
def load_source(config): def load_source(config):
if config["type"] in SOURCES: if config["type"] in CLIENTS:
source = SOURCES[config["type"]]() source = CLIENTS[config["type"]](**config)
source.connect(**config) source.login()
return source return source

View File

@ -1,5 +0,0 @@
from .biogames import Biogames
SOURCES = {
"Biogames": Biogames,
}

View File

@ -1,85 +0,0 @@
import json
import logging
import typing
from tempfile import TemporaryDirectory
import os
from sources.source import Source
import shutil
import requests
log: logging.Logger = logging.getLogger(__name__)
class Biogames(Source):
def __init__(self):
self.headers: typing.Dict[str, str] = {'Accept': 'application/json'}
self.cookies: typing.Dict[str, str] = {}
self.id2link: typing.Dict[str, str] = {}
self.host: str = None
def connect(self, **kwargs):
for i in ['username', 'password', 'url', 'login_url', 'host']:
if not i in kwargs:
raise ValueError("missing value " + i)
csrf_request = requests.get(kwargs['url'])
if csrf_request.status_code != 200:
raise ConnectionError("unable to obtain CSRF token (" + str(csrf_request) + ")", csrf_request.url)
self.cookies['csrftoken'] = csrf_request.cookies['csrftoken']
log.info("obtained CSRF token (" + self.cookies['csrftoken'] + ")")
login_payload = {
'username': kwargs['username'],
'password': kwargs['password'],
'next': '',
'csrfmiddlewaretoken': 'csrftoken'
}
login = requests.post(kwargs['login_url'], data=json.dumps(login_payload), cookies=self.cookies)
if login.status_code != 200:
raise ConnectionError("Unable to authenticate!", login, login.text)
self.cookies['sessionid'] = login.cookies['sessionid']
log.info("obtained sessionid (" + self.cookies['sessionid'] + ")")
self.url = kwargs['url']
self.host = kwargs['host']
log.info("stored url (" + self.url + ")")
def list(self):
logs = self.get_json(self.url)
log.info(len(logs))
for i in logs:
self.id2link[i["id"]] = i["link"] # TODO
return logs
def get(self, ids: typing.Collection):
dir = TemporaryDirectory()
files = []
for i in ids:
url = self.id2link[i]
filename = os.path.join(dir.name, url.split("/")[-1])
file = self.download_file(url, filename)
if file:
files.append(file)
return dir
def download_file(self, url, filename):
with open(filename, "wb") as out:
try:
download = self._get(url)
shutil.copyfileobj(download.raw, out)
return filename
except Exception as e:
log.exception(e)
os.remove(filename)
def get_json(self, url):
http = self._get(url, stream=False)
if not http.ok:
raise ConnectionError("HTTP status is not OK", http.url)
return http.json()
def close(self):
pass
def _get(self, url, stream=True):
return requests.get(self.host + url, cookies=self.cookies, headers=self.headers, stream=stream)

View File

@ -1,18 +0,0 @@
import typing
class Source:
def connect(self, **kwargs):
raise NotImplementedError
def list(self):
raise NotImplementedError
def get(self, ids: typing.Collection):
raise NotImplementedError
def get_json(self, url:str) -> dict:
raise NotImplementedError
def close(self):
raise NotImplementedError

View File

@ -18,7 +18,7 @@ def download_board(board_id, instance_config_id, sequence_id, source):
sequence_id=sequence_id, sequence_id=sequence_id,
board_id=board_id board_id=board_id
) )
board = source._get(url) board = source.get(url)
if not board.ok: if not board.ok:
raise ConnectionError() raise ConnectionError()
data = board.json() data = board.json()
@ -68,7 +68,7 @@ def get_json(source, url):
if url in cache: if url in cache:
return cache[url] return cache[url]
try: try:
data = source.get_json(url) data = source.get(url).json()
except Exception as e: except Exception as e:
print("exception", e, e.args) # TODO: logging print("exception", e, e.args) # TODO: logging

View File

@ -45,6 +45,12 @@ class Client:
self.download_file(path, filename, **kwargs) self.download_file(path, filename, **kwargs)
return target return target
def login(self):
pass
def list(self):
pass
class BiogamesClient(Client): class BiogamesClient(Client):
config_fields: typing.Dict[str, typing.List[str]] = { config_fields: typing.Dict[str, typing.List[str]] = {
@ -95,7 +101,7 @@ class BiogamesClient(Client):
return self.download_files([i["file_url"] for i in self.list()]) return self.download_files([i["file_url"] for i in self.list()])
CLIENTS: typing.Dict[str, Client] = { CLIENTS: typing.Dict[str, typing.Type[Client]] = {
"Biogames": BiogamesClient, "Biogames": BiogamesClient,
} }