Skip to content

Commit

Permalink
[refs #93617] Create a csv import script for DataProviders
Browse files Browse the repository at this point in the history
  • Loading branch information
catalinjitea committed Mar 12, 2018
1 parent 546ff27 commit 171aeb8
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
71 changes: 71 additions & 0 deletions insitu/management/commands/import_data_providers.py
@@ -0,0 +1,71 @@
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
from django.db import transaction
from openpyxl import load_workbook
import re
import sys


from insitu import models as insitu_models
from picklists import models as pickmodels

MODEL_FIELDS = ['name', 'provider_type', 'description', 'countries', 'networks',
'acronym', 'website', 'address', 'phone', 'email', 'contact_person']

DATA_PROVIDER_FIELDS = ['name', 'description', 'countries', 'networks']

DATA_PROVIDER_DETAILS_FIELDS = ['provider_type', 'website', 'address', 'phone',
'email', 'contact_person']

class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('filename', nargs='+', type=str)

def handle(self, *args, **options):
filename = options['filename'][0]
wb = load_workbook(filename=filename)
ws = wb.get_sheet_by_name('Ark1')
with transaction.atomic():
fields = MODEL_FIELDS
for row in ws.iter_rows(min_row=5):
has_network = False
data_provider_details = {}
data_provider = {}
networks = []
countries = []
for i in range(0, len(fields)-1):
field = fields[i]
value = row[i].value if row[i].value is not None else ''
if field in DATA_PROVIDER_DETAILS_FIELDS:
if field == 'provider_type':
provider_type_model = pickmodels.ProviderType.objects.filter(
name=value).first()
data_provider_details[field] = provider_type_model
else:
data_provider_details[field] = value
elif field in DATA_PROVIDER_FIELDS:
if field == 'countries':
country = pickmodels.Country.objects.filter(
name=value).first()
countries.append(country)
elif field == 'networks':
networks_name = re.split(', ', value)
if networks_name != ['']:
has_network = True
for network_name in networks_name:
network = insitu_models.DataProvider.objects.filter(name__iexact=network_name).first()
networks.append(network)
else:
data_provider[field] = value
if has_network:
user_id = get_user_model().objects.get(email='erik.buch@eurogoos.eu').id
data_provider_obj = insitu_models.DataProvider.objects.create(created_by_id=user_id, **data_provider)
data_provider_obj.countries = countries
data_provider_obj.networks = networks
insitu_models.DataProviderDetails.objects.create(data_provider_id=data_provider_obj.id, created_by_id=user_id, **data_provider_details)
else:
print("\nWarning! Data provider", data_provider['name'],
"hasn't been inserted because it doens't have any networks related")
sys.stdout.write('.')
sys.stdout.flush()
print()
20 changes: 20 additions & 0 deletions insitu/migrations/0019_update_data_provider_name.py
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.1 on 2018-03-12 10:35
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('insitu', '0018_remove_mandatory_data'),
]

operations = [
migrations.AlterField(
model_name='dataprovider',
name='name',
field=models.CharField(max_length=255),
),
]
2 changes: 1 addition & 1 deletion insitu/models.py
Expand Up @@ -363,7 +363,7 @@ class DataProvider(ValidationWorkflowModel, SoftDeleteModel):
]
elastic_delete_signal = signals.data_provider_deleted

name = models.CharField(max_length=100)
name = models.CharField(max_length=255)
description = models.TextField(blank=True)
is_network = models.BooleanField(default=False)
networks = models.ManyToManyField('self', blank=True,
Expand Down

0 comments on commit 171aeb8

Please sign in to comment.