Skip to content
Snippets Groups Projects
Commit b810c228 authored by James Graham's avatar James Graham
Browse files

Refactor data connector plugin selection into DataSource model

parent 8e6d59b0
No related branches found
No related tags found
No related merge requests found
......@@ -8,9 +8,6 @@ from .base import BaseDataConnector
class IoTUK(BaseDataConnector):
name = 'IoTUK'
def __init__(self, url='https://api.iotuk.org.uk/iotOrganisation'):
super().__init__(location=url)
def get_data(self,
dataset: typing.Optional[str] = None,
query_params: typing.Optional[typing.Mapping[str, str]] = None):
......
......@@ -3,6 +3,8 @@ from django.contrib.auth.models import Group
from django.db import models
from django.urls import reverse
from datasources.connectors.base import BaseDataConnector
#: Length of CharFields used to hold the names of objects
MAX_LENGTH_NAME = 63
......@@ -61,6 +63,19 @@ class DataSource(models.Model):
plugin_name = models.CharField(max_length=MAX_LENGTH_NAME,
blank=False, null=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._data_connector = None
@property
def data_connector(self):
if self._data_connector is None:
BaseDataConnector.load_plugins('datasources/connectors')
plugin = BaseDataConnector.get_plugin(self.plugin_name)
self._data_connector = plugin(self.url)
return self._data_connector
def has_view_permission(self, user: settings.AUTH_USER_MODEL) -> bool:
"""
Does a user have permission to use this data source?
......
......@@ -2,7 +2,6 @@ from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from profiles.permissions import OwnerPermissionRequiredMixin
from datasources.connectors.base import BaseDataConnector
from datasources import models
......@@ -39,10 +38,8 @@ class DataSourceQueryView(DetailView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
BaseDataConnector.load_plugins('datasources/connectors')
plugin = BaseDataConnector.get_plugin(self.object.plugin_name)
with plugin('https://api.iotuk.org.uk/iotOrganisation') as connector:
context['results'] = connector.get_data(query_params={'year': 2018})
context['results'] = self.object.data_connector.get_data(
query_params={'year': 2018}
)
return context
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment